安装containerd官方执行程序

基于DNS轮询构建高可用Kubernetes ,由于Kubernetes 1.24移除了Docker支持,改为采用最新的 dockerd 运行时,以下为部署实践

  • 首先停滞 kubelet 并卸载之前安装的Docker相关软件:

sudo systemctl stop kubelet
sudo systemctl stop docker docker.socket
sudo systemctl stop containerd

sudo apt remove docker.io containerd runc
sudo apt autoremove

安装dockerd

安装最新v1.6.6 containerd官方二进制程序
wget https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local containerd-1.6.6-linux-amd64.tar.gz

以上会获得如下执行文件:

bin/containerd-shim
bin/containerd
bin/containerd-shim-runc-v1
bin/containerd-stress
bin/containerd-shim-runc-v2
bin/ctr

备注

对于Kubernetes, containerd 官方发行版执行程序已经包含了支持 Kubernetes CRI功能,已经不再需要早期单独的 cri-containerd-... 程序(旧版本已经废弃)

配置systemd启动脚本

containerd github仓库containerd.service 下载 containerd.service 保存为 /usr/local/lib/systemd/system/containerd.service 并激活:

安装containerd的systemd配置文件
sudo mkdir -p /usr/local/lib/systemd/system
sudo curl https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /usr/local/lib/systemd/system/containerd.service
sudo systemctl daemon-reload
sudo unlink /etc/systemd/system/containerd.service
sudo systemctl enable containerd

这里可能会有报错:

Failed to enable unit: Unit file /etc/systemd/system/containerd.service is masked.

原因是原先有一个软连接指向 /dev/null

/etc/systemd/system/containerd.service -> /dev/null

移除上述空软链接,再次执行激活

安装runc

containerd github仓库runc 下载 runc 存储到 /usr/local/sbin/runc ,然后执行以下命令安装:

安装runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64
sudo install -m 755 runc.amd64 /usr/local/sbin/runc

安装CNI plugins

containernetworking github仓库 下载安装包,然后执行以下命令安装:

安装cni-plugins
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
sudo mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

上述方法也是 How To Setup A Three Node Kubernetes Cluster For CKA: Step By Step 提供的通过containerd内置工具生成默认配置(实际上这个方法是Kubernetes官方文档配置containerd默认网络的方法)

此外,从 containerd安装CNI plugins官方文档 install-cni 脚本中获取生成配置部分(但是该方法不是Kubernetes官方文档推荐,似乎没有成功):

安装containerd CNI plugins脚本 install-cni 生成配置部分
#!/usr/bin/env bash

CNI_CONFIG_DIR=/etc/cni/net.d

cat << EOF | tee $CNI_CONFIG_DIR/10-containerd-net.conflist
{
  "cniVersion": "1.0.0",
  "name": "containerd-net",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni0",
      "isGateway": true,
      "ipMasq": true,
      "promiscMode": true,
      "ipam": {
        "type": "host-local",
        "ranges": [
          [{
            "subnet": "10.88.0.0/16"
          }],
          [{
            "subnet": "2001:4860:4860::/64"
          }]
        ],
        "routes": [
          { "dst": "0.0.0.0/0" },
          { "dst": "::/0" }
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}
EOF

备注

在Kubernetes 1.24之前,CNI plugins可以通过 kubelet 使用 cni-bin-dirnetwork-plugin 命令参数来管理。但是在 Kubernetes 1.24 中,这些参数已经被移除,因为CNI管理已经不属于kubelet范围。

针对不同的 容器运行时(Container Runtimes) ,需要采用不同的方式安装CNI plugins:

创建默认containerd网络配置

  • 执行以下命令创建containerd的默认网络配置:

生成Kuberntes自举所需的默认containerd网络配置
sudo mkdir /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

这个步骤非常重要,实际上生成了能够让容器运行的默认网络,现在这个步骤完全依赖于 containerd 这样的运行时完成,k8s已经移除了配置功能。不过没有这步操作,kubernetes自举 高可用Kubernetes集群kubeadm 无法正常运行容器。

备注

吐槽一下,Kubernetes官方文档真是 “博大精深” ,每个细节可能就是一个关键点,但是真的如同说明书一样味同嚼蜡。

配置 Systemd进程管理器 cgroup驱动

配置containerd的runc使用systemd cgroup驱动
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".containerd]
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          ...
          runtime_type = "io.containerd.runc.v2"
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            ...
            SystemdCgroup = true

参考