前一段时间,由于搭建k8s集群的硬件设备故障,老化导致k8s需要重装。使用原来的kubeadm安装方式却发现装不了了。查了一下官方文档,说从v1.24版本之后,kubelet移除了容器引擎,容器及镜像管理将有第三方工具来接管,也就是说用docker pull下拉下来的镜像,如果不安装第三方插件,将不再能使用!!!官方给推荐的三款容器引擎分别是:containerd、cri-o和cri-dockerd。这三款任意安装一款就行。好像要想继续使用docker原有的镜像及容器管理模式和其最匹配的是安装cri-dockerd。官网首推的是安装containerd组件,然后管理工具用nerdctl,其命令及参数和原来docker的命令一致,只是将docker替换为nerdctl。记住这里用containerd管理,在用docker pull下拉下来的镜像,在kubeadm安装过程中将不被识别,必须用nerdctl pull下拉的镜像才能识别、运行。我姑且把其变化称之为K8S升级吧,其步骤如下:

1、删除老版本的docker、kubelet、containerd

sudo systemctl stop docker
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo groupdel docker
sudo systemctl stop containerd
sudo apt-get purge containerd
sudo systemctl stop kubelet
sudo apt-get purge kubelet kubeadm kubectl
sudo apt autoreomve

2、安装haproxy、keepalived

如果需要做高可用集群话执行此步骤,如果就一台控制节点就忽略此步骤。

这里可以选择在linux上直接安装,也可以启动k8s容器安装,我使用的是前者,其配置和我之前写过的文章中的相关配置一致,在此不做赘述。

3、安装containerd

安装过程中一定要注意安装的版本,不然,可能多个节点安装的版本不一致,组群的时候可能会有奇奇怪怪的问题。

安装containerd  1.7.12-0ubuntu2~20.04.1
//这里安装的是1.7.12-0ubuntu2~20.04.1版本
sudo apt install containerd=1.7.12-0ubuntu2~20.04.1
//默认安装路径/usr/bin/containerd
systemctl status containerd.service 启动路径 /usr/local/bin/containerd
ln -s /usr/bin/containerd /usr/local/bin/containerd
sudo systemctl enable containerd

配置containerd

sudo containerd config dump > /etc/containerd/config.toml
//修改下面两个配置项
SystemdCgroup = true
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
sudo systemctl daemon-reload
sudo systemctl restart containerd

查看containerd是否可以正常启动,可以正常启动进行下一步。

sudo systemctl status containerd

4、安装docker

这里使用的是5:26.1.4-1~ubuntu.20.04~focal版本

sudo apt-get update
sudo apt-get install docker-ce=5:26.1.4-1~ubuntu.20.04~focal
sudo apt-get install docker-ce-cli=5:26.1.4-1~ubuntu.20.04~focal 
sudo apt-get install containerd.io=1.6.33-1

修改docker配置

//修改镜像仓库地址
sudo vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
// Docker 修改为使用 systemd cgroup 驱动
sudo vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd -H fd://
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

sudo docker login --username=*** registry.cn-hangzhou.aliyuncs.com

5、安装nerdctl

安装nerdctl
sudo apt install make
sudo apt install go
git clone https://github.com/containerd/nerdctl.git
cd nerdctl
go test -exec sudo -v ./cmd/nerdctl/...
go mod tidy
make && sudo make install
//查验是否正常安装
sudo nerdctl version

6、安装kubeadm、kubectl、kubelet

安装之前如果是第一台控制节点先检查容器是否正常运行

journalctl -xe |grep containerd
//6443端口是否正常启动,检查正常
nc 127.0.0.1 6443 -v
//Connection to 127.0.0.1 6443 port [tcp/*] succeeded!

添加下载源的授权,这里选择的版本是1.28

sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

检验当前节点已有kubeadm 的1.28相应版本

//sudo apt list -a kubeadm

下载安装

sudo apt-get update
sudo apt install kubeadm=1.28.2-1.1 kubelet=1.28.2-1.1 kubectl=1.28.2-1.1
sudo systemctl enable kubelet
//锁定当前版本
sudo apt-mark hold kubelet kubeadm kubectl
//取消锁定
//sudo apt-mark unhold kubelet kubectl

7、下载必要的安装镜像

执行自编写的两个脚本

#!/bin/bash

for i in `kubeadm config images list --kubernetes-version=v1.28.2`; do
	imageName=${i#registry.k8s.io/}
        ctr images pull registry.aliyuncs.com/google_containers/$imageName
        ctr images tag registry.aliyuncs.com/google_containers/$imageName registry.k8s.io/$imageName
        ctr images rm registry.aliyuncs.com/google_containers/$imageName
done;
#registry.aliyuncs.com/google_containers/coredns:v1.10.1
ctr images pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
ctr images tag registry.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
ctr images del registry.aliyuncs.com/google_containers/coredns:v1.10.1
ctr images pull registry.aliyuncs.com/google_containers/pause:3.9
#!/bin/bash

imageNames=()
imageNames+=(calico/typha:v3.26.4)
imageNames+=(calico/pod2daemon-flexvol:v3.26.4)
imageNames+=(calico/cni:v3.26.4)
imageNames+=(calico/node:v3.26.4)
imageNames+=(calico/kube-controllers:v3.26.4)
imageNames+=(calico/node-driver-registrar:v3.26.4)
imageNames+=(calico/csi:v3.26.4)
imageNames+=(calico/apiserver:v3.26.4)

for i in "${imageNames[@]}"; do
       sudo nerdctl pull quay.io/$i --namespace=k8s.io
       sudo nerdctl tag quay.io/$i docker.io/$i --namespace=k8s.io
       sudo nerdctl rmi quay.io/$i --namespace=k8s.io
done;

8、安装calico

这里可以安装的网络组件可选很多,我这里选用了calico。如果不安装网络组件,使用kubeadm初始化时会报如下错误。

//kubelet.go:2855] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"

具体安装步骤和可选择的组件可参考链接

https://github.com/containernetworking/cni
https://docs.tigera.io/calico/latest/about

9、清除遗留配置信息

sudo kubeadm reset
//按照提示说明,删除相关文件

10、初始化第一个节点,使用kubeadm安装k8s控制节点

写一个配置文件kubeadm-config.yaml,内容如下

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
controlPlaneEndpoint: "10.12.70.130:8443" //这里的10.12.70.130是keepalived的虚拟地址
imageRepository: "registry.aliyuncs.com/google_containers"
networking:
  podSubnet: "22.244.0.0/16"
  serviceSubnet: "22.96.0.0/12"
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

安装

kubeadm init --config=kubeadm-config.yaml

//显示如下内容说明安装正常
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

//验证安装情况

kubectl get node

//反馈结果如下,就说明k8s第一个控制节点安装成功,后续添加节点方法和以前写的安装方法无异,在此不做赘述。
NAME       STATUS   ROLES           AGE    VERSION
k8s70131   Ready    control-plane   4d8h   v1.28.2

安装buildctl (起作用等同docker build)

Containerd 高级命令行工具 nerdctl安装文档_nerdctl 安装-CSDN博客

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐