安装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¶
从 containerd 官方发布 下载最新版本 v1.6.6 :
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
并激活:
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
,然后执行以下命令安装:
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仓库 下载安装包,然后执行以下命令安装:
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官方文档推荐,似乎没有成功):
#!/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-dir
和 network-plugin
命令参数来管理。但是在 Kubernetes 1.24 中,这些参数已经被移除,因为CNI管理已经不属于kubelet范围。
针对不同的 Kubernetes 容器运行时(Container Runtimes) ,需要采用不同的方式安装CNI plugins:
创建默认containerd网络配置¶
执行以下命令创建containerd的默认网络配置:
sudo mkdir /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
这个步骤非常重要,实际上生成了能够让容器运行的默认网络,现在这个步骤完全依赖于 containerd
这样的运行时完成,k8s已经移除了配置功能。不过没有这步操作,kubernetes自举 高可用Kubernetes集群kubeadm 无法正常运行容器。
备注
吐槽一下,Kubernetes官方文档真是 “博大精深” ,每个细节可能就是一个关键点,但是真的如同说明书一样味同嚼蜡。
配置 Systemd进程管理器 cgroup驱动¶
修改
/etc/containerd/config.toml
激活 Systemd进程管理器 cgroup驱动runc
:
[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