k8s切换引擎为containerd

k8s在1.24以前的版本默认引擎为docker
在这里插入图片描述
在未来的 Kubernetes 版本彻底放弃 Docker 支持之前,引入受支持的容器运行时。
除了docker之外,CRI还支持很多容器运行时,例如:
• containerd:containerd与Docker相兼容,相比Docker轻量很多,目前较为成熟
• cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman

切换引擎官方文档链接:k8s切换引擎为containerd

本文中以一台node节点为例,k8s部署相关文档可查看本人的部署文档:k8s部署
也可查看官方的部署文档:kubernetes官方部署文档

一、检查节点使用的容器引擎

通过命令可以看到,三台节点使用的容器引擎均为docker,这里以node2为例,修改容器引擎

~]# kubectl get nodes -o wide
NAME          STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master1   Ready    control-plane,master   16h   v1.23.0   192.168.1.21   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
k8s-node01    Ready    <none>                 16h   v1.23.0   192.168.1.22   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
k8s-node02    Ready    <none>                 16h   v1.23.0   192.168.1.23   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17

二、检查配置

由于我们这块已经安装了docker,在docker中默认会自带containerd,所有不需要再次安装containerd。
检查环境,如果有overlay和netfilter说明已加载

[root@k8s-node02 ~]# lsmod | grep overlay
overlay                91659  22 
[root@k8s-node02 ~]# lsmod | grep netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

如果未加载请执行命令,再检查

[root@k8s-node02 ~]# cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
[root@k8s-node02 ~]# modprobe overlay
[root@k8s-node02 ~]# modprobe br_netfilter

设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。检查sysctl配置中是否有以下三个配置

[root@k8s-node02 ~]# sysctl -a | grep net.bridge.bridge-nf-call
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@k8s-node02 ~]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1

如果没有,则执行以下命令进行配置和生效

[root@k8s-node02 ~]# cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
[root@k8s-node02 ~]# sysctl --system

三、安装containerd

安装了docker默认containerd已安装,该步骤可以省略

[root@k8s-node02 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@k8s-node02 ~]# yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
[root@k8s-node02 ~]# yum install -y containerd.io
[root@k8s-node02 ~]# mkdir -p /etc/containerd

四、修改配置

[root@k8s-node02 ~]# mv /etc/containerd/config.toml /etc/containerd/config.toml-bak   # 备份配置文件
[root@k8s-node02 ~]# containerd config default > /etc/containerd/config.toml   # 生成默认配置文件

修改配置文件/etc/containerd/config.toml
修改镜像源为阿里云(registry.aliyuncs.com/google_containers/pause:3.2)
在这里插入图片描述配置cgroup为systemd
在这里插入图片描述
增加配置

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
 endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]

在这里插入图片描述
重启containerd服务

[root@k8s-node02 ~]# systemctl restart containerd

配置kubelet使用containerd

[root@k8s-node02 ~]# cp -pi /etc/sysconfig/kubelet /etc/sysconfig/kubelet-bak
[root@k8s-node02 ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd

重启kubectl服务

[root@k8s-node02 ~]# systemctl restart kubectl

检查节点的容器引擎,可以看到node2已经切换为containerd容器引擎

[root@k8s-node02 ~]# kubectl get nodes -o wide
NAME          STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master1   Ready    control-plane,master   17h   v1.23.0   192.168.1.21   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
k8s-node01    Ready    <none>                 17h   v1.23.0   192.168.1.22   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
k8s-node02    Ready    <none>                 17h   v1.23.0   192.168.1.23   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.6

配置crictl命令

[root@k8s-node02 ~]# vim /etc/crictl.yaml 
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

使用crictl命令管理容器

[root@k8s-node02 ~]# crictl images
IMAGE                                                TAG                 IMAGE ID            SIZE
docker.io/calico/cni                                 v3.23.3             ecf96bae0aa79       108MB
docker.io/calico/kube-controllers                    v3.23.3             32d39d8db456c       53.8MB
docker.io/calico/node                                v3.23.3             5f5175f39b19e       73.5MB
docker.io/kubernetesui/dashboard                     v2.4.0              72f07539ffb58       67.4MB
docker.io/library/nginx                              latest              605c77e624ddb       56.7MB
registry.aliyuncs.com/google_containers/kube-proxy   v1.23.0             e03484a90585e       39.3MB
registry.aliyuncs.com/google_containers/pause        3.2                 80d28bedfe5de       300kB

crictl命令与docker命令的对照

镜像相关功能	      【Docker】	                 【Containerd】
显示本地镜像列表	docker images       	    crictl images
下载镜像	        docker pull         	    crictl pull
上传镜像	        docker push	                无,例如buildk
删除本地镜像	    docker rmi	                crictl rmi
查看镜像详情	    docker inspect IMAGE-ID	    crictl inspecti IMAGE-ID

容器相关功能	    【Docker】	                  【Containerd】
显示容器列表	    docker ps	                 crictl ps
创建容器	        docker create	             crictl create
启动容器	        docker start	             crictl start
停止容器	        docker stop                  crictl stop
删除容器	        docker rm	                 crictl rm
查看容器详情	    docker inspect	             crictl inspect
附加容器	        docker attach	             crictl attach
执行命令	        docker exec	                 crictl exec
查看日志	        docker logs	                 crictl logs
查看容器资源	    docker stats	             crictl stats

POD 相关功能	     【Docker】	                  【Containerd】
显示 POD 列表	  无	                     crictl pods
查看 POD 详情	  无	                     crictl inspectp
运行 POD	          无	                     crictl runp
停止 POD	          无	                     crictl stopp

切换回docker容器引擎,取消kubelet配置参数即可。

[root@k8s-node02 etc]# cd /etc/sysconfig/
[root@k8s-node02 sysconfig]# mv kubelet kubelet-containerd
[root@k8s-node02 sysconfig]# mv kubelet-bak kubelet
[root@k8s-node02 sysconfig]# systemctl restart kubelet
[root@k8s-node02 sysconfig]# kubectl get nodes -o wide
NAME          STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master1   Ready    control-plane,master   17h   v1.23.0   192.168.1.21   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
k8s-node01    Ready    <none>                 17h   v1.23.0   192.168.1.22   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
k8s-node02    Ready    <none>                 17h   v1.23.0   192.168.1.23   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.17
Logo

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

更多推荐