TIPS之 Kubernetes kata-runtime 集群部署

Kubernetes kata-runtime 集群部署

Posted by 董江 on Wednesday, January 11, 2023

Kubernetes kata-runtime 集群部署

Kata Containers 旨在构建一个安全且与 OCI 兼容的容器运行时,通过使用硬件虚拟化将每个容器工作负载放入轻量级虚拟机中,从而增强容器工作负载的安全性和隔离性。每个虚拟机都运行自己的内核。

最初,英特尔推出了一个项目Clear Containers,旨在通过虚拟化解决容器中的CoW(Copy on Write)安全问题。后来它与 Hyper.sh RunV 项目合并,现在将其称为 Kata Containers。

Kata on Kubernetes

Kubernetes 集群中Node节点,Kubelet 通过CRI容器运行时Interface (例如containerd或cri-o) 与 runC 进行通信,runC负责运行pod 中的容器.

而 在Kata Containers 用于在轻量级 VM kata-runtime中运行容器,为此需要containerd或cri-o。需要一个与 kata 容器兼容的containerd-shim-kata-v2Kata Containers 的运行时类在隔离的内核和命名空间中运行容器。

Kata 容器部署

前提条件

  1. 使用kubeadm、kubectl 和 kubelet引导和安装的 Kubernetes 集群
  2. 容器运行时接口 (CRI) - Containerd或cri-o
  3. Host kernel 开启 kvm 内核模块:qemu-system-x86_64

Kata容器部署

安装Kata Containers,但在集群中安装它的首选方法是通过kata-deploy。这将作为kube-system命名空间内的 pod 运行,并将安装运行 Kata 容器所需的所有二进制文件和工件,以及可用于在运行的 Kubernetes 集群中安装 Kata 容器的 DaemonSet

  1. 为kata-deploy pod创建和提供不同的 RBAC 角色
dongjiang@MacBook Pro:~ $ kubectl apply -f https://raw.githubusercontent.com/kata-containers/kata-containers/main/tools/packaging/kata-deploy/kata-rbac/base/kata-rbac.yaml
  1. 创建一个kata-deploy pod
dongjiang@MacBook Pro:~ $ kubectl apply -f https://raw.githubusercontent.com/kata-containers/kata-containers/main/tools/packaging/kata-deploy/kata-deploy/base/kata-deploy-stable.yaml
  1. 检查命名空间内的kata-deploy pod状态kube-system。
dongjiang@MacBook Pro:~ $ kubectl get pod -A | grep "kata-deploy"
kube-system   kata-deploy-2h42n                                 1/1     Running       0          47h
kube-system   kata-deploy-hqkjm                                 1/1     Running       0          47h
  1. 检查节点上的 Kata-Containers 标签
dongjiang@MacBook Pro:~ $ kubectl get nodes --show-labels | grep kata-runtime
kcs-kata-s-kvbgb   Ready    <none>                 5d20h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=ecloud-compute-6248R-2.0-000400160040,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=SZJD,failure-domain.beta.kubernetes.io/zone=ecloud_compute_c3_zone,katacontainers.io/kata-runtime=true,kcs.topology.csi.ecloud.com/zone=SZJD,kubernetes.io/arch=amd64,kubernetes.io/hostname=kcs-kata-s-kvbgb,kubernetes.io/os=linux,machine.ecloud.cmss.com/machine-name=kata-node-zxnkx,machine.ecloud.cmss.com/machine-type=VM,node.kubernetes.io/cloud=,node.kubernetes.io/instance-type=ecloud-compute-6248R-2.0-000400160040,topology.kubernetes.io/region=SZJD,topology.kubernetes.io/zone=ecloud_compute_c3_zone
kcs-kata-s-pwm44   Ready    <none>                 5d20h   v1.21.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=ecloud-compute-6248R-2.0-000400160040,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=SZJD,failure-domain.beta.kubernetes.io/zone=ecloud_compute_c3_zone,katacontainers.io/kata-runtime=true,kcs.topology.csi.ecloud.com/zone=SZJD,kubernetes.io/arch=amd64,kubernetes.io/hostname=kcs-kata-s-pwm44,kubernetes.io/os=linux,machine.ecloud.cmss.com/machine-name=kata-node-45dkf,machine.ecloud.cmss.com/machine-type=VM,node.kubernetes.io/cloud=,node.kubernetes.io/instance-type=ecloud-compute-6248R-2.0-000400160040,topology.kubernetes.io/region=SZJD,topology.kubernetes.io/zone=ecloud_compute_c3_zone

kata 容器使用

创建运行时

创建 kind:RuntimeClass

kind: RuntimeClass
apiVersion: node.k8s.io/v1
metadata:
    name: kata-qemu
handler: kata-qemu
overhead:
    podFixed:
        memory: "160Mi"
        cpu: "250m"
scheduling:
  nodeSelector:
    katacontainers.io/kata-runtime: "true"

在运行时类pod overhead中定义了容器资源的内存和 CPU 使用限制设置。

部署案例

部署 runtimeClassNamekata-qemu服务

apiVersion: v1
kind: Pod
metadata:
  name: nginx-kata
spec:
  runtimeClassName: kata-qemu
  containers:
  - name: nginx
    image: nginx:latest
dongjiang@MacBook Pro:kubernetes $ kubectl get pod nginx-kata   
NAME         READY   STATUS    RESTARTS   AGE
nginx-kata   1/1     Running   0          53s

dongjiang@MacBook Pro:kubernetes $ kubectl get pod nginx-kata -o jsonpath='{.spec.runtimeClassName}'
kata-qemu

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付