<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>containerd | 伪架构师</title>
    <link>/tags/containerd/</link>
      <atom:link href="/tags/containerd/index.xml" rel="self" type="application/rss+xml" />
    <description>containerd</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 30 May 2018 00:41:44 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>containerd</title>
      <link>/tags/containerd/</link>
    </image>
    
    <item>
      <title>Containerd 1.1.0 尝鲜记</title>
      <link>/post/containerd-kubeadm/</link>
      <pubDate>Wed, 30 May 2018 00:41:44 +0800</pubDate>
      <guid>/post/containerd-kubeadm/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;https://blog.fleeto.us/post/kubernetes-containerd-integration-goes-ga/&#34; target=&#34;_blank&#34;&gt;Containerd 1.1.0 的 Kubernetes 支持已经进入可用阶段&lt;/a&gt;，Kubernetes 1.10 和未来的的 Docker 版本都会以此为基础，作为一个熟练软件安装工，自然是要先睹为快了。&lt;/p&gt;

&lt;p&gt;这里使用 Kubeadm 进行测试。&lt;/p&gt;

&lt;h2 id=&#34;环境准备&#34;&gt;环境准备&lt;/h2&gt;

&lt;p&gt;首先进行 Kubeadm 的环境准备：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;安装 libseccomp, conntrack&lt;/li&gt;
&lt;li&gt;关闭防火墙服务&lt;/li&gt;
&lt;li&gt;开启 sysctl：&lt;code&gt;ip_forward&lt;/code&gt;、&lt;code&gt;net.bridge.bridge-nf-call-iptables&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;参考&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/install-kubeadm/&#34; target=&#34;_blank&#34;&gt;官方指南&lt;/a&gt;，安装 kubeadm、kubelet 以及 kubectl，此处暂时不启动 kubelet 服务。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;安装-contaierd&#34;&gt;安装 contaierd&lt;/h2&gt;

&lt;p&gt;下载 &lt;a href=&#34;https://storage.googleapis.com/cri-containerd-release/cri-containerd-1.1.0.linux-amd64.tar.gz&#34; target=&#34;_blank&#34;&gt;cri-containerd 1.1.0&lt;/a&gt;，并解压，其中包含 &lt;code&gt;/usr&lt;/code&gt;、&lt;code&gt;/etc&lt;/code&gt; 以及 &lt;code&gt;opt&lt;/code&gt; 三个目录，这里我们只是用前两个目录的内容，目录结构如下，直接复制即可：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;├── etc
│   ├── crictl.yaml
│   └── systemd
│       └── system
│           └── containerd.service
└── usr
    └── local
        ├── bin
        │   ├── containerd
        │   ├── containerd-release
        │   ├── containerd-shim
        │   ├── containerd-stress
        │   ├── crictl
        │   ├── critest
        │   └── ctr
        └── sbin
            └── runc
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;crictl.yaml&lt;/code&gt;：crictl 的配置文件，缺省包含一行 &lt;code&gt;runtime-endpoint: unix:///run/containerd/containerd.sock&lt;/code&gt;，指定运行时的连接方式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;containerd.service&lt;/code&gt;：服务文件，设置自动启动即可。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctr&lt;/code&gt;：containerd 客户端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crictl&lt;/code&gt;：cri 客户端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;runc&lt;/code&gt;：运行时，contaienrd 依赖项&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里可以发现，并没有包含 containerd 自己的配置文件，可以使用 &lt;code&gt;containerd config default &amp;gt; /etc/containerd/config.toml&lt;/code&gt; 命令，来生成缺省配置文件，然后自行变更。例如可以&lt;a href=&#34;https://github.com/containerd/cri/blob/v1.0.0/docs/registry.md&#34; target=&#34;_blank&#34;&gt;修改仓库镜像地址&lt;/a&gt;。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;另外对国内用户比较重要的一点是，仍然是可以使用环境变量方式的配置来设置 &lt;code&gt;HTTP_PROXY&lt;/code&gt; 以及 &lt;code&gt;NO_PROXY&lt;/code&gt; 的内容。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;配置完成后，使用 &lt;code&gt;systemctl&lt;/code&gt; 启动服务。&lt;/p&gt;

&lt;h2 id=&#34;载入镜像&#34;&gt;载入镜像&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;docker.io/coredns/coredns:1.0.6&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-proxy-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/etcd-amd64&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-apiserver-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-controller-manager-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-proxy-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/kube-scheduler-amd64:v1.10.3&lt;/li&gt;
&lt;li&gt;k8s.gcr.io/pause:3.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ctr 的镜像载入命令&lt;/strong&gt;：&lt;code&gt;ctr cri load image.tar&lt;/code&gt;，似乎不支持 gz。&lt;/p&gt;

&lt;h2 id=&#34;配置-kubelet-使用-containerd&#34;&gt;配置 Kubelet 使用 containerd&lt;/h2&gt;

&lt;p&gt;简单的在 Kubelet 的环境变量上加入如下内容，再启动 Kubelet 服务：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Service]
Environment=&amp;quot;KUBELET_EXTRA_ARGS=--runtime-cgroups=/system.slice/containerd.service --container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;kubeadm-集群安装&#34;&gt;Kubeadm 集群安装&lt;/h2&gt;

&lt;p&gt;这里提供一个简单的初始化命令：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;kubeadm init \
--pod-network-cidr=192.168.0.0/16 \
--feature-gates CoreDNS=true \
--ignore-preflight-errors=Service-Docker \
--ignore-preflight-errors=SystemVerification \
--kubernetes-version=v1.10.3 # 防止 kubeadm 向服务器查询镜像列表。
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kubeadm 缺省情况下依旧是需要检查 Docker 的运行情况的，因此这里我们使用 &lt;code&gt;--ignore-preflight-errors&lt;/code&gt; 开关关闭这项检查。&lt;/p&gt;

&lt;p&gt;Master 初始化结束之后，就可以跟随 kubeadm 指示，进入其他节点，运行 &lt;code&gt;kubeadm join&lt;/code&gt; 命令来加入集群了，加入命令同样需要设置 &lt;code&gt;--ignore-preflight-errors=all&lt;/code&gt; 来规避 Docker 检查。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;接下来可以按照自己喜好安装网络插件了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;可以使用 &lt;code&gt;kubectl describe nodes [node name]&lt;/code&gt; 来检查节点信息：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
Container Runtime Version:  containerd://1.1.0
Kubelet Version:            v1.10.3
Kube-Proxy Version:         v1.10.3
PodCIDR:                     192.168.0.0/24
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里可以看到，运行时已经更新为 &lt;code&gt;containerd://1.1.0&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&#34;后记&#34;&gt;后记&lt;/h2&gt;

&lt;p&gt;正如在前面文章提到的，containerd 并非 Docker 的替代品，只是一个子集，独立使用是很困难的，因此还是比较适合用于 Kubelet 控制之下的容器运行支持。&lt;/p&gt;

&lt;h2 id=&#34;下载链接以及参考链接&#34;&gt;下载链接以及参考链接&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cri-containerd 1.1.0&lt;/strong&gt;：&lt;code&gt;https://storage.googleapis.com/cri-containerd-release/cri-containerd-1.1.0.linux-amd64.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubeadm 安装指南&lt;/strong&gt;：&lt;code&gt;https://kubernetes.io/docs/tasks/tools/install-kubeadm/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;containerd 安装指南&lt;/strong&gt;：&lt;code&gt;https://github.com/containerd/containerd/releases&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containerd 1.1.0 的 Kubernetes 支持已经进入可用阶段&lt;/strong&gt;： &lt;code&gt;https://blog.fleeto.us/post/kubernetes-containerd-integration-goes-ga/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Kubernetes Containerd 集成进入 GA 阶段</title>
      <link>/post/kubernetes-containerd-integration-goes-ga/</link>
      <pubDate>Fri, 25 May 2018 02:09:22 +0800</pubDate>
      <guid>/post/kubernetes-containerd-integration-goes-ga/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://kubernetes.io/blog/2018/05/24/kubernetes-containerd-integration-goes-ga/&#34; target=&#34;_blank&#34;&gt;Kubernetes Containerd Integration Goes GA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作者：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/liu-lantao-96a97351&#34; target=&#34;_blank&#34;&gt;Lantao Liu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.twitter.com/mikebrow&#34; target=&#34;_blank&#34;&gt;Mike Brown&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在之前的博客（&lt;a href=&#34;https://kubernetes.io/blog/2017/11/containerd-container-runtime-options-kubernetes&#34; target=&#34;_blank&#34;&gt;Containerd Brings More Container Runtime Options for Kubernetes&lt;/a&gt;）中，我们介绍了 Kubernetes Containerd 集成的 Alpha 版本。经过六个月的开发，Containerd 的集成现在进入了 GA 阶段，现在可以将 &lt;a href=&#34;https://github.com/containerd/containerd/releases/tag/v1.1.0&#34; target=&#34;_blank&#34;&gt;Containerd 1.1&lt;/a&gt; 作为容器运行时为生产环境的 Kubernetes 提供支撑了。&lt;/p&gt;

&lt;p&gt;Containerd 1.1 支持 Kubernetes 1.10 及以上版本，支持 Kubernetes 的所有特性。目前在 Kubernetes 的测试设施中，Containerd 在 &lt;a href=&#34;https://cloud.google.com/&#34; target=&#34;_blank&#34;&gt;Google 云平台&lt;/a&gt;上的测试覆盖已经和 Docker 集成持平了。（参见：&lt;a href=&#34;https://k8s-testgrid.appspot.com/sig-node-containerd&#34; target=&#34;_blank&#34;&gt;Test Dashboard&lt;/a&gt;）。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;很高兴看到 Containerd 快速成长到今天的这一重要里程碑。阿里云从 Containerd 诞生之初就开始积极的采用 Containerd，开发团队对于简单和健壮的重视，使其完美的运行在我们的无服务器 Kubernetes 产品之中，提供了很好的性能和稳定性。Containerd 无疑将会成为容器世界的核心引擎，并持续创新前行。&lt;/p&gt;

&lt;p&gt;Xinwei，阿里云工程师。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;架构提升&#34;&gt;架构提升&lt;/h2&gt;

&lt;p&gt;Kubernetes 的 Containerd 集成架构有两次重大改进，每一次都让整个体系更加稳定和高效。&lt;/p&gt;

&lt;p&gt;Containerd 1.0 - CRI-Containerd（已终止）&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/cri-containerd.png&#34; alt=&#34;cri-containerd.png&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Containerd 1.0 中，需要一个叫做 cri-containerd 的守护进程，他的功能是提供 Kubelet 和 Containerd 之间的互操作支持。Cri-Containerd 处理来自 Kubelet 的 &lt;a href=&#34;https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/&#34; target=&#34;_blank&#34;&gt;容器运行时接口（CRI）&lt;/a&gt;服务请求，并使用 containerd 来管理容器和容器的镜像。对比之前的 Docker CRI 实现（&lt;a href=&#34;https://github.com/kubernetes/kubernetes/tree/v1.10.2/pkg/kubelet/Dockershim&#34; target=&#34;_blank&#34;&gt;Dockershim&lt;/a&gt;），他清理了整个体系中的一些多余部分。&lt;/p&gt;

&lt;p&gt;然而 Cri-containerd 和 Containerd 1.0 还是两个不同的守护进程，相互之间使用 gRPC 进行通信。额外进程给用户的理解和部署都造成了麻烦，并引入了不必要的通信开支。&lt;/p&gt;

&lt;p&gt;Containerd 1.1 - CRI 插件（目前）&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/containerd.png&#34; alt=&#34;containerd.png&#34; /&gt;&lt;/p&gt;

&lt;p&gt;在 Containerd 1.1 中，Cri-containerd 守护进程进行了重构，成为了 Containerd 的 CRI 插件。CRI 插件处于 Containerd 1.1 内部，缺省启用。和 Cri-containerd 不同，CRI 插件和 Containerd 之间通过直接的程序调用来协同工作。新架构让这一产品更加稳定高效，去除了过程中的 gRPC 开销。用户现在可以直接使用 Containerd 1.1 来支撑 Kubernetes，不再需要 Cri-containerd 守护进程。&lt;/p&gt;

&lt;h2 id=&#34;性能&#34;&gt;性能&lt;/h2&gt;

&lt;p&gt;Containerd 1.1 的一个主要目标就是提高性能。这里的性能主要指的是 Pod 启动延迟以及守护进程的资源使用情况。&lt;/p&gt;

&lt;p&gt;下面的结果是 Containerd 1.1 和 Docker 18.03 CE 之间的对比。Containerd 1.1 集成使用了内置其中的 CRI 插件；Docker 18.03 CE 集成使用的是 Dockershim。&lt;/p&gt;

&lt;p&gt;下面的结果是使用 Kubernetes 节点性能 Benchmark 生成的，这个 Benchmark 工具是 &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/contributors/devel/e2e-node-tests.md&#34; target=&#34;_blank&#34;&gt;Kubernetes 节点端到端测试&lt;/a&gt;的一部分。绝大多数的 Containerd 测试结果都是可以在 &lt;a href=&#34;http://node-perf-dash.k8s.io/&#34; target=&#34;_blank&#34;&gt;节点性能 Dashboard&lt;/a&gt; 上进行公开访问的。&lt;/p&gt;

&lt;h3 id=&#34;pod-启动延迟&#34;&gt;Pod 启动延迟&lt;/h3&gt;

&lt;p&gt;“105 pod batch startup benchmark” 结果显示，相对 Docker 18.03 CE 的 dochershim 集成来说，Containerd 1.1 的集成的延迟时间更短（越低越好）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/latency.png&#34; alt=&#34;latency&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;cpu-和内存&#34;&gt;CPU 和内存&lt;/h2&gt;

&lt;p&gt;在 105 个 Pod 的稳定状态下，Containerd 1.1 集成消耗的 CPU 和内存都比 Docker 18.03 CE 的 Dockershim 集成要少。这个结果和节点上运行的 Pod 数量关系紧密，之所以选择 105 这个数字，是因为这是目前每节点上运行 Pod 的缺省数量上限。&lt;/p&gt;

&lt;p&gt;如下图所示，对比 Docker 18.03 CE 的 Dockershim 集成，Containerd 1.1 集成的 Kubelet CPU 占用降低了 30.89%，容器运行时 CPU 消耗降低了 68.13%，Kubelet 实际使用内存（RSS）降低了 11.30%，容器运行时 RSS 降低了 12.78%。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/cpu.png&#34; alt=&#34;cpu&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/memory.png&#34; alt=&#34;memory&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;crictl&#34;&gt;crictl&lt;/h2&gt;

&lt;p&gt;容器运行时命令行接口（CLI）对系统和应用的排错来说是个有用的工具。如果用 Docker 作为 Kubernetes 的容器运行时，系统管理员有时候需要登录到 Kubernetes 节点上去运行 Docker 命令，以便收集系统和应用的信息。例如使用 &lt;code&gt;docker ps&lt;/code&gt; 和 &lt;code&gt;docker inspect&lt;/code&gt; 检查应用的进程情况，&lt;code&gt;docker images&lt;/code&gt; 列出节点上的镜像，或者 &lt;code&gt;docker info&lt;/code&gt; 来检查容器运行时的配置等。&lt;/p&gt;

&lt;p&gt;对 Containerd 和所有其他的 CRI 兼容的容器运行时，尤其是 Dockershim 来说，我们推荐使用 &lt;code&gt;crictl&lt;/code&gt; 作为 Docker CRI 的继任者，用于 Kubernetes 节点上 pod、容器以及镜像的除错工具。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;crictl&lt;/code&gt; 在 Kubernetes 节点除错方面，提供了类似 Docker CLI 的使用体验， 并且 &lt;code&gt;crictl&lt;/code&gt; 能够支持所有 CRI 兼容的容器运行时。这一项目存放于 &lt;a href=&#34;https://github.com/kubernetes-incubator/cri-tools&#34; target=&#34;_blank&#34;&gt;kubernetes-incubator/cri-tools&lt;/a&gt;，目前版本是 &lt;a href=&#34;https://github.com/kubernetes-incubator/cri-tools/releases/tag/v1.0.0-beta.1&#34; target=&#34;_blank&#34;&gt;v1.0.0-beta.1&lt;/a&gt;。&lt;code&gt;crictl&lt;/code&gt; 的设计目的是理顺 Docker CLI 的功能，为用户提供更好的过渡体验，但是和 Docker CLI 又不尽相同。下面讲讲两者之间的一些重要区别。&lt;/p&gt;

&lt;h3 id=&#34;适用范围-crictl-是一个排错工具&#34;&gt;适用范围：crictl 是一个排错工具&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;crictl&lt;/code&gt; 的设计目的是排错，并非 Docker 或者 kubectl 的替代品。Docker 的 CLI 提供了大量的命令，使之成为重要的开发工具，但是在 Kubernetes 节点排错方面，就不尽人意了。有些 Docker 命令在 Kubernetes 上没什么用，例如 &lt;code&gt;docker network&lt;/code&gt; 和 &lt;code&gt;docker build&lt;/code&gt;；有些甚至会损害系统，比如说 &lt;code&gt;docker rename&lt;/code&gt;，&lt;code&gt;crictl&lt;/code&gt; 提供了刚好够用的命令来进行节点方面的除错工作，对于生产节点来说，明显会有更好的安全性。&lt;/p&gt;

&lt;h3 id=&#34;kubernetes-特性&#34;&gt;Kubernetes 特性&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;crictl&lt;/code&gt; 提供了一个对 Kubernetes 来说更加友好的容器视角。Docker CLI 并不了解 Kubernetes 的概念，例如 &lt;code&gt;pod&lt;/code&gt; 和 &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;namespace&lt;/code&gt;&lt;/a&gt;，所以他无法提供容器和 Pod 的清晰视图。一个例子就是 &lt;code&gt;docker ps&lt;/code&gt; 的混乱输出：过长的 Docker 容器名称、Pause 容器和应用容器混杂在一起：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/docker-ps.png&#34; alt=&#34;docker ps&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.ianlewis.org/en/almighty-pause-container&#34; target=&#34;_blank&#34;&gt;Pause 容器&lt;/a&gt;是一个 Pod 的实现手段，每个 Pod 都会有一个 Pause 容器，所以列出 Pod 中包含的容器的时候，没必要把 Pause 容器显示出来。&lt;/p&gt;

&lt;p&gt;而 &lt;code&gt;crictl&lt;/code&gt; 是为 Kubernetes 设计的，他有不同的一组命令来和 Pod 以及容器进行交互。例如 &lt;code&gt;crictl pods&lt;/code&gt; 会列出 Pod 信息，而 &lt;code&gt;crictl ps&lt;/code&gt; 只会列出应用容器的信息。所有的信息都以表格形式进行展示。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/crictl-pods.png&#34; alt=&#34;!crictl-pods.png&#34; /&gt;&lt;/p&gt;

&lt;p&gt;关于 &lt;code&gt;crictl&lt;/code&gt; 在 containerd 方面的细节，可以参看：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/containerd/cri/blob/master/docs/crictl.md&#34; target=&#34;_blank&#34;&gt;文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://asciinema.org/a/179047&#34; target=&#34;_blank&#34;&gt;演示视频&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;docker-怎么办&#34;&gt;Docker 怎么办？&lt;/h2&gt;

&lt;p&gt;“切换到 Containerd 是不是说我不能再用 Docker Engine 了？”我们经常听到这个问题，简单的答案就是：NO。&lt;/p&gt;

&lt;p&gt;Docker Engine 是在 Containerd 之上构建的。下个版本的 &lt;a href=&#34;https://www.docker.com/community-edition&#34; target=&#34;_blank&#34;&gt;Docker CE&lt;/a&gt; 就会使用 Containerd 1.1。当然，也就会有内置的缺省激活的 CRI 插件。这样一来，用户可以选择继续使用 Docker Engine 来做一些 Docker 的事情，也可以配置 Kubernetes 来使用其中的 Containerd，同时 Containerd 还会同时给同一节点上的 Docker Engine 提供支撑。下面的架构图就描述了 Docker Engine 和 Kubelet 共用 Containerd 的情况：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/docker-ce.png&#34; alt=&#34;docker ce&#34; /&gt;&lt;/p&gt;

&lt;p&gt;既然 Containerd 同时能够给 Kubelet 和 Docker Engine 提供支持，选择了使用 Containerd 集成的用户，得到的不仅仅是新的 Kubernetes 特性、性能和稳定性的增强，他们还会得到保留 Docker Engine 以便用于其他用例的选择。&lt;/p&gt;

&lt;p&gt;Containerd 的&lt;a href=&#34;https://github.com/containerd/containerd/blob/master/docs/namespaces.md&#34; target=&#34;_blank&#34;&gt;命名空间&lt;/a&gt;机制，让 Kubelet 和 Docker Engine 之间无法互相访问对方的容器和镜像。这样就保证了他们无法互相影响，这样的后果：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;docker ps&lt;/code&gt; 命令无法看到 Kubernetes 创建的容器；而应该使用 &lt;code&gt;crictl ps&lt;/code&gt;。反之亦然，用 &lt;code&gt;crictl ps&lt;/code&gt; 也是无法看到 Docker CLI 创建的容器。&lt;code&gt;crictl create&lt;/code&gt; 以及 &lt;code&gt;crictl runp&lt;/code&gt; 命令只用于出错。不推荐在生产节点上手动使用 &lt;code&gt;crictl&lt;/code&gt; 启动 Pod 或者容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker images&lt;/code&gt; 不会看到 Kubernetes 拉回的镜像。同样需要使用 &lt;code&gt;crictl images&lt;/code&gt; 命令。反过来用 &lt;code&gt;docker pull&lt;/code&gt;、&lt;code&gt;docker load&lt;/code&gt; 或者 &lt;code&gt;docker build&lt;/code&gt; 生成的镜像，Kubernetes 也是无法看到的。可以使用 &lt;code&gt;crictl pull&lt;/code&gt; 命令来替代，可以使用 &lt;code&gt;[ctr](https://github.com/containerd/containerd/blob/master/docs/man/ctr.1.md) cri load&lt;/code&gt; 来载入镜像。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Containerd 1.1 天然支持 CRI，可以直接给 Kubernetes 使用。&lt;/li&gt;
&lt;li&gt;Containerd 1.1 满足生产要求。&lt;/li&gt;
&lt;li&gt;Containerd 1.1 在 Pod 启动延迟和系统资源占用方面具有良好的性能表现。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crictl&lt;/code&gt; 是用于和 Containerd 1.1 以及其他 cri 兼容的容器运行时进行操作和节点除错的 CLI 工具。&lt;/li&gt;
&lt;li&gt;下一个 Docker CE 版本会包含 Containerd 1.1。用户有选择继续使用 Docker 来满足 Kubernetes 之外的容器需求，同时让 Kubernetes 使用来自 Docker 的同样的底层容器运行时。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里要感谢来自 Google、IBM、Docker、ZTE、ZJU 以及很多其他的个人，让这一产品发展至今。&lt;/p&gt;

&lt;p&gt;可以阅读 &lt;a href=&#34;https://github.com/containerd/containerd/releases/tag/v1.1.0&#34; target=&#34;_blank&#34;&gt;Release Notes&lt;/a&gt;，来了解 Containerd 1.1 详细的变更情况。&lt;/p&gt;

&lt;h2 id=&#34;尝鲜&#34;&gt;尝鲜&lt;/h2&gt;

&lt;p&gt;要使用 Containerd 作为 Kubernetes 的容器运行时来搭建集群：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/containerd/cri/blob/v1.0.0/docs/kube-up.md&#34; target=&#34;_blank&#34;&gt;在 GCE 上用 kube-up.sh 来启动一个生产级别的集群&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/containerd/cri/blob/v1.0.0/contrib/ansible/README.md&#34; target=&#34;_blank&#34;&gt;使用 Ansible 和 Kubeadm 搭建多节点集群&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在 Google 云从头搭建集群，可以看看 &lt;a href=&#34;https://github.com/kelseyhightower/kubernetes-the-hard-way&#34; target=&#34;_blank&#34;&gt;Kubernetes the Hard Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/containerd/cri/blob/v1.0.0/docs/installation.md&#34; target=&#34;_blank&#34;&gt;从发布压缩包开始自定义安装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/linuxkit/linuxkit/tree/master/projects/kubernetes&#34; target=&#34;_blank&#34;&gt;使用 LinuxKit 在本地虚拟机上安装&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;贡献&#34;&gt;贡献&lt;/h2&gt;

&lt;p&gt;Container CRI 插件是一个开源的 Github 项目，在 Containerd 之内：&lt;a href=&#34;https://github.com/containerd/cri&#34; target=&#34;_blank&#34;&gt;https://github.com/containerd/cri&lt;/a&gt;。我们欢迎任何建议、问题、代码方面的贡献。&lt;a href=&#34;https://github.com/containerd/cri#getting-started-for-developers&#34; target=&#34;_blank&#34;&gt;开发者起步指南&lt;/a&gt;提供了如何成为贡献者方面的入门知识。&lt;/p&gt;

&lt;h2 id=&#34;社区&#34;&gt;社区&lt;/h2&gt;

&lt;p&gt;这个项目的开发和维护是由 Kubernetes SIG-Node 社区和 Containerd 社区联合负责的。我们希望能听到用户的反馈，要加入集群：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34; target=&#34;_blank&#34;&gt;SIG-Node 社区网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Slack：

&lt;ul&gt;
&lt;li&gt;#sig-node，&lt;a href=&#34;http://kubernetes.slack.com&#34; target=&#34;_blank&#34;&gt;kubernetes.slack.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;#containerd, &lt;a href=&#34;https://dockr.ly/community&#34; target=&#34;_blank&#34;&gt;https://dockr.ly/community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;邮件列表：&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34; target=&#34;_blank&#34;&gt;https://groups.google.com/forum/#!forum/kubernetes-sig-node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
