Katacontainers与Docker和Kubernetes 的集成

Katacontainer 是 OpenStack 基金会于 2017 KubeCon 峰会上正式发布,在2018年5月份 OpenStack 温哥华峰会上对外发布1.0版本,并且在那届峰会上还有好几个关于 katacontainer 的演讲。我对 KataContainers 的具体实现原理不清楚,只知道它是一个轻量虚拟机实现,可以无缝地与容器生态系统(实现 OCI 接口)进行集成。

katacontainer(包括 Google 的 gVisor)的主要优势是能够对接遗留系统以及提供比传统容器更好的安全性。我在本文后面的实验也可以证明,katacontainer 可以与传统的 runc 并存,为不同性质的应用负载提供了强大的灵活性。

本文不讲原理,而主要是动手实践。

.1. 安装 Kata Container

在 ubuntu 16.04上:

验证安装:

.2. 与 Docker 集成

本文假设你已经安装了 docker。配置 docker,增加对 kata runtime 的支持。

Docker 默认使用 runc 创建容器,可以使用 指定使用其他的 runtime。下面我们创建两个容器,一个使用 kata runtime,另一个使用默认的 runc。创建完容器之后,我们可以查看一下 kata container 的一些信息。

.3. 与 K8S 集成

实际上,kata 不直接与 k8s 通信,因为对于 k8s 来说,它只跟实现了 CRI 接口的容器管理进程打交道,比如 docker-engine,rkt, containerd(使用 cri plugin) 或 CRI-O,而 kata 跟 runc 是同一个级别的进程。所以如果要与 k8s 集成,则需要安装 CRI-O 或 CRI-containerd 来支持 CRI 接口,本文使用 CRI-O。CRI-O 的 O 的意思是 OCI-compatible,即 CRI-O 是实现 CRI 接口来跑 OCI 容器的。

这里(https://www.katacoda.com/courses/kubernetes/getting-started-with-kubeadm-crio) 有关于如何使用 kubeadm 安装使用 CRI-O 的 k8s 集群的教程。

.3.1 安装配置 CRI-O

.3.2 初始化 K8S 集群

假设你已经在 host 上安装了 kubelet(但还没有开始安装整个 k8s 集群),前几个步骤安装配置了 runc, cri-o 和 cni,接下来就需要告诉 kubelet 使用 cri-o (而不是 docker) 创建 pod 中的容器。

准备初始化 k8s:

命令执行成功后,因为系统中没有配置 CNI plugin 所以你会发现 dns pod 一直是 pending。下面安装 Calico,Calico 安装完后一定要重启 cri-o 和 kubelet 服务。此外,目前我们只有一个 master 节点,为了实验目的,我不打算再添加 worker 节点,我们只要允许 master 上可以创建 pod 就行:

等待一段时间,知道使用 kubectl 命令查看系统 pod 全部 running:

可以使用 查看系统创建的镜像和容器,因为我们没有用 docker,所以不能用以前常用的 docker 命令了。虽然不能用 docker,但可以使用 命令查看容器

因为我们配置 cri 默认使用 runc 创建容器,所以使用 命令应该看不到任何容器:

.3.3 测试 pod 操作

为了创建 kata 容器,需要指定 pod 的 annotation: ,如果不定义这个 annotation 或配置为 true,则 cri-o 会使用 runc 创建。

.3.4 测试 Network Policy

虽然现在已经能够调用 kata 创建 pod,但我最担心的还是 kata 跟网络或存储的集成。所以再测试一下安装 calico 后的 network policy 的功能。

默认情况下,系统中所有 pod 是互通的,所以我们先创建一个普通 pod(使用 runc),在 pod 里面访问之前创建的 service:

其中 和 是之前创建的 deployment 中的两个 pod 的 IP 地址。这里虽然我们使用不同的 runtime 创建容器,但默认情况,网络是互通的。

创建 network policy 禁用 pod 之间的网络:

这时在 curl-client pod 里已经不能访问 service 和 pod 了,说明 network policy 生效。

再创建一个 network policy 允许 curl-client pod 访问:

然后你会发现 curl-client pod 里又可以成功访问 service 和 pod 了。

.参考文档

https://github.com/kata-containers/documentation/blob/master/Developer-Guide.md

https://github.com/kata-containers/documentation/blob/master/architecture.md

https://github.com/kubernetes-incubator/cri-o/blob/master/tutorial.md

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180720G0LUH600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券