实战-k8s中将容器引擎由docker切换为Containerd-测试成功-2021.8.15
实战:k8s中将容器引擎由docker切换为Containerd(测试成功)-2021.8.15

实验环境
3台node,1个master,2个work node组成的k8s集群,k8s v1.20,docker20.10.7;

实验软件


- 原文档内容





1、配置先决条件
注意:本次all操作都是在node1上操作的!
1#设置开机启动,也会加载的;
2cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
3overlay
4br_netfilter
5EOF
6
7sudo modprobe overlay
8sudo modprobe br_netfilter
9
10# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
11# 说明:其实这些在之前都已经执行过了,且docker启动后,默认就开启了net.ipv4.ip_forward 功能;这些配置也不多,因此我这里就执行下;
12cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
13net.bridge.bridge-nf-call-iptables = 1
14net.ipv4.ip_forward = 1
15net.bridge.bridge-nf-call-ip6tables = 1
16EOF
17
18# Apply sysctl params without reboot
19sudo sysctl --system
- 注意
1[root@k8s-node1 ~]#lsmod |grep overlay
2[root@k8s-node1 ~]#lsmod |grep net
3
4#说明:
5默认情况,操作系统下这2个内核参数默认是开启的;
6overlay
7br_netfilter
8但是,这里建议还是可以配置上,开机后就会自启了;

- 操作过程截图


2、安装containerd
1yum install -y yum-utils device-mapper-persistent-data lvm2 #本次,这里步骤省略,之前配置过
2
3yum-config-manager \
4 --add-repo \
5 https://download.docker.com/linux/centos/docker-ce.repo #本次,这里步骤省略
6
7yum install -y containerd.io
8mkdir -p /etc/containerd
9containerd config default | sudo tee /etc/containerd/config.toml
10systemctl restart containerd
- 说明
1containerd本身就是docker的组件,docker的源中就有containerd软件包;

奇怪:containerd.io默认已经被安装了的。



3、修改配置文件
1•pause镜像设置过阿里云镜像仓库地址
2•cgroups驱动设置为systemd
3•拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
1vi /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2" ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true ... [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"] #这里可以选择填写自己的docker加速器地址 #http://qtid6917.mirror.aliyuncs.com 注意,我这里是http,而老师这里是https,应该不影响的; systemctl restart containerd
- 注意
vi /etc/containerd/config.toml .toml格式(这种格式看起来不太容易理解)


- 过程截图
修改1:pause镜像设置过阿里云镜像仓库地址 (搜索pause)
这是在创建pod时,首先第一个拉起的容器:sandbox


修改2:cgroups驱动设置为systemd (搜索options)


修改点3:拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址(搜索dockre.io)


保存退出。

我们可以用ps命令查看:


4、配置kubelet使用containerd
1vi /etc/sysconfig/kubelet
2KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
3
4systemctl restart kubelet
- 实验过程截图
vi /etc/sysconfig/kubelet



5、验证
在master节点验证:
1kubectl get node -o widek8s-node1 xxx containerd://1.4.4

此时,可以在node1节点把docker给停掉了:奇怪。。??

哎,奇怪。。。老师这边的都可以正常停止docker服务,为什么我这边不行呢??。。。。–>打算问老师了。




这里直接kill行不行:


6、管理容器工具
containerd提供了ctrl命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。 项目地址:https://github.com/kubernetes-sigs/cri-tools/ 设置crictl连接containerd:
1vi /etc/crictl.yaml
2runtime-endpoint: unix:///run/containerd/containerd.sock
3image-endpoint: unix:///run/containerd/containerd.sock
4timeout: 10
5debug: false
1#说明
2注意:在k8s中,我们基本上99%的操作都是在master上用kubectl来完成的;
3但有的时候,不得已,需需要单独进入到某个节点上来,调试下这个容器引擎创建的容器,进到这个容器里面,查看下它的日志;
4这时候,就需要用到例如像crictl这种工具来检查和调试容器。

1VERSION="v1.21.0"
2wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
3sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
4rm -f crictl-$VERSION-linux-amd64.tar.gz




- 设置crictl连接containerd
vi /etc/crictl.yaml #debug是每执行一个crictl的话,就会弹出一些信息,这里比我们将其关掉即可;

- 注意


- 我们可以尝试用下这个crictl命令
显示pod列表
1[root@k8s-node1 ~]#crictl pods

- 这里唯独的问题就是:container不能上传镜像的。
1单独去构建容器镜像这一块的工具还是挺多的,我们可以用这类镜像完成镜像的构建和上传;
2当然用docker也行的;

- 查看容器镜像
1[root@k8s-node1 ~]#crictl images

- 问题:怎么拉取镜像半天都拉取不下来呢?–>要等一段时间的。

- 进入容器及查看日志

- 做一个快照

注意事项
注意:练习完后,建议还切回Docker引擎,就是把kubelet配置参数去掉即可。
1[root@k8s-node1 ~]#vim /etc/sysconfig/kubelet
2KUBELET_EXTRA_ARGS=

- 重启docker

- 重启kubelet
1[root@k8s-node1 ~]#systemctl restart kubelet
- 正常情况下,应该是切过来了
1#master查看
2[root@k8s-master ~]#kubectl get nodes -o wide

总结
问题: 注意:当时搭建k8s集群,安装好docker后,有做k8s和docker之间的配置吗?–没有; 为什么没有配置呢?因为docker是k8s的默认docker引擎,因此不用配置,k8s就会自动去找docker的socket; [root@k8s-master ~]#ll /var/run/docker.sock srw-rw—- 1 root docker 0 Jun 2 00:02 /var/run/docker.sock
如果我们要改成别的容器引擎,那么就需要配置下kubelet与别的容器之间的一个对接了;
其实,就是kubelet和容器引擎之间是有关系的;
装好容器引擎后,再修改下kubelet的一些配置,去连接这个容器引擎(文件封装好的接口:/var/run/docker.sock)就可以了;

