当前位置: 首页 > 科技观察

如何使用 cri-docker 解决 Kubernetes 1.24 不支持 dockershim 的问题

时间:2023-03-21 21:42:07 科技观察

如何使用cri-docker解决Kubernetes1.24不支持dockershimDocker不能再作为Kubernetes的容器运行时,即从Kubernetesv1.24开始不再使用Docker。但是如果想继续使用Docker,可以在Kubelet和Docker之间增加一个中间层cri-docker。cri-docker是一个支持CRI标准的垫片(shim)。一端通过CRI与Kubelet交互,另一端与DockerApi交互,从而间接实现了Kubernetes使用Docker作为容器运行时。但是这种架构的缺点也很明显,调用链较长,效率较低。虽然本文演示了cri-docker的使用,但推荐使用Containerd作为Kubernetes容器运行时。实验环境两台机器,vms41和vms42系统:centos7.4vms41是master,vms42是worker。所有节点的基本设置1.1所有节点都设置/etc/hosts,这样可以互相解析[root@vms4X~]#cat/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6192.168.26.41vms41.rhce.ccvms41192.168.26.42vms42.rhce.ccvms42[root@vms4X~]#1.2关闭所有节点上的交换分区[root@vms4X~]#swapoff-A;sed-i'/fstab/d'/etc/fstab[root@vms4X~]#1.3.在所有节点上更新yum源[root@vms4X~]#rm-rf/etc/yum.repos.d/*;wgetftp://ftp.rhce.cc/k8s/*-P/etc/yum.repos.d/[root@vms4X~]#yumcleanall[root@vms4X~]#1.4在所有节点上安装Docker安装docker-ce在所有节点上。[root@vms4X~]#yuminstalldocker-ce-y在所有节点上启动Docker并设置自动启动[root@vms4X~]#systemctlenabledocker--nowallnodessetDockeracceleratorcat>/etc/docker/daemon.json</etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1net.ipv4.ip_forward=1EOF使以上参数立即生效。[root@vms4X~]#sysctl-p/etc/sysctl.d/k8s.conf[root@vms4X~]#1.7创建cri-docker启动文件启动文件可以从以下链接找到:https://github.com/Mirantis/cri-dockerd/tree/master/packaging/systemd创建cri-docker启动文件:[root@vms41~]#cat/usr/lib/systemd/system/cri-docker.service[Unit]Description=Docker应用程序容器引擎文档的CRI接口=https://docs.mirantis.comAfter=network-online.targetfirewalld.servicedocker.serviceWants=network-online.targetRequires=cri-docker.socket[Service]Type=notifyExecStart=/usr/bin/cri-dockerd--network-plugin=cni--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7ExecReload=/bin/kill-sHUP$MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityDelegate=yesKillMode=process[Install]WantedBy=multi-user.target[root@vms41~]#这里/usr/bin/cri-dockerd必须加上参数---pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7,用于指定使用的pause镜像,否则默认拉k8s.gcr.io/pause:3.6,会导致安装失败创建启动文件:[root@vms41~]#cat/usr/lib/systemd/system/cri-docker.socket[Unit]Description=CRIDockerSocketfortheAPIPartOf=cri-docker.service[Socket]ListenStream=%t/cri-dockerd.sockSocketMode=0660SocketUser=rootSocketGroup=docker[Install]WantedBy=sockets.target[root@vms41~]#1.8复制启动脚本到vms42:[root@vms41~]#scp/usr/lib/systemd/system/cri-docker.socket/usr/lib/systemd/system/cri-docker.servicevms42:/usr/lib/systemd/system/root@vms42的密码:cri-docker.socket100%204103.1KB/s00:00cri-docker.service100%605822.7KB/s00:00[root@vms41~]#启动cri-docker并将其设置为自动启动:[root@vms41~]#systemctldaemon-reload;systemctl启用cri-docker--nowCreated从/etc/systemd/system/multi-user.target.wants/cri-docker.service到/usr/lib/systemd/system/cri-docker.service的符号链接。[root@vms41~]#[root@vms4X~]#systemctlis-activecri-dockeractive[root@vms4X~]#2。安装Kubernetes2.1查看当前源有哪些版本[root@vms41~]#yumlist--showduplicateskubeadm--disableexcludes=本次测试的kubernetes最新版本为v1.24.1,所以这次安装v1.24.1版本2.2,所有节点安装软件包:[root@vms4X~]#yuminstall-ykubelet-1.24.1-0kubeadm-1.24.1-0kubectl-1.24.1-0--disableexcludes=kubernetes[root@vms4X~]#2.3在所有节点上启动Kubelet并设置开机自动启动[root@vms4X~]#systemctl启用kubelet--nowCreated从/etc/systemd/system/multi-user.target.wants/kubelet.service到/usr/lib/systemd/system/kubelet.service的符号链接。[root@vms4X~]#Kubeletstatus此时是激活状态,不是激活状态。[root@vms41~]#systemctlis-activekubeletactivating[root@vms41~]#3.初始化Kubernetes3.1,在master(vms41)上初始化集群[root@vms41~]#kubeadminit--image-repositoryregistry.aliyuncs.com/google_containers--kubernetes-version=v1.24.1--pod-network-cidr=10.244.0.0/16--cri-socket/var/run/cri-dockerd.sock注意需要加上选项--cri-socket/var/run/cri-dockerd.sock按照提示创建一个kubeconfig文件。[root@vms41~]#mkdir-p$HOME/.kube[root@vms41~]#sudocp-i/etc/kubernetes/admin.conf$HOME/.kube/config[root@vms41~]#sudochown$(id-u):$(id-g)$HOME/.kube/config[root@vms41~]#3.2添加worker到集群:[root@vms42~]#kubeadmjoin192.168.26.41:6443--令牌l05cgf.kj5dvy5heki3jixt--discovery-token-ca-cert-hashsha256:07c1765ff4ac6eb2e54ed69fa57ca1afc728e825a6d4a11a83c96ff60ea545cd--cri-socket/var/run/cri-dockerd.sock[et@vmstooheresock,]#Addcoptionsvar/run/cri-dockerd.sock切换到master,查看节点:[root@vms41~]#kubectlgetnodesNAMESTATUSROLESAGEVERSIONvms41.rhce.ccNotReadycontrol-plane4m12sv1.24.1vms42.rhce.ccNotReady13sv1.24.1[root@vms41~]#4。安装Calico4.1,下载最新版本的Calico部署文件[root@vms71~]#wgethttps://docs.projectcalico.org/manifests/calico。yaml4.2修改对应配置,修改calico.yaml,找到CALICO_IPV4POOL_CIDR,修改如下。更改为4.3安装Calico在vms41(master)上安装Calico,在vms42上不需要做任何事情。[root@vms41~]#kubectlapply-fcalico.yaml[root@vms41~]#5.验证5.1在vms41上再次查看节点状态:[root@vms41~]#kubectlgetnodesNAMESTATUSROLESAGEVERSIONvms41.rhce。cc就绪控制平面11mv1.24.1vms42.rhce.cc就绪<无>7m20sv1.24.1[root@vms41~]#[root@vms41~]#kubectlgetnodes-owideNAMESTATUSROLESAGEVERSIONINTERNAL-IPEXTERNAL-IPOS-IMAGEKERNEL-VERSIONCONTAINER-RUNTIMEvms41.rhce.cc就绪控制平面11mv1.24.1192.168.26.41<无>CentOSLinux7(核心)3.10.0-693.el7.x86_64docker://20.10。17vms42.rhce.ccReady7m23sv1.24.1192.168.26.42CentOSLinux7(Core)3.10.0-693.el7.x86_64docker://20.10.17[root@vms41~]#