前一段时间,由于搭建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 dockersudo 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 gpgcurl -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/bashfor i in `kubeadm config images list --kubernetes-version=v1.28.2`; doimageName=${i#registry.k8s.io/}ctr images pull registry.aliyuncs.com/google_containers/$imageNamectr images tag registry.aliyuncs.com/google_containers/$imageName registry.k8s.io/$imageNamectr 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/bashimageNames=()
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[@]}"; dosudo nerdctl pull quay.io/$isudo nerdctl tag quay.io/$i docker.io/$isudo nerdctl rmi quay.io/$i
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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