Установите kubernetes 1.21 с помощью kubeadm

Kubernetes

оригинальная статья

Требования к конфигурации

  • Минимум 2 сервера с 2 ядрами и 4G
  • В этом документе ЦП должен иметь архитектуру x86.
  • CentOS 7.8 или CentOS Stream 8

Установленная версия программного обеспечения

  • Kubernetes v1.21.x
    • calico 3.17.1
    • nginx-ingress 1.9.1
  • Containerd.io 1.4.3

Совместимость с ОС

CentOS-версия Этот документ совместим Примечание
CentOS Stream 8 ? проверено
CentOS 7.8 ? проверено
CentOS 7.7 ? Непроверенный
CentOS 7.6 ? Непроверенный

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

{{< notice success "Container Runtime" >}}

  • Начиная с Kubernetes v1.21, зависимость от docker удалена по умолчанию. Если на хосте установлены docker и containerd, сначала будет использоваться docker в качестве ядра запуска контейнера. Если docker не установлен на хосте, а установлен только containerd, В качестве контейнера для запуска будет использоваться containerd.
  • В этой статье в качестве механизма запуска контейнера используется containerd;

{{< /notice >}}

{{}}

  • Kubeadm — это официально поддерживаемая установка Kubernetes, а «binary» — нет. В этом документе используется инструмент kubeadm, официально рекомендованный kubernetes.io для установки кластера kubernetes.

{{< /notice >}}

проверить центрос/имя хоста

# 在 master 节点和 worker 节点都要执行
cat /etc/redhat-release

# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
# 不能使用 localhost 作为节点的名字
hostname

# 请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64    本安装文档不支持 arm 架构
# CPU(s):       2         CPU 内核数量不能低于 2
lscpu

Изменить имя хоста

# 修改 hostname
hostnamectl set-hostname your-new-host-name
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

Проверьте сеть

Выполнять команды на всех узлах

[root@demo-master-a-1 ~]$ ip route show
default via 172.21.0.1 dev eth0 
169.254.0.0/16 dev eth0 scope link metric 1002 
172.21.0.0/20 dev eth0 proto kernel scope link src 172.21.0.12 

[root@demo-master-a-1 ~]$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:12:a4:1b brd ff:ff:ff:ff:ff:ff
    inet 172.17.216.80/20 brd 172.17.223.255 scope global dynamic eth0
       valid_lft 305741654sec preferred_lft 305741654sec

{{}}

  • ip route showВ команде вы можете узнать сетевую карту машины по умолчанию, обычноeth0, например по умолчанию через 172.21.0.23 dev eth0
  • ip addressВ команде может отображаться IP-адрес сетевой карты по умолчанию, и Kubernetes будет использовать этот IP-адрес для связи с другими узлами в кластере, такими как172.17.216.80
  • IP-адреса, используемые Kubernetes на всех узлах, должны быть совместимы (не требуется сопоставление NAT, групп безопасности или изоляции брандмауэра).

{{< /notice >}}

Установить

{{< notice warning "" >}} Выполните следующий код на всех узлах от имени пользователя root, чтобы установить программное обеспечение:

  • containerd
  • nfs-utils
  • kubectl / kubeadm / kubelet

{{уведомление >}} {{}} {{}}Пожалуйста, замените 1.21.0 в конце скрипта на нужный вам номер версии (должна быть младшая версия 1.21, а не 1.19.1 и т.д.) v1.21.x в середине скрипта не заменять

Пожалуйста, выберите один из образов Docker Hub в соответствии с вашими сетевыми условиями.

  • Четвертая строка — образ докер-хаба Tencent Cloud.
  • Шестая строка — образ докер-хаба DaoCloud.
  • Восьмая строка — образ докер-хаба HUAWEI CLOUD.
  • Десятая строка — образ докер-хаба Alibaba Cloud.
# 在 master 节点和 worker 节点都要执行
# 最后一个参数 1.21.0 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 华为云镜像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/v1.21.x/install_kubelet.sh | sh -s 1.21.0

{{< /tab >}} {{< tab >}} Выполнение следующего кода вручную дает тот же результат, что и экспресс-установка. Замените ${1} в строке 79 скрипта (выделено) на нужный номер версии, например 1.21.0.

Пожалуйста, выберите один из образов Docker Hub в соответствии с вашими сетевыми условиями.

  • Четвертая строка — образ докер-хаба Tencent Cloud.
  • Шестая строка — образ докер-хаба DaoCloud.
  • Восьмая строка — образ докер-хаба Alibaba Cloud.
# 在 master 节点和 worker 节点都要执行
# 最后一个参数 1.21.0 用于指定 kubenetes 版本,支持所有 1.21.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
#!/bin/bash

# 在 master 节点和 worker 节点都要执行

# 安装 containerd
# 参考文档如下
# https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sysctl --system

# 卸载旧版本
yum remove -y containerd.io

# 设置 yum repository
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 containerd
yum install -y containerd.io-1.4.3

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g"  /etc/containerd/config.toml
sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g"  /etc/containerd/config.toml


systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd


# 安装 nfs-utils
# 必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
yum install -y wget

# 关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

# 配置K8S的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 卸载旧版本
yum remove -y kubelet kubeadm kubectl

# 安装kubelet、kubeadm、kubectl
# 将 ${1} 替换为 kubernetes 版本号,例如 1.20.1
yum install -y kubelet-${1} kubeadm-${1} kubectl-${1}

crictl config runtime-endpoint /run/containerd/containerd.sock

# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet

containerd --version
kubelet --version

{{}}
Если вы выполните команду systemctl status kubelet в это время, вы получите сообщение об ошибке, что kubelet не удалось запустить. Пожалуйста, игнорируйте эту ошибку, потому что операция kubeadm init на последующих шагах должна быть завершена, прежде чем kubelet сможет нормально запуститься. {{уведомление >}} {{таб>}} {{табы >}}

Инициализировать главный узел

{{}}

  • APISERVER_NAME не может быть именем хоста мастера
  • APISERVER_NAME должен состоять только из строчных букв, цифр, десятичных точек, без знаков минус.
  • Сегмент сети, используемый POD_SUBNET, не может пересекаться с сегментом сети, в котором расположен главный узел/рабочий узел. Значение этого поля является значением CIDR.Если вы не знакомы с концепцией CIDR, все равно выполните команду export POD_SUBNET=10.100.0.1/16 без изменений.

{{< /notice >}}

{{}} {{}}Пожалуйста, замените 1.21.0 в конце скрипта на нужный вам номер версии (должна быть младшая версия 1.21, а не 1.19.1 и т.д.) v1.21.x в середине скрипта не заменять

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.21.x/init_master.sh | sh -s 1.21.0

{{< /tab >}} {{< tab >}} Выполнение следующего кода вручную дает тот же результат, что и экспресс-установка. Замените ${1} в строке 79 скрипта (выделено) на нужный номер версии, например 1.21.0.

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点的内网IP
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
#!/bin/bash

# 只在 master 节点执行

# 脚本出错时终止执行
set -e

if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
  echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
  echo 当前POD_SUBNET=$POD_SUBNET
  echo 当前APISERVER_NAME=$APISERVER_NAME
  exit 1
fi


# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${1}
imageRepository: registry.aliyuncs.com/k8sxio
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
dns:
  type: CoreDNS
  imageRepository: swr.cn-east-2.myhuaweicloud.com${2}
  imageTag: 1.8.0

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

# kubeadm init
# 根据您服务器网速的情况,您需要等候 3 - 10 分钟
echo ""
echo "抓取镜像,请稍候..."
kubeadm config images pull --config=kubeadm-config.yaml
echo ""
echo "初始化 Master 节点"
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# 安装 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo ""
echo "安装calico-3.17.1"
rm -f calico-3.17.1.yaml
kubectl create -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
wget https://kuboard.cn/install-script/v1.21.x/calico-custom-resources.yaml
sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
kubectl create -f calico-custom-resources.yaml

{{< /tab >}} {{< /tabs >}}

Проверьте результат инициализации мастера

# 只在 master 节点执行

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide

# 查看 master 节点初始化结果
kubectl get nodes -o wide

Инициализировать рабочие узлы

Получить параметры команды соединения

Выполнить на главном узле

# 只在 master 节点执行
kubeadm token create --print-join-command
# 返回如下
kubeadm join apiserver.demo:6443 --token 9ukzcs.qp4ozxbn1knc13sx --discovery-token-ca-cert-hash sha256:0cb945ea0c6329b4df58cf358e2be697fd31a85f55c23d47356f06f69a27283d 

{{}}
Этот токен действителен в течение 2 часов, и в течение 2 часов вы можете использовать этот токен для инициализации любого количества рабочих узлов. {{уведомление >}}

инициализировать работника

Выполнить на всех рабочих узлах

# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token 9ukzcs.qp4ozxbn1knc13sx --discovery-token-ca-cert-hash sha256:0cb945ea0c6329b4df58cf358e2be697fd31a85f55c23d47356f06f69a27283d 

Проверить результат инициализации

Выполнить на главном узле

# 只在 master 节点执行
kubectl get nodes -o wide
# 输出结果如下所示
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   54m   v1.21.0
node1    Ready    <none>                 35m   v1.21.0

Установить контроллер входящего трафика

{{}} {{}}Выполнить на главном узлеВ некоторых случаях вам нужно выполнить следующую команду дважды, чтобы добиться успеха.

# 只在 master 节点执行
kubectl apply -f https://kuboard.cn/install-script/v1.21.x/nginx-ingress.yaml

{{< /tab >}} {{< tab >}} Выполнить на главном узле

Удалите, только если вы хотите выбрать другой Ingress Controller

# 只在 master 节点执行
kubectl delete -f https://kuboard.cn/install-script/v1.21.x/nginx-ingress.yaml

{{< /tab >}} {{< /tabs >}}

Настроить разрешение доменного имени

доменное имяcnsre.cnРазрешить IP-адрес z.z.z.z demo-worker-a-2 (это также может быть адрес y.y.y.y demo-worker-a-1)

Проверить конфигурацию

Доступ в браузереcnsre.cn, вы получите страницу с ошибкой 404 NotFound.оригинальная статья