Kata部署指南
简介
Kata Containers是一个开源的容器运行时项目,旨在将容器的轻量级特性与虚拟机的安全性隔离优势相结合。Kata Containers通过为每个Pod或容器启动一个轻量级虚拟机(VM),利用硬件虚拟化技术(如KVM)提供强隔离,同时兼容OCI(Open Container Initiative)和Kubernetes容器编排生态。本文档基于鲲鹏ARM架构环境,指导用户完成Kata Containers的安装、配置及验证,并结合Nydus镜像加速方案实现高效的容器镜像分发。
约束与限制
- 本文档仅适用于**AArch64(ARM64)**架构,基于鲲鹏920新型号处理器和鲲鹏950处理器验证,不适用于x86_64架构。
- Kata Containers使用Cloud-Hypervisor(CLH)作为虚拟机管理器,需要宿主机支持硬件虚拟化(KVM)。请确认宿主机内核已启用KVM模块(
ls /dev/kvm)。 - 单节点并发运行大量Kata沙箱(如1000+)时,对宿主机的内存、文件描述符、PID数量等系统资源消耗极大,需按本文档千级沙箱并发调优章节进行调整。
- Nydus镜像加速依赖远程Registry服务的网络连通性,请确保集群节点可访问配置的镜像仓库地址。
- Kata运行时中的Pod默认使用独立网络命名空间,HostPID等共享宿主机命名空间特性可能受限或不支持;本文千级Kata容器启动部署实例为减少网络插件限制影响,使用hostNetwork仅用于并发启动验证。
- 部分Kubernetes特性(如Privileged特权模式、某些Device Plugin)在Kata运行时中可能受限或不支持。
应用场景
- 多租户隔离:在云平台或PaaS服务中,不同租户的工作负载需要强安全隔离。Kata Containers通过虚拟机级隔离防止租户间的侧信道攻击和资源逃逸。
- 不可信工作负载运行:对于来源不可信或安全性要求较高的容器镜像(如第三方提交的代码执行环境),使用Kata Containers可将攻击面限制在虚拟机内部。
- 安全合规场景:金融、政务等行业对容器隔离有严格合规要求,Kata Containers提供的硬件级隔离能够满足更高的安全标准。
- AI/代码沙箱:结合Nydus镜像加速,适用于AI Agent代码执行沙箱等需要快速启动、强隔离的临时运行环境。
软件安装
环境要求
本文基于特定环境提供指导,在正式操作前请确保软硬件均满足要求。
表1 硬件要求
项目 |
说明 |
|---|---|
处理器 |
鲲鹏920新型号处理器、鲲鹏950处理器 |
表2 操作系统和软件要求
项目 |
版本 |
获取方法 |
|---|---|---|
OS |
openEuler 24.03 LTS SP3 |
|
Kubernetes |
1.28.14 |
|
Containerd |
1.7.27 |
|
Kata Containers |
3.27.0 |
|
Nydus |
2.4.0 |
|
Nydus Snapshotter |
0.15.12 |
|
Nerdctl |
1.7.5 |
安装Kata及配置
本章节主要提供Kata安装以及使能相关配置。在开始安装部署前,已完成底层环境Kubernetes集群+Containerd的部署配置,并且根据环境要求下载Kata安装包。
创建临时目录。
mkdir ~/kata-temp解压Kata安装包到临时目录。
tar -xvf kata-static-3.27.0-arm64.tar.zst -C ~/kata-temp查看解压出来的内容,并拷贝到目标路径。
ls -R ~/kata-temp | head -n 20 cp -ra ~/kata-temp/opt/kata /opt/设置权限,确保有root执行权。
chmod -R +x /opt/kata/bin/创建软链接到系统路径。
ln -sf /opt/kata/bin/kata-runtime /usr/local/bin/kata-runtime ln -sf /opt/kata/bin/containerd-shim-kata-v2 /usr/local/bin/containerd-shim-kata-v2验证是否安装成功,并删除临时目录。
kata-runtime --version rm -rf ~/kata-temp配置Containerd接入Kata,修改/etc/containerd/config.toml文件,在CRI插件中注册Kata运行时,使用如下命令:
sed -i '/\[plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes\]/a\ [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.kata]\n runtime_type = \"io.containerd.kata.v2\"\n [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.kata.options]\n ConfigPath = \"/opt/kata/share/defaults/kata-containers/configuration-clh.toml\"' /etc/containerd/config.toml重启containerd服务,使配置生效。
systemctl restart containerd说明: 建议修改之前备份/etc/containerd/config.toml文件,防止出现问题之后无法恢复。
(可选)Nydus镜像加速
Nydus是一种容器镜像加速方案,可显著提升Kata容器的镜像拉取和启动速度。Nydus为可选组件,不安装Nydus不影响Kata的正常使用。如需按以下流程操作,请先根据环境要求章节下载对应版本的Nydus安装包。
安装Nydus及配置
本章节主要提供Nydus组件的安装,以及各项服务配置的操作指导。
安装核心组件RPM包。
rpm -ivh nydus-static-2.4.0-linux-arm64.rpm解压Snapshotter,并拷贝到相关目录。
tar -zxvf nydus-snapshotter-v0.15.12-linux-arm64.tar.gz cp bin/* /usr/local/bin/检查Nydus是否安装成功。
nydusctl -V创建配置文件/etc/nydus/config.toml,配置内容如下:
version = 1 root = "/var/lib/containerd/io.containerd.snapshotter.v1.nydus" address = "/run/containerd-nydus/containerd-nydus-grpc.sock" daemon_mode = "dedicated" cleanup_on_close = false [daemon] # Specify a configuration file for nydusd nydusd_config = "/etc/nydus/nydusd-config.json" nydusd_path = "/usr/bin/nydusd" nydusimage_path = "/usr/bin/nydus-image" # fusedev or fscache fs_driver = "fusedev" # How to process when daemon dies: "none", "restart" or "failover" recover_policy = "failover" # Nydusd worker thread number to handle FUSE or fscache requests, [0-1024]. # Setting to 0 will use the default configuration of nydusd. threads_number = 4 [log] log_to_stdout = true level = "debug" [snapshot] enable_nydus_overlayfs = true nydus_overlayfs_path = "nydus-overlayfs" [system] # Snapshotter's debug and trace HTTP server interface enable = true # Unix domain socket path where system controller is listening on address = "/run/containerd-nydus/system.sock"创建配置文件/etc/nydus/nydusd-config.json,配置内容如下:
{ "device": { "backend": { "type": "registry", "config": { "timeout": 5, "host": "sealos.hub:5000", "skip_verify": true, "connect_timeout": 5, "retry_limit": 2 } }, "cache": { "type": "blobcache", "config": { "work_dir": "/var/lib/containerd/io.containerd.snapshotter.v1.nydus/cache" } } }, "mode": "direct", "digest_validate": false, "iostats_files": false, "enable_xattr": true, "amplify_io": 1048576, "fs_prefetch": { "enable": true, "threads_count": 8, "merging_size": 1048576, "prefetch_all": true } }
创建Nydus Systemd服务
创建服务配置文件。
vim /etc/systemd/system/containerd-nydus-grpc.service增加以下内容并保存。
[Unit] Description=Nydus containerd snapshotter After=network.target [Service] # 确保socket存放目录存在。 ExecStartPre=/bin/mkdir -p /run/containerd-nydus # 启动grpc服务。 ExecStart=/usr/local/bin/containerd-nydus-grpc --config /etc/nydus/config.toml Restart=always RestartSec=1 KillMode=process OOMScoreAdjust=-999 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target启动服务并设置开机自启动。
systemctl daemon-reload systemctl enable --now containerd-nydus-grpc.service检查sock文件是否成功生成。
ls -l /run/containerd-nydus/containerd-nydus-grpc.sock
配置Nydus接入Containerd
编辑/etc/containerd/config.toml文件,修改增加如下内容:
[plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "nydus" disable_snapshot_annotations = false discard_unpacked_layers = false # 确保未解压的层不会被异常丢弃。 default_runtime_name = "runc" [proxy_plugins] [proxy_plugins.nydus] type = "snapshot" # 重点修正:官方文档要求这里是snapshot。 address = "/run/containerd-nydus/containerd-nydus-grpc.sock"重启Containerd生效。
systemctl restart containerd
配置Nydus到Kata中
修改Kata配置文件/opt/kata/share/defaults/kata-containers/configuration-clh.toml,修改参数如下:
```toml
shared_fs = "virtio-fs-nydus"
virtio_fs_daemon = "/usr/bin/nydusd"
valid_virtio_fs_daemon_paths = ["/usr/bin/nydusd"]
virtio_fs_extra_args = []
```验证使用Kata
本章节主要提供在Kubernetes集群+Containerd中Kata的使用验证方式。
准备镜像
下载sandbox-templates镜像并导入Containerd中。
docker pull docker.io/docker/sandbox-templates:claude-code docker save -o sandbox-template-claude-code.tar docker.io/docker/sandbox-templates:claude-code ctr -n k8s.io images import sandbox-template-claude-code.tarnerdctl登录远程仓库:
nerdctl login -u admin -p passw0rd sealos.hub:5000 --insecure-registry转换sandbox-templates镜像。
nerdctl -n k8s.io image convert --nydus --oci docker/sandbox-templates:claude-code sealos.hub:5000/sandbox-templates:claude-code-nydus把镜像推送至sealos仓。
ctr -n k8s.io images push --plain-http --user admin:passw0rd sealos.hub:5000/sandbox-templates:claude-code-nydus nerdctl -n k8s.io image push sealos.hub:5000/sandbox-templates:claude-code-nydus推送完成后,删除本地镜像。
crictl rmi sealos.hub:5000/sandbox-templates:claude-code-nydus查看仓库是否包含对应的镜像。
curl -u admin:passw0rd http://sealos.hub:5000/v2/_catalog说明:
- 可以是任意镜像,本文档的镜像仅用于验证Kata、Nydus是否能正常使用,仅供参考。
- 如果使用sealos安装的Kubernetes集群,可以参考本文档将镜像推送至本地sealos仓库,请根据实际环境需求更改。
在Kubernetes中使能Kata
在k8s中创建RuntimeClass资源。
cat <<EOF | kubectl apply -f - apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: kata-runtime handler: kata EOF说明: handler的名称必须对应/etc/containerd/config.toml配置文件中[plugins...runtimes.kata]的后缀,本文档示例为:kata。
检查是否成功创建。
# kubectl get runtimeclass NAME HANDLER AGE kata-runtime kata 16m在Pod的YAML中加入runtimeClassName: kata-runtime,将Pod接入Kata。部署文件示例如下所示:
apiVersion: v1 kind: Pod metadata: name: claude-code-sandbox spec: # 1. 指定使用Kata运行时。 runtimeClassName: kata-runtime # 2. 强制指定部署到名为master的节点。 # 注意:请通过kubectl get nodes确认你的节点名称确实叫master。 nodeName: master # 3. 关键:容忍Master节点的污点。 # Sealos默认会给Master加上不可调度的污点,必须加上这个配置Pod才能启动。 tolerations: - key: "node-role.kubernetes.io/control-plane" operator: "Exists" effect: "NoSchedule" - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" containers: - name: sandbox-container image: docker/sandbox-templates:claude-code imagePullPolicy: IfNotPresent stdin: true tty: true command: ["/bin/bash"] args: ["-c", "sleep infinity"] resources: requests: cpu: "500m" memory: "1Gi"启动Pod,检查是否接入成功Kata。
ps aux | grep cloud-hypervisor
(可选)验证使能启动Kata+Nydus
以下验证依赖Nydus镜像加速组件,请先完成(可选)Nydus镜像加速章节的全部配置。
配置nydus-sandbox.yaml。
metadata: attempt: 1 name: nydus-sandbox-2 uid: nydus-uid-2 namespace: default log_directory: /tmp linux: security_context: namespace_options: network: 2 annotations: "io.containerd.osfeature": "nydus.remoteimage.v1"配置nydus-container.yaml。
metadata: name: nydus-container image: image: sealos.hub:5000/sandbox-templates:claude-code-nydus command: - /bin/sleep args: - 600 log_path: container.1.log部署测试。
crictl run -r kata nydus-container.yaml nydus-sandbox.yaml
千级沙箱并发调优
在单节点中并发创建1000个kata沙箱,需调整调优配置。
最大Pod数量限制配置
修改/var/lib/kubelet/config.yaml文件,把maxPods参数放宽到1000以上。
maxOpenFiles: 1000000 maxPods: 2000 memoryManagerPolicy: None重启kubelet服务使之生效。
systemctl daemon-reload systemctl restart kubelet
内核参数限制修改
Kata Containers每个Pod都是一个cloud-hypervisor进程,这对宿主机的系统句柄、ARP缓存表、PID数量消耗极大,需要放大Linux内核的限制。
在/etc/sysctl.conf中增加如下配置:
# 1. 增加inotify限制(非常重要,每个虚拟机需要监控很多文件句柄)。 fs.inotify.max_user_watches = 1048576 fs.inotify.max_user_instances = 81920 # 2. 扩大ARP缓存表(防止容器多了之后网络不通、丢包)。 net.ipv4.neigh.default.gc_thresh1 = 4096 net.ipv4.neigh.default.gc_thresh2 = 8192 net.ipv4.neigh.default.gc_thresh3 = 16384 # 3. 扩大系统文件描述符和PID限制。 fs.file-max = 2097152 kernel.pid_max = 4194304 # 4. 优化网络连接跟踪(Conntrack),防止高并发连接打满。 net.netfilter.nf_conntrack_max = 2097152执行命令生效。
sysctl -p
千级Kata容器启动部署实例
完成上述Kata运行时配置、RuntimeClass创建和系统参数调优后,可通过Deployment在单节点上批量启动Kata容器。以下示例在master节点上创建1000个Kata Pod,用于验证千级Kata沙箱并发启动能力。
说明:
- 示例中的
nodeName: master、镜像地址、CPU和内存请求仅供参考,请根据实际节点名称、镜像仓库和宿主机资源规格调整。- 示例通过
hostNetwork: true让Pod使用宿主机网络,减少CNI插件、Pod IP分配和ARP表规模对千级启动验证的影响。使用宿主机网络时Pod没有独立Pod网络,且监听端口会与宿主机端口共享,请勿在容器中启动固定监听端口相同的服务。- 如果节点存在Master或Control Plane污点,需要保留
tolerations配置,否则Pod会因污点无法调度。- 千级Kata Pod会同时拉起大量
cloud-hypervisor进程,建议先按100、300、600、1000逐步扩容,观察CPU、内存、PID、文件句柄和系统网络状态。
创建部署命名空间。
kubectl create namespace kata-scale创建千级Kata容器Deployment配置文件kata-sandbox-1000.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: kata-sandbox-1000 namespace: kata-scale spec: # 建议首次部署时先设置为100,确认资源稳定后再逐步扩容到1000。 replicas: 100 selector: matchLabels: app: kata-sandbox-scale template: metadata: labels: app: kata-sandbox-scale spec: runtimeClassName: kata-runtime nodeName: master hostNetwork: true dnsPolicy: ClusterFirstWithHostNet terminationGracePeriodSeconds: 0 tolerations: - key: "node-role.kubernetes.io/control-plane" operator: "Exists" effect: "NoSchedule" - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" containers: - name: sandbox-container image: docker/sandbox-templates:claude-code imagePullPolicy: IfNotPresent command: ["/bin/bash"] args: ["-c", "sleep infinity"] resources: requests: cpu: "100m" memory: "256Mi" limits: cpu: "500m" memory: "1Gi"如果需要验证Kata+Nydus镜像加速,可将
image替换为前文转换后的Nydus镜像,例如:image: sealos.hub:5000/sandbox-templates:claude-code-nydus部署并分批扩容。
kubectl apply -f kata-sandbox-1000.yaml kubectl -n kata-scale rollout status deployment/kata-sandbox-1000 kubectl -n kata-scale scale deployment kata-sandbox-1000 --replicas=300 kubectl -n kata-scale rollout status deployment/kata-sandbox-1000 kubectl -n kata-scale scale deployment kata-sandbox-1000 --replicas=600 kubectl -n kata-scale rollout status deployment/kata-sandbox-1000 kubectl -n kata-scale scale deployment kata-sandbox-1000 --replicas=1000 kubectl -n kata-scale rollout status deployment/kata-sandbox-1000检查Pod运行状态。
kubectl -n kata-scale get pods -o wide kubectl -n kata-scale get pods --field-selector=status.phase=Running --no-headers | wc -l当Running状态Pod数量达到1000时,说明Kubernetes层面已完成千级Kata容器启动。
检查Kata虚拟机进程数量。
ps -ef | grep cloud-hypervisor | grep -v grep | wc -l该数量应接近Running状态Pod数量。若数量明显偏少,请通过如下命令查看失败原因。
kubectl -n kata-scale get events --sort-by=.lastTimestamp kubectl -n kata-scale describe pod <pod-name> journalctl -u kubelet -f journalctl -u containerd -f验证完成后清理测试资源。
kubectl delete namespace kata-scale