[关闭]
@cdmonkey 2023-08-11T05:53:10.000000Z 字数 8546 阅读 43

Kubernetes 部署-Containerd

Kubernetes


基础设施准备

请参见另一篇文档。

Containerd Install

注意:从 Kubernetes 1.24 开始不再使用 Docker 作为 Runtime,而是选择使用 Containerd。

所有节点均安装 docker-ce-20.10(因为同时将会把 Containerd 安装上。若是只想安装 containerd,则只需要安装 contianerd.io 这个包)无论怎样进行安装,均需要使用 Docker 源。

  1. yum install -y docker-ce-20.10.* docker-ce-cli-20.10.*

无需启动 Docker 服务,只需要配置及启动 Containerd 就行。

配置 containerd

首先配置 Containerd 所需模块(所有节点):

  1. cat <<EOF | tee /etc/modules-load.d/containerd.conf
  2. overlay
  3. br_netfilter
  4. EOF

所有节点载入模块:

  1. modprobe -- overlay
  2. modprobe -- br_netfilter

所有节点配置相关内核参数:

  1. cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
  2. net.bridge.bridge-nf-call-iptables = 1
  3. net.bridge.bridge-nf-call-ip6tables = 1
  4. net.ipv4.ip_forward = 1
  5. EOF

所有节点载入内核参数:

  1. sysctl --system

所有节点配置 Containerd 配置文件(注意文件名后缀,一定是 .toml):

  1. mkdir -pv /etc/containerd
  2. containerd config default | tee /etc/containerd/config.toml

所有节点把 Containerd Cgroup 改为 Systemd:

  1. vim /etc/containerd/config.toml

找出 containerd.runtimes.runc.options 这行(通常是第 96 行),写入 SystemdCgroup = true

所有节点把 sandbox_image Pause 镜像改为符合自己版本之地址:
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6

最后,所有节点启动 Containerd,并配置开机启动:

  1. systemctl daemon-reload && systemctl enable --now containerd

所有节点配置 crictl 客户端工具连接的运行时位置:

  1. cat > /etc/crictl.yaml <<EOF
  2. runtime-endpoint: unix:///run/containerd/containerd.sock
  3. image-endpoint: unix:///run/containerd/containerd.sock
  4. timeout: 10
  5. debug: false
  6. EOF

至此,Containerd 部分安装配置完毕。

Kubernetes Install

首先于 Master01 节点上查看最新 Kubernetes 版本是多少。

  1. yum list kubeadm.x86_64 --showduplicates | sort -r

所有节点均安装 1.23 最新版本 kubeadm、kubelet、kubectl

  1. yum install -y kubeadm-1.23* kubelet-1.23* kubectl-1.23*

若选择的是 Containerd 作为运行时,则需要更改 kubelet 配置:

  1. cat > /etc/sysconfig/kubelet <<EOF
  2. KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
  3. EOF

若是不使用 Containerd 就无需执行上述配置指令。

所有节点设置 Kubeket 开机自启动(因为还没有进行初始化,因而没有 kubelet 配置文件,此时 kubelet 还不能启动)。

  1. systemctl daemon-reload && systemctl enable --now kubelet

肯定不能启动,会有报错,没事不影响。

  1. [root@k8s-master01 ~]# journalctl -r -u kubelet
  2. -- Logs begin at Fri 2021-12-24 15:09:18 CST, end at Tue 2022-02-22 11:21:47 CST. --
  3. Feb 22 11:21:47 k8s-master01 systemd[1]: kubelet.service failed.
  4. Feb 22 11:21:47 k8s-master01 systemd[1]: Unit kubelet.service entered failed state.
  5. Feb 22 11:21:47 k8s-master01 systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE
  6. Feb 22 11:21:47 k8s-master01 kubelet[16164]: E0222 11:21:47.350109 16164 server.go:205] "Failed to load kubelet config file" ...

初始化

初始化操作只需于 Master01 节点上执行就行。

首先创建 kubeadm-config.yaml 配置文件。

  1. [root@k8s-master01 ~]# vim kubeadm-config.yaml

文件内容:

  1. apiVersion: kubeadm.k8s.io/v1beta2
  2. bootstrapTokens:
  3. - groups:
  4. - system:bootstrappers:kubeadm:default-node-token
  5. token: 7t2weq.bjbawausm0jaxury
  6. ttl: 48h0m0s
  7. usages:
  8. - signing
  9. - authentication
  10. kind: InitConfiguration
  11. localAPIEndpoint:
  12. advertiseAddress: 172.16.142.51
  13. bindPort: 6443
  14. nodeRegistration:
  15. criSocket: /run/containerd/containerd.sock
  16. name: k8s-master01
  17. taints:
  18. - effect: NoSchedule
  19. key: node-role.kubernetes.io/master
  20. ---
  21. apiServer:
  22. certSANs:
  23. - 172.16.198.180
  24. timeoutForControlPlane: 4m0s
  25. apiVersion: kubeadm.k8s.io/v1beta2
  26. certificatesDir: /etc/kubernetes/pki
  27. clusterName: kubernetes
  28. controlPlaneEndpoint: 172.16.198.180:16443
  29. controllerManager: {}
  30. dns:
  31. type: CoreDNS
  32. etcd:
  33. local:
  34. dataDir: /var/lib/etcd
  35. imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
  36. kind: ClusterConfiguration
  37. kubernetesVersion: v1.23.4
  38. networking:
  39. dnsDomain: cluster.local
  40. podSubnet: 10.244.0.0/16
  41. serviceSubnet: 192.168.0.0/16
  42. scheduler: {}

更新 kubeadm 文件:

  1. kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

我们就用这个 new.yaml 进行初始化(似乎也没啥变化)。
将这个文件复制至其他 master 节点:

  1. [root@k8s-master01 ~]# for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done # 只是复制过去,无需再进行更改

说明:这个 new.yaml 对于其余两个 master 节点来说,只是用于下载镜像,因而无须担心里面的地址跟本机不同,只要确保 master01 节点上的配置正确就行了。

为了初始化时更为快速,这里推荐所有 master 节点(node 节点无需下载)把镜像提前进行下载。

  1. kubeadm config images pull --config /root/new.yaml

所有节点设置开机自启动 kubelet

  1. systemctl enable --now kubelet # 若启动失败无需理会,初始化成功后即可启动

Init

至此就要真正开始进行初始化操作了。需要于 Master01 节点上执行初始化,初始化后将于 /etc/kubernetes 目录下生成相关证书及配置文件,而后其他 Master 节点加入进来就行了。

  1. kubeadm init --config /root/new.yaml --upload-certs

若初始化失败,重置后再次初始化,命令见下面(没有失败就不需要执行):

  1. kubeadm reset -f; ipvsadm --clear; rm -rf ~/.kube

初始化成功后,将生成 Token 值,用于其他节点加入时使用,因而要记录下这个 Token 值。

注意:Master01 节点需要配置场景变量,用于访问 Kubernetes 集群:

  1. cat <<EOF >> /root/.bashrc
  2. export KUBECONFIG=/etc/kubernetes/admin.conf
  3. EOF
  4. source /root/.bashrc

还可使用初始化完成后推荐使用的操作(总之效果都一样,没啥差别):

否则将有以下这样的报错:

  1. [root@k8s-master01 ~]# kubectl get nodes
  2. The connection to the server localhost:8080 was refused - did you specify the right host or port?

完成后就能成功执行了:

  1. [root@k8s-master01 ~]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master01 NotReady control-plane,master 24m v1.23.4

采用初始化进行安装,所有系统组件均以容器形态运行于 kube-system 命名空间内,这时可查看 Pod 状态:

  1. [root@k8s-master01 ~]# kubectl get pod -n kube-system
  2. NAME READY STATUS RESTARTS AGE
  3. coredns-65c54cc984-kjhpv 0/1 Pending 0 27m
  4. coredns-65c54cc984-vqt46 0/1 Pending 0 27m
  5. etcd-k8s-master01 1/1 Running 0 27m
  6. kube-apiserver-k8s-master01 1/1 Running 0 27m
  7. kube-controller-manager-k8s-master01 1/1 Running 0 27m
  8. kube-proxy-5t8gn 1/1 Running 0 27m
  9. kube-scheduler-k8s-master01 1/1 Running 0 27m

Join

注意,master 节点加入同普通 node 节点有所不同(其实就是多了一个 --control-plane)。

  1. kubeadm join 172.16.198.180:16443 --token 7t2weq.bjbawausm0jaxury \
  2. --discovery-token-ca-cert-hash sha256:1079f2e07ce9eddcdb56cd89f394350d7f76956703becd49723df29c2bd72742 \
  3. --control-plane --certificate-key 6286bc2c552b44f0df8da693f57f0daea59d1f2acacc8d9af153736f8c3b6cef

上面这个命令实际上就是 token create --print-join-command 之输出以及 --control-plane--certificate-key

这里需要注意 Token 及证书过期问题。

最后再把 node 节点纳入进来。

  1. kubeadm join 172.16.198.180:16443 --token 7t2weq.bjbawausm0jaxury \
  2. --discovery-token-ca-cert-hash sha256:1079f2e07ce9eddcdb56cd89f394350d7f76956703becd49723df29c2bd72742

这时查看一下集群状态:

  1. [root@k8s-master01 ~]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master01 NotReady control-plane,master 23h v1.23.4
  4. k8s-master02 NotReady control-plane,master 29m v1.23.4
  5. k8s-master03 NotReady control-plane,master 25s v1.23.4
  6. k8s-node01 NotReady <none> 14m v1.23.4
  7. k8s-node02 NotReady <none> 3s v1.23.4

因为还没有安装 CNI 网络插件,因而状态还是 NotReady。

Calico

Calico 是个 CNI 插件,用于 Pod 间进行跨节点通信之必备部件。

具体操作请参见另一篇文档。


以下步骤只需要于 master01 上执行。

  1. cd /root/k8s-ha-install && git checkout manual-installation-v1.23.x && cd calico/

修改 Pod 网段(只需要改这一个地方):

  1. POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
  2. [root@k8s-master01 calico]# echo $POD_SUBNET
  3. 172.16.0.0/12 # 就是使用这个网段
  4. [root@k8s-master01 calico]# sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml # 执行替换操作

这就改好了:

最后进行安装:

  1. [root@k8s-master01 calico]# kubectl apply -f calico.yaml

Metrics Server

新版 Kubernetes 系统资源采集均使用 Metrics-server,可通过 Metrics 采集节点及 Pod 内存、硬盘、CPU、网络使用率等。

首先将 Master01 节点 front-proxy-ca.crt 拷贝至所有 Node 节点:

  1. scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node01:/etc/kubernetes/pki/front-proxy-ca.crt
  2. scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node02:/etc/kubernetes/pki/front-proxy-ca.crt

若还有更多节点请继续拷贝,总之是所有节点。

Mtrics-server 安装

若是 kubeadm 集群,就使用 kubeadm-metrics-server 目录。


注意:若是使用老师的 yaml 文件,有个地方需要修改(修改证书文件名,否则将部署失败,CrashLoopBackOff,而且连 kubectl logs 指令也不能用,很坑~):

  1. - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem
  2. # 这一行需要改为:
  3. - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt

问题找见,是我进错目录了,但还是要关注下证书名称。


  1. [root@k8s-master01 k8s-ha-install]# kubectl apply -f kubeadm-metrics-server/comp.yaml

查看状态:

  1. [root@k8s-master01 ~]# kubectl get po -n kube-system -l k8s-app=metrics-server
  2. NAME READY STATUS RESTARTS AGE
  3. metrics-server-5cf8885b66-db7jc 1/1 Running 0 5m45s

查看 node 资源使用情况:

  1. [root@k8s-master01 ~]# kubectl top node
  2. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  3. k8s-master01 384m 19% 1682Mi 43%
  4. k8s-master02 293m 14% 1154Mi 30%
  5. k8s-master03 286m 14% 1063Mi 27%
  6. k8s-node01 120m 6% 674Mi 17%
  7. k8s-node02 117m 5% 712Mi 18%
  1. [root@k8s-master01 ~]# kubectl top po -A
  2. NAMESPACE NAME CPU(cores) MEMORY(bytes)
  3. kube-system calico-kube-controllers-6c48db6484-cz6tl 5m 19Mi
  4. kube-system calico-node-85czs 42m 127Mi
  5. kube-system calico-node-9mrd6 54m 126Mi
  6. kube-system calico-node-gn7sb 72m 111Mi
  7. ...

Dashboard

Dashboard 用于展示集群中各类资源,同时也可通过它实时查看 Pod 日志,还能于容器中执行一些命令等。

安装指定版本 Dashboard

  1. [root@k8s-master01 k8s-ha-install]# cd dashboard/
  2. [root@k8s-master01 dashboard]# kubectl create -f .

查看端口号:

  1. [root@k8s-master01 dashboard]# kubectl get svc -n kubernetes-dashboard
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. dashboard-metrics-scraper ClusterIP 192.168.123.148 <none> 8000/TCP 110s
  4. kubernetes-dashboard NodePort 192.168.25.167 <none> 443:30696/TCP 110s

使用这个端口号,通过任意安装了 kube-proxy 之宿主机 IP+端口就能够访问 Dashboard。

然后选择登录途径为令牌(token)。
查看 Token:

  1. kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

把最后面那一长串 token 值输入至令牌后,单击登录就能够访问了。

一些必须的配置更改

把 Kube-proxy 变更为 ipvs,因为于初始化集群时注释了 ipvs 配置,因而需要自行修改。

于 Master01 节点执行:

  1. kubectl edit cm kube-proxy -n kube-system
  2. # 进行修改:
  3. mode: ipvs

更新 Pod:

  1. kubectl patch daemonset kube-proxy \
  2. -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system
  3. # 执行完这个指令后,kube-proxy pod 将全部重启

进行验证:

  1. [root@k8s-master01 ~]# curl 127.0.0.1:10249/proxyMode
  2. ipvs

集群验证


参考内容:

https://blog.frognew.com/2021/12/kubeadm-install-kubernetes-1.23.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注