![](https://img6.php1.cn/3cdc5/982b/bdf/ff97684bdc8bbd94.gif)
前言
Kubernetes宣布在1.20版本弃用docker,选择containerd。然后大量的文章标题是【Kubernetes抛弃了Docker】让很多人产生了疑惑和些许担心。
在开始操作之前,首先我们需要先给docker正名,其实是Kubernetes直接使用containerd创建容器,而不经过docker,但并不能说是抛弃docker,因为containerd的主要贡献者就是docker。containerd是docker贡献给社区的行业标准级的容器运行时项目。
逐个替换Kubernetes Node操作步骤
手工的将一台Kubernetes Node节点,从Docker切换为Containerd需要6个步骤:
1. 将准备操作的节点设置为不可调度。
[root@linux-node1 ~]# kubectl cordon linux-node3.example.com
node/linux-node3.example.com cordoned
[root@linux-node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
linux-node1.example.com Ready master 2d3h v1.19.6
linux-node2.example.com Ready 2d3h v1.19.6
linux-node3.example.com Ready,SchedulingDisabled 2d3h v1.19.6
2. 驱逐该节点上面的所有Pod
[root@linux-node1 ~]# kubectl drain linux-node3.example.com --ignore-daemonsets --delete-local-data
3.停止Docker和Kubelet,并移除Docker安装。
[root@linux-node1 ~]# ssh linux-node3
Last login: Thu Mar 25 06:49:56 2021 from linux-node1
[root@linux-node3 ~]# systemctl stop kubelet docker
[root@linux-node3 ~]# yum remove -y docker-ce docker-ce-cli
4. 创建并修改containerd配置
[root@linux-node3 ~]# mkdir -p etc/containerd
[root@linux-node3 ~]# containerd config default > etc/containerd/config.toml
修改sandbox_image的镜像地址,也就是Pause容器的镜像地址,修改为国内阿里云的地址。
[root@linux-node3 ~]# vim etc/containerd/config.toml
sandbox_image = "k8s.gcr.io/pause:3.2"
修改为:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
5. 修改kubelet的启动参数并重启
[root@linux-node3 ~]# vim etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock"
[root@linux-node3 ~]# systemctl restart containerd kubelet
现在你就可以使用crictl替代docker进行一些基本容器管理,首先创建crictl的配置文件。
[root@linux-node3 ~]# vim etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
使用crictl查看镜像
[root@linux-node3 ~]# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/traefik v1.7.20 96c63a7d3e502 24MB
registry.aliyuncs.com/google_containers/kube-proxy v1.19.6 dbcc366449b06 49.3MB
registry.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5de 300kB
注意:crictl是面向Kubernetes来进行设计的,所以优点是它具备了很多Docker CLI并不具备的功能。
例如crictl还可以查看当前节点上的Pod。
[root@linux-node3 ~]# crictl pod
crictl也可以识别Namespace
[root@linux-node3 ~]# crictl pods --namespace default
crictl并不具备Docker CLI的丰富的命令集,仅用于在Kubernetes Node上做故障排除,如果你需要进行镜像的构建等操作,依然可以在集群外使用Docker CLI进行。
6. 将节点设置为可以调度,并查看验证
[root@linux-node1 ~]# kubectl uncordon linux-node3.example.com
node/linux-node3.example.com uncordoned
[root@linux-node1 ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
linux-node1.example.com Ready master 2d4h v1.19.6 192.168.56.11 <none> CentOS Linux 7 (Core) 3.10.0-1127.18.2.el7.x86_64 docker://19.3.8
linux-node2.example.com Ready <none> 2d3h v1.19.6 192.168.56.12 <none> CentOS Linux 7 (Core) 3.10.0-1127.18.2.el7.x86_64 docker://19.3.8
linux-node3.example.com Ready <none> 2d3h v1.19.6 192.168.56.13 <none> CentOS Linux 7 (Core) 3.10.0-1127.18.2.el7.x86_64 containerd://1.4.4
创建Deployment进行测试:
[root@linux-node1 ~]# kubectl create deploy test-deploy --image nginx:1.14.2 -r 3
deployment.apps/test-deploy created
查看Pod是否可以创建在更换Containerd的Node上,并进行访问测试。
[root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-deploy-587b69c956-hdt4x 1/1 Running 0 41s 10.2.1.38 linux-node2.example.com <none> <none>
test-deploy-587b69c956-lpzvn 1/1 Running 0 41s 10.2.1.37 linux-node2.example.com <none> <none>
test-deploy-587b69c956-mfkp6 1/1 Running 0 41s 10.2.2.37 linux-node3.example.com <none> <none>
在测试环境操作没问题,观察一段时间,接下来就可以在生产环境依次切换各个节点,也可以使用SaltStack、Ansible等工具来完成自动化操作。
- END -
![](https://img6.php1.cn/3cdc5/982b/bdf/866397f1df13dc90.jpeg)
加入新运维社区,开启新征程!
牛人并不可怕,可怕的是牛人比我们还努力!
商务合作请邮件:admin@unixhot.com