0%

Kubernetes加入containerd运行时节点

Kubernetes1.20开始不建议使用docker作为运行时,作为容器运行时,其实还有其他一些:

  • containerd
  • CRI-O

经过对比,我选择了containerd进行验证。这次我并没有升级整体Kubernetes集群,只是打算增加一个使用containerd的容器运行时的节点。

安装containerd

我使用CentOS 7,首先需要设置内核参数,这个和之前Docker一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

然后开始安装,containerd使用yum源和docker-ce相同:

1
2
3
4
# 安装 containerd
## 设置仓库
### 安装所需包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
1
2
3
4
### 新增 Docker 仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
1
2
## 安装 containerd
sudo yum update -y && sudo yum install -y containerd.io

配置containerd

首先获得缺省配置:

1
2
3
# 配置 containerd
sudo mkdir -p /etc/containerd
sudo containerd config default > /etc/containerd/config.toml

因为国内无法访问部分image源,同事docker hub比较慢,修改使用国内镜像:

1
2
3
4
5
6
7
8
9
10
11
vi /etc/containerd/config.toml

# 修改一下内容:
...
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
...
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.mirrors.ustc.edu.cn"]
...
1
2
# 重启 containerd
sudo systemctl restart containerd

加入k8s集群

首先安装k8s,包括kubeadmkubeletkubectl

1
yum install -y kubeadm kubelet kubectl

然后加入到集群:

1
kubeadm join master.k8s:8443 --token xxx     --discovery-token-ca-cert-hash sha256:xxxxxxx

现在已经使用containerd允许时的节点已经加入到集群,部署容器测试可以正常使用。

containerd管理

使用containerd已经不能使用熟悉的docker命令进行容器的管理了,containerd提供了2个工具可以使用:

  • ctr
  • crictl

ctr

ctr是一个简单的命令工具,使用并不复杂,但需要注意:

  • ctr不会使用配置文件/etc/containerd/config.toml,也就是说配置的mirror并不能使用
  • images也有命名空间,k8s会使用一个名为k8s.io的命名空间
  • ctr的参数有顺序,如ctr -n=k8s.io images list正确,而ctr images list -n=k8s.io则不正确

希望未来ctr会更完善一些。

crictl

crictl使用和docker命令类似,比较方便。使用前需要增加配置文件:/etc/crictl.yaml。内容如下:

1
2
3
4
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
坚持原创技术分享,您的支持将鼓励我继续创作!