
【K8S 八】使用containerd作为CRI
虽说要到1.27版本弃用,但是我发现自kubeadm安装部署1.24.2时,配置该参数已经不管用了,直接使用了CRI的默认配置,例如CRI是containerdplugins.plugins."io.containerd.grpc.v1.cri".sandbox_image="k8s.gcr.io/pause3.6"--container-runtime=remote在1.27会被移除,remot
Kubernetes和Docker在容器云生态中霸主地位相争由来已久。其争斗的结果之一:自Kubernetes1.24以后,K8S就不再原生支持docker了,其表现如下:
(看完下面的内容,肯定会感觉没有使用docker方便,但这是趋势,要慢慢适应)
- 启动kubelet会报错
我们都知道containerd来自于docker,后被docker捐献给了云原生计算基金会(Cloud Native Computing Foundation,CNCF)。在RHEL上通过YUM部署containerd的过程中,表现为需要加载docker-ce.repo镜像源。通过在线方式安装的containerd的配置文件只有一个有效配置项:disabled_plugins = ["cri"],这在kubernetes支持docker时倒是没问题,因为kubelet直接调用docker-shim,没必要和containerd直接通讯。这也就是启动kubelet会报错的原因。可以通过下面的命令生成containerd的默认配置文件,然后在此基础上自行修改。
containerd config default > /etc/containerd/config.toml
- --container-runtime-endpoint默认值从unix:///var/run/dockershim.sock改为unix:///var/run/containerd/containerd.sock
所以,后面不管我们使用docker还是containerd,甚至CRI-O作为Container Runtime,都需要关注--container-runtime-endpoint参数,根据需要进行指定。
vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock --node-ip=192.168.11.190,2400:11::190 --pod-infra-container-image=192.168.11.101/kubeadm/pause:3.7"
- --pod-infra-container-image要在1.27移除,从CRI获取sandbox image信息。(默认"k8s.gcr.io/pause:3.7")
虽说要到1.27版本弃用,但是我发现自kubeadm安装部署1.24.2时,配置该参数已经不管用了,使用的是node上CRI默认配置,例如:containerd默认使用的sandbox_image:plugins.plugins."io.containerd.grpc.v1.cri".sandbox_image = "k8s.gcr.io/pause:3.6"
grep sandbox_image /etc/containerd/config.toml
sandbox_image = "192.168.11.101/library/pause:3.7"
- 无法通过/etc/docker/daemon.json指定私有镜像
其实,不只是私有镜像参数的指定,还有cgroupdriver等很多参数的配置都无法通过docker的daemon.json进行指定了,需要在/etc/containerd/config.toml配置文件里配置:
……
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "192.168.11.101/kubeadm/pause:3.7"
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
……
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.11.101".auth]
username = "admin"
password = "密码"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.11.101"]
endpoint = ["http://192.168.11.101"]
- docker pull、push、save、load、exec、run、logs等命令也会被crictl和ctr替换
ctr和containerd一起来自于containerd.io包,crictl来自于cri-tools包,docker的绝大部分命令都可以使用crictl替代,但是该命令很蛋疼的没有crictl push命令,需要ctr来搞定,例如push镜像到harbor中,使用ctr是这样似儿的(并且web方式登录harbor是看不到ctr推送的镜像的):
ctr -n k8s.io images push --user admin:密码 --plain-http=true --platform linux/amd64 192.168.11.101/library/pause:3.7
另外,使用crictl命令还需要配置/etc/crictl.yaml (该文件默认没有,需创建),添加下面的参数
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
否则会报错:
WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
ERRO[0000] unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"
E0705 15:23:06.260611 13731 remote_image.go:121] "ListImages with filter from image service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.ImageService" filter="&ImageFilter{Image:&ImageSpec{Image:,Annotations:map[string]string{},},}"
FATA[0000] listing images: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.ImageService
除了上面这些让我们感受比较大的变动,还有一些:
- --network-plugin=cni在1.24版本被移除
- --cni-conf-dir=/etc/cni/net.d在1.24版本被移除
- --image-pull-progress-deadline=15m在1.24版本被移除
- --container-runtime=remote在1.27会被移除,remote将会是--container-runtime的唯一值(也就是说没有配置的必要了,所以直接移除掉)

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)