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 <
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 <
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
安装了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"]
[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