背景
来源
containerd(与runc)首次出现在docker1.11中,并在后来从docker中分离出来并开源
containerd实现了docker的主要功能,可以作为一个独立的进程运行容器
发展
docker不兼容CRI(Container Runtime Interface),而containerd开源后反而支持了CRI,可以直接替代docker作为k8s的容器运行时
另一方面,k8s 从v1.20开始逐步废弃docker,并将在v1.24中移除对docker(dockershim)的支持,届时需要把docker切换到containerd,cri-o,rktlet等其他符合CRI规范的容器运行时
k8s对docker的移除已经是板上钉钉的事情了,containerd也逐渐成为docker的替代品
系统架构
与k8s的集成
containerd-shim:负责监视容器的生命周期和重连,与容器一对一(或者与sandbox一对一)
dockershim:docker本身不支持CRI,而k8s的运行时必须满足CRI规范,因此k8s维护了docker-shim作为垫片来兼容docker
cri-containerd:containerd本身也是不支持CRI的,需要通过cri-containerd来兼容CRI,而在containerd v1.1之后,cri-containerd作为插件的形式集成到containerd二进制文件中
命令
ctr --containerd官方cli工具
参考:https://www.mankier.com/8/ctr#run
# 创建容器 ctr containers start redis /containers/redis # 查看容器 ctr containers list ctr --namespace k8s.io containers ls # 删除容器 ctr containers kill xxx # 查看镜像 ctr images list # 拉镜像 ctr images pull image # 打tag ctr images tag souce_image:source_tag target_image:target_tag |
crictl --兼容CRI的容器运行时cli工具
需要在 /etc/crictl.yaml 设置运行时sock文件,命令与docker相似
crictl --runtime-endpoint= "unix:///run/containerd/containerd.sock" ps -a crictl pull busybox crictl images |
使用containerd部署k8s
# 创建containerd配置文件 containerd config default > /etc/containerd/config .toml vi /etc/containerd/config .toml ... [plugins. "io.containerd.grpc.v1.cri" .containerd.runtimes.runc.options] SystemdCgroup = true ...
# 增加kubelet参数 vi /usr/lib/systemd/system/kubelet .service.d /10-kubeadm .conf KUBELET_EXTRA_ARGS= "--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock" systemctl daemon-reload systemctl restart containerd systemctl restart kubelet # kubeadm 的config文件加上下面配置 cat <<EOF > kubeadm-config.yaml apiVersion: kubeadm.k8s.io /v1beta2 clusterName: kubernetes imageRepository: ehub.ctcdn.cn /cpdn kind: ClusterConfiguration kubernetesVersion: v1.18.9 networking: dnsDomain: cluster. local podSubnet: 10.244.0.0 /16 serviceSubnet: 10.96.0.0 /12 --- apiVersion: kubeadm.k8s.io /v1beta2 kind: InitConfiguration nodeRegistration: criSocket: /run/containerd/containerd .sock --- apiVersion: kubelet.config.k8s.io /v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF kubeadm init --config kubeadm-config.yaml # join 要加上 --cri-socket="unix:///run/containerd/containerd.sock", 否则会报错 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? kubeadm join 192.168.0.58:6443 --token ti1zir.rb1vykqocs9dyy7c --discovery-token-ca-cert- hash sha256:ca056c6f12075a4fcc0895acbd6f6fe533938fdf3c3ca6bb3125abaa404a815b --cri-socket= "unix:///run/containerd/containerd.sock" |