跳到主要内容

5、实战-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;

实验软件

image-20230910170253454

  • 原文档内容

1、配置先决条件

注意:本次all操作都是在node1上操作的!

#设置开机启动,也会加载的;
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
# 说明:其实这些在之前都已经执行过了,且docker启动后,默认就开启了net.ipv4.ip_forward 功能;这些配置也不多,因此我这里就执行下;
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system
  • 注意
[root@k8s-node1 ~]#lsmod |grep overlay
[root@k8s-node1 ~]#lsmod |grep net

#说明:
默认情况,操作系统下这2个内核参数默认是开启的;
overlay
br_netfilter
但是,这里建议还是可以配置上,开机后就会自启了;

  • 操作过程截图

2、安装containerd

yum install -y yum-utils device-mapper-persistent-data lvm2 #本次,这里步骤省略,之前配置过

yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #本次,这里步骤省略

yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
systemctl restart containerd
  • 说明
containerd本身就是docker的组件,docker的源中就有containerd软件包;

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

3、修改配置文件

•pause镜像设置过阿里云镜像仓库地址
•cgroups驱动设置为systemd
•拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
vi /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

vi /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd

systemctl restart kubelet
  • 实验过程截图

vi /etc/sysconfig/kubelet

5、验证

在master节点验证:

kubectl 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:

vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
#说明
注意:在k8s中,我们基本上99%的操作都是在master上用kubectl来完成的;
但有的时候,不得已,需需要单独进入到某个节点上来,调试下这个容器引擎创建的容器,进到这个容器里面,查看下它的日志;
这时候,就需要用到例如像crictl这种工具来检查和调试容器。

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

  • 设置crictl连接containerd

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

  • 注意

  • 我们可以尝试用下这个crictl命令

显示pod列表

[root@k8s-node1 ~]#crictl pods

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

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

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

  • 进入容器及查看日志

  • 做一个快照

image-20230910170329848

注意事项

注意:练习完后,建议还切回Docker引擎,就是把kubelet配置参数去掉即可。

[root@k8s-node1 ~]#vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=

  • 重启docker

  • 重启kubelet
[root@k8s-node1 ~]#systemctl restart kubelet
  • 正常情况下,应该是切过来了
#master查看
[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)就可以了;