kubernetes集群集成Kata

环境 : CentOS 8.1 x86_64

kata 2 做了很多优化, 故使用kata 2 版本, 操作系统选用高内核, CentOS 8 (社区CentOS 7只支持kata 1) , 同时操作系统开启 ipv6

一、部署kubernetes

使用 kubespray 部署生产kubernetes集群 , CNI插件使用了kube-ovn

遇到网络问题,需离线下载镜像,以及确保能访问github(github加速)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
images=(
kube-apiserver:v1.18.10
kube-controller-manager:v1.18.10
kube-scheduler:v1.18.10
kube-proxy:v1.18.10
pause:3.2
k8s-dns-node-cache:1.15.13
cluster-proportional-autoscaler-amd64:1.8.1
)

for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

kubernetes部署步骤参考kubespray官网即可略

二、安装kata 2.0
2.1 安装kata 组件

Install the Kata Containers components with the following commands:

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo -E dnf install -y centos-release-advanced-virtualization
$ sudo -E dnf module disable -y virt:rhel
$ source /etc/os-release
$ cat <<EOF | sudo -E tee /etc/yum.repos.d/kata-containers.repo
[kata-containers]
name=Kata Containers
baseurl=http://mirror.centos.org/$contentdir/$releasever/virt/$basearch/kata-containers
enabled=1
gpgcheck=1
skip_if_unavailable=1
EOF
$ sudo -E dnf install -y kata-containers
2.2 检测硬件是否支持 Kata

Kata 对硬件的要求需要满足以下任意条件:

  • Intel VT-x technology.
  • ARM Hyp mode (virtualization extension).
  • IBM Power Systems.
  • IBM Z mainframes.

安装完 kata-runtime 之后,执行检测命令:

1
2
3
4
#kata-runtime kata-check

System is capable of running Kata Containers
System can currently create Kata Containers

这里的输出表示,运行环境支持 Kata Containers 。

2.3 配置集成kubelet
  • 新增配置文件
1
2
3
4
5
mkdir -p  /etc/systemd/system/kubelet.service.d/
cat << EOF | sudo tee /etc/systemd/system/kubelet.service.d/0-containerd.conf
[Service]
Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF
  • 重启生效
1
2
systemctl daemon-reload
systemctl restart kubelet

这里使用的是 containerd 。如果使用 CRI-O ,配置会不一样。

2.5 给 Kubernetes 提供 kata-runtime

通过直接创建 Container 可以使用 kata-runtime 。但在集群中,我们该如何告诉 Kubernetes 哪些负载需要使用 kata-runtime 呢?根据不同的版本,Kata 提供了不同的方式。

首先都需要生成 containerd 配置文件

1
containerd config default > /etc/containerd/config.toml
  • RuntimeClass 的方式

这种方式对相关组件版本有要求:

1
2
3
Kata Containers v1.5.0 or above (including 1.5.0-rc)
Containerd v1.2.0 or above
Kubernetes v1.12.0 or above

我所使用的是

kubernetes: 1.18.10

containerd: 1.2.13

kata : 1.10

在 config.toml 配置文件中,“no_pivot = false”下增加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[plugins.cri.containerd.runtimes]
[plugins.cri.containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v1"
[plugins.cri.containerd.runtimes.runc.options]
NoPivotRoot = false
NoNewKeyring = false
ShimCgroup = ""
IoUid = 0
IoGid = 0
BinaryName = "runc"
Root = ""
CriuPath = ""
SystemdCgroup = false
[plugins.cri.containerd.runtimes.kata]
runtime_type = "io.containerd.kata.v2"
[plugins.cri.containerd.runtimes.katacli]
runtime_type = "io.containerd.runc.v1"
[plugins.cri.containerd.runtimes.katacli.options]
NoPivotRoot = false
NoNewKeyring = false
ShimCgroup = ""
IoUid = 0
IoGid = 0
BinaryName = "/usr/bin/kata-runtime"
Root = ""
CriuPath = ""
SystemdCgroup = false

这里 [plugins.cri.containerd.runtimes.kata] 中的 kata 将被作为 RuntimeClass handler 关键字。

  • 使用 untrusted_workload_runtime 的方式

对于不符合上述版本要求的环境,可以使用之前的方式。

在配置文件中新增如下内容:

1
2
3
[plugins.cri.containerd.untrusted_workload_runtime]
runtime_type = "io.containerd.runtime.v1.linux"
runtime_engine = "/usr/bin/kata-runtime"

最后,都需要重启 containerd。

1
2
#systemctl daemon-reload
#systemctl restart containerd

三、使用kata-runtime

3.1 RuntimeClass 方式
  • 创建 RuntimeClass

kata-runtime.yaml

1
2
3
4
5
kind: RuntimeClass
apiVersion: node.k8s.io/v1beta1
metadata:
name: kata-containers
handler: kata

#kubectl create -f kata-runtime.yaml

也可以为 runc 创建 RuntimeClass

1
2
3
4
kubectl get runtimeclass

NAME CREATED AT
kata-containers 2020-08-30
  • 创建负载 kata-pod.yaml
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: kata-nginx
spec:
runtimeClassName: kata-containers
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

#kubectl apply -f kata-pod.yaml

  • 查看负载
1
kata-runtime list

检查hypervisor是否运行

1
ps axu|grep qemu