文章目录

  • 1. 开启节点维护
  • 1.1 将节点设置成不可调度
  • 1.2 驱逐节点上的 Pod
  • 1.3 停止相关服务
  • 2. 升级到 containerd
  • 2.1 安装 containerd
  • 2.2 调整 containerd 配置
  • 2.3 修改 kubelet 启动配置参数
  • 3. 重启节点服务
  • 4. 验证升级后的节点
  • 5. 容器管理工具
  • 5.1 容器管理命令行工具对比
  • 5.2 crictl 命令行工具安装
  • 6. 总结


1. 开启节点维护

  开启节点维护,目的是将待维护节点上通过 Deployment 部署的 Pod 驱离该节点,使其在另外的正常节点上运行,从而保障服务的连续性。但是如果我们服务的实例个数是1时,当服务被驱离时,服务将会中断,服务的连续性将无法得到保障,需要等待服务在另外的节点上运行启动后,服务才能恢复。所以,生产环境为了不影响正常的业务运行,最好能够将服务的实例数最小设置2个实例。

1.1 将节点设置成不可调度

kubectl cordon k8s-node1

  查看节点的状态是否被设置成了不可调度状态

Docker Desktop k8s教程 k8s docker container_Pod


  如上图 k8s-node1 节点已经被设置成了不可调度状态。

1.2 驱逐节点上的 Pod

kubectl drain k8s-node1 --ignore-daemonsets

Docker Desktop k8s教程 k8s docker container_kubernetes_02


  执行完上述命令后,k8s-node1 节点上除了 daemon set 启动的 Pod 外,通过 deployment 启动的 Pod 都会被驱离到其他可调度的节点上重新启动。

  通过将待升级的节点设置成维护模式,从而保障业务服务能够在集群升级过程中正常的提供服务。

1.3 停止相关服务

systemctl stop kubelet
systemctl stop containerd
systemctl disable docker
systemctl stop docker
systemctl disable cri-docker
systemctl stop cri-docker

2. 升级到 containerd

2.1 安装 containerd

  • 卸载 docker 相关功能
yum remove docker docker-client ocker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine docker-ce
  • 安装或升级 containerd 服务
yum install containerd

2.2 调整 containerd 配置

  • 导出默认配置
containerd config default > /etc/containerd/config.toml
  • 编辑 /etc/containerd/config.toml 文件
sandbox_image = "registry.k8s.io/pause:3.6"
    
    替换成
    
    sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        SystemdCgroup = false
        
	替换成
	
	[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        SystemdCgroup = true

添加国内镜像仓库,这个非常关键,否则将会导致镜像下载失败,Pod中服务无法启动。

[plugins."io.containerd.grpc.v1.cri".registry]
      ......
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
      
      在containerd 配置文件中找到上边内容,并在此处添加下边两行, 注意缩进,下边两行内容与上边一行有2个空格的缩进,下边两行内容之间也存在2个空格的缩进。
      
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"]

2.3 修改 kubelet 启动配置参数

  在 kubelet 启动文件中添加或修改下边两个变量的参数值

--container-runtime=remote 
--container-runtime-endpoint=unix:///run/containerd/containerd.sock

3. 重启节点服务

  • 重启 containerd 服务
systemctl daemon-reload 
systemctl enable containerd
systemctl start containerd
  • 查看 containerd 服务启动状态
systemctl status containerd

Docker Desktop k8s教程 k8s docker container_运维_03

  • 重新启动 kubelet
systemctl start kubelet
  • 查看 kubelet 服务状态
systemctl status kubelet

Docker Desktop k8s教程 k8s docker container_kubernetes_04

  • 取消节点维护状态
kubectl uncordon k8s-node1
  • 查看节点信息
kubectl get nodes -o wide

Docker Desktop k8s教程 k8s docker container_Pod_05


  如上图中 k8s-node1 节点已经变成 Ready 状态,并且 CONTAINER-RUNTIME 已经变成了 containerd://1.6.18。表示 k8s-node1 节点已经从 docker 容器切换成 containerd 容器。

4. 验证升级后的节点

  如果 calico-node 采用 daemon set 的方式部署,那么当k8s节点升级 containerd 容器运行时后,重启 containerd 和 kubelet 之后,calico-node 将会在升级后的节点上重新运行,可通过查看升级后节点是否成功启动 calico-node 的Pod来判断节点是否升级成功。

Docker Desktop k8s教程 k8s docker container_运维_06

  如上图所示,k8s-node1 节点上的 calico cni Pod 正在自动部署。如下图所示,k8s-node1 节点上的 calico-node Pod已经成功运行起来。

Docker Desktop k8s教程 k8s docker container_ico_07

5. 容器管理工具

5.1 容器管理命令行工具对比

功能

docker

ctr

crictl

查看容器列表

docker ps

ctr -n k8s.io c ls

crictl ps

容器内执行命令

docker exec

-

crictl exec

挂载容器

docker attach

-

crictl attach

拉取镜像

docker pull

ctr -n k8s.io i pull

crictl pull

推送镜像

docker push

ctr -n k8s.io i push

-

删除镜像

docker rmi

-

crictl rmi

  使用 containerd 替代 docker 作为 k8s 的容器运行时之后,docker 命令行工具需要通过 ctrcrictl 来替换。ctr 是 containerd 提供的容器管理命令行工具,但是 ctr 相较于 crictl 功能相对较弱,所以,当 docker 切换到 containerd 之后,建议使用 crictl 命令行工具来管理容器,使用 crictl 命令行工具需要另行安装。

  containerd 存储 k8s 相关的数据在 k8s.io 空间中,默认情况下使用 ctr 操作的是 default 空间的数据。所以,如果想要在 k8s 中使用 containerd default 空间的数据,可以将 default 空间中的镜像导出,然后导入到 k8s.io 空间。

  • 导出 default 空间中的镜像,例如导出 calico cni 镜像
ctr -n default images export --platform=linux/amd64 cni.tar.gz docker.io/calico/cni:v3.24.5
  • 导入 calico cni 镜像到 k8s.io 空间
ctr -n k8s.io i import cni.tar.gz

5.2 crictl 命令行工具安装

  • crictl 源码地址
https://github.com/kubernetes-sigs/cri-tools/releases
  • 下载 Linux x64 版本工具
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.0/crictl-v1.26.0-linux-amd64.tar.gz
  • 解压并安装
tar -zxvf crictl-v1.26.0-linux-amd64.tar.gz -C /usr/local/bin
  • 配置crictl参数
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

  将会生成 /etc/crictl.yaml 配置文件。到此 crictl 命令行工具安装完成,以前通过 docker 命令操作的指令,后续可以使用 crictl 执行。

6. 总结

  • 将 docker 容器运行时替换成 containerd 时,可以逐个节点进行替换,这样能够保证服务的连续性。
  • 使用 containerd 替换 docker 后,对于 k8s 1.20 以后的版本,不再需要 cri-docker 服务对 docker 容器运行时进行中转。
  • k8s 集群相关组件,只需要修改 kubelet 启动参数,不需要调整 kube-apiserver,kube-scheduler,kube-controller-manager,kube-proxy等组件。