作者 | 易立  阿里云资深技术专家

containerd 是一个开源的行业标准容器运行时,关注于简单、稳定和可移植,同时支持 Linux 和 Windows。

1_jpeg

  • 2016 年 12 月 14 日,Docker 公司宣布将 Docker Engine 的核心组件 containerd 捐赠到一个新的开源社区独立发展和运营。阿里云、AWS、 Google、IBM 和 Microsoft 作为初始成员,共同建设 containerd 社区;

  • 2017 年 3 月,Docker 将 containerd 捐献给 CNCF(云原生计算基金会)。containerd 得到了快速的发展和广泛的支持;

  • Docker 引擎已经将 containerd 作为容器生命周期管理的基础,Kubernetes 也在 2018 年 5 月,正式支持 containerd 作为容器运行时管理器;

  • 2019 年 2 月,CNCF 宣布 containerd 毕业,成为生产可用的项目。

containerd 从 1.1 版本开始就已经内置了 Container Runtime Interface (CRI) 支持,进一步简化了对 Kubernetes 的支持。其架构图如下:

2_jpeg

在 Kubernetes 场景下,containerd 与完整 Docker Engine 相比,具有更少的资源占用和更快的启动速度。

3_jpeg

4_jpeg

图片来源:

图片来源:

在 Kubernetes 环境中,可以用不同的 API 和命令行工具来管理容器 / Pod、镜像等概念。为了便于大家理解,我们可以用下图说明如何利用不同层次的 API 和 CLI 管理容器生命周期管理。

7_jpeg

体验

Minikube 是体验 containerd 作为 Kubernetes 容器运行时的最简单方式,我们下面将其作为 Kubernetes 容器运行时,并支持 runc 和 gvisor 两种不同的实现。

早期由于网络访问原因,很多朋友无法直接使用官方 Minikube 进行实验。在最新的 Minikube 1.5 版本中,已经提供了完善的配置化方式,可以帮助大家利用阿里云的镜像地址来获取所需 Docker 镜像和配置,同时支持 Docker/Containerd 等不同容器运行时。我们创建一个 Minikube 虚拟机环境,注意需要指明 --container-runtime=containerd 参数设置 containerd 作为容器运行时。同时 registry-mirror 也要替换成自己的阿里云镜像加速地址。

$ minikube start --image-mirror-country cn \     --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.0.iso \     --registry-mirror=https://XXX.mirror.aliyuncs.com \     --container-runtime=containerd   Darwin 10.14.6 上的 minikube v1.5.0   Automatically selected the 'hyperkit' driver (alternates: [virtualbox]) ️  您所在位置的已知存储库都无法访问。正在将 registry.cn-hangzhou.aliyuncs.com/google_containers 用作后备存储库。   正在创建 hyperkit 虚拟机(CPUs=2Memory=2000MB, Disk=20000MB)... ️  VM is unable to connect to the selected image repository: command failed: curl -sS https://k8s.gcr.io/ stdout: stderr: curl: (7) Failed to connect to k8s.gcr.io port 443: Connection timed out : Process exited with status 7   正在 containerd 1.2.8 中准备 Kubernetes v1.16.2…   拉取镜像 ...   正在启动 Kubernetes ... ⌛  Waiting for: apiserver etcd scheduler controller   完成!kubectl 已经配置至 "minikube" $ minikube dashboard   Verifying dashboard health ...   Launching proxy ...   Verifying proxy health ...   Opening http://127.0.0.1:54438/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

部署测试应用

我们通过 Pod 部署一个 nginx 应用:

$ cat nginx.yaml apiVersion: v1 kind: Pod metadata:   name: nginx spec:   containers:   - name: nginx     image: nginx $ kubectl apply -f nginx.yaml pod/nginx created $ kubectl exec