• 【K8S 八】使用containerd作为CRI


    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参数,根据需要进行指定。

    • --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"

    • 无法通过/etc/docker/daemon.json指定私有镜像

    其实,不只是私有镜像参数的指定,还有cgroupdriver等很多参数的配置都无法通过docker的daemon.json进行指定了,需要在/etc/containerd/config.toml配置文件里配置:

    1. ……
    2. SystemdCgroup = true
    3. ……
    4. [plugins."io.containerd.grpc.v1.cri".registry.configs]
    5. [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.11.101".auth]
    6. username = "admin"
    7. password = "密码"
    8. [plugins."io.containerd.grpc.v1.cri".registry.headers]
    9. [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    10. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    11. endpoint = ["https://registry-1.docker.io"]
    12. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.11.101"]
    13. 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 (该文件默认没有,需创建),添加下面的参数

    1. runtime-endpoint: unix:///var/run/containerd/containerd.sock
    2. image-endpoint: unix:///var/run/containerd/containerd.sock
    3. timeout: 10
    4. 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的唯一值(也就是说没有配置的必要了,所以直接移除掉)
  • 相关阅读:
    FreeRTOS 事件标志组 详解
    想要精通算法和SQL的成长之路 - 课程表III
    nacos命名空间的配置
    AI应用开发之路-准备:发起一个开源小项目 DashScope SDK for .NET
    知网是如何判断论文重复的?
    网站监控的重要性
    华清远见(上海中心)22071
    web前端——HTML(一看就会写自己的小网页)
    java计算机毕业设计猫咪伤患会诊复查医疗平台源码+系统+mysql数据库+lw文档
    KeyTool生成证书链及使用
  • 原文地址:https://blog.csdn.net/avatar_2009/article/details/126020671