Kubernetes和Docker在容器云生态中霸主地位相争由来已久。其争斗的结果之一:自Kubernetes1.24以后,K8S就不再原生支持docker了(),其表现如下:
(看完下面的内容,肯定会感觉没有使用docker方便,但这是趋势,要慢慢适应)
我们都知道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
所以,后面不管我们使用docker还是containerd,甚至CRI-O作为Container Runtime,都需要关注--container-runtime-endpoint参数,根据需要进行指定。
虽说要到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"
其实,不只是私有镜像参数的指定,还有cgroupdriver等很多参数的配置都无法通过docker的daemon.json进行指定了,需要在/etc/containerd/config.toml配置文件里配置:
- ……
- 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"]
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
除了上面这些让我们感受比较大的变动,还有一些: