安全容器

最近更新时间:2026-03-24 14:48:14

我的收藏

功能概述

Kata Containers 是一种开源的安全容器运行时,通过轻量级虚拟机技术为容器提供虚拟机级别的安全隔离。TKE 原生节点支持 Kata 运行时,适用于多租户隔离、安全敏感业务等场景。

核心优势

强隔离性:每个 Pod 运行在独立的轻量级虚拟机中,提供 VM 级别的安全隔离。
兼容性:完全兼容 Kubernetes 和 OCI 标准,无需修改应用代码。
多运行时支持:提供 kata-clhkata-qemu 两种运行时类型。

适用场景

多租户工作负载隔离。
运行不可信代码或处理敏感数据。
Agent Sandbox 沙箱环境。
满足金融、政务等行业的安全合规要求。

使用限制

前置条件

限制项
要求
集群版本
Kubernetes >= 1.30
节点类型
仅支持原生节点
实例类型
仅支持 BMS5 裸金属实例
操作系统
Tencent OS 4

字段兼容性限制

不兼容字段

由于 Kata 容器运行在独立的轻量级虚拟机中,以下 Kubernetes Pod 字段不被支持
字段
说明
替代方案
hostNetwork: true
无法使用宿主机网络
使用 NodePort 或 LoadBalancer Service
hostIPC: true
无法共享宿主机 IPC
通过网络通信或共享存储
hostPID: true
无法共享宿主机 PID
使用 Sidecar 容器模式
shareProcessNamespace: true
不支持进程命名空间共享
使用网络通信或共享存储
privileged: true
不支持特权模式
移除特权依赖,使用 capabilities

完全兼容字段

以下字段在 Kata 运行时中完全兼容,无需修改:
调度相关: nodeSelector, nodeName, affinity, tolerations, priority
网络相关: dnsPolicy, dnsConfig, hostname, subdomain
存储相关: volumes, volumeMounts, configMap, secret, emptyDir, persistentVolumeClaim
服务账户: serviceAccount, serviceAccountName
生命周期: initContainers, restartPolicy, livenessProbe, readinessProbe

网络限制

不支持 HostNetwork 模式:Kata 容器网络栈与宿主机隔离。
网络模式待验证:建议在生产环境前进行充分测试。

监控与日志限制

功能
支持情况
监控指标 - Pod 级别
支持
监控指标 - Container 级别
不支持
日志采集 - CLS
当前不可用

快速入门

步骤1:创建支持 Kata 运行时的节点池

控制台操作

2. 选择目标原生集群,进入节点管理 > 节点池。
3. 单击新建,选择原生节点
4. 单击创建,新建节点管理页面中:
选择机型配置,选择 BMS5 系列裸金属实例。
高级设置中,开启安全容器(Kata 运行时) 选项。
5. 完成其他配置后,单击创建节点池。

YAML 操作

特性开关位置:spec.template.spec.metadata.annotations
参数值:node.tke.cloud.tencent.com/container-runtime: kata
需指定操作系统镜像:node.tke.cloud.tencent.com/image-label: ts4-public
可参考如下 YAML 示例直接在集群创建原生节点:
apiVersion: node.tke.cloud.tencent.com/v1beta1
kind: MachineSet
metadata:
annotations:
capacity.cluster-autoscaler.kubernetes.io/extended-resources: '{"tke.cloud.tencent.com/qgpu-core":0,"tke.cloud.tencent.com/qgpu-memory":0,"tke.cloud.tencent.com/sub-eni":0}'
node.tke.cloud.tencent.com/container-runtime: kata
node.tke.cloud.tencent.com/deletion-protection: "true"
node.tke.cloud.tencent.com/direct-eni: "31"
node.tke.cloud.tencent.com/hostname-pattern: ""
node.tke.cloud.tencent.com/image-label: ts4-public
node.tke.cloud.tencent.com/memoryGb: "768"
node.tke.cloud.tencent.com/route-eni: "285"
node.tke.cloud.tencent.com/security-groups-spread: "false"
node.tke.cloud.tencent.com/specify-delete-machines: ""
node.tke.cloud.tencent.com/update-existed-nodes: "false"
node.tke.cloud.tencent.com/update-existed-nodes-metadata: disable
node.tke.cloud.tencent.com/update-existed-nodes-security-group: disable
node.tke.cloud.tencent.com/vCPU: "208"
spec:
autoRepair: false
deletePolicy: Newest
displayName: xd-test-kata
healthCheckPolicyName: ""
instanceTypes:
- BMS5.52XLARGE768
replicas: 1
scaling:
createPolicy: ZonePriority
selector:
matchLabels:
node.tke.cloud.tencent.com/machineset: np-xxx
subnetIDs:
- subnet-xxx
template:
metadata:
annotations:
node.tke.cloud.tencent.com/cluster-cloud-tags: '[{"tagKey":"xxx","tagValue":"xxxx"}]'
node.tke.cloud.tencent.com/container-runtime: kata
node.tke.cloud.tencent.com/image-label: ts4-public
node.tke.cloud.tencent.com/machine-cloud-tags: '[]'
labels:
node.tke.cloud.tencent.com/machineset: np-l2oj4hdn
spec:
metadata:
annotations:
node.tke.cloud.tencent.com/automation-service: "true"
node.tke.cloud.tencent.com/container-runtime: kata
node.tke.cloud.tencent.com/image-label: ts4-public
node.tke.cloud.tencent.com/monitor-service: "true"
node.tke.cloud.tencent.com/security-agent: "false"
providerSpec:
type: NativeCVM
value:
instanceChargeType: PostpaidByHour
keyIDs:
- skey-xxx
lifecycle: {}
management: {}
metadata:
creationTimestamp: null
securityGroupIDs:
- sg-xxx
systemDisk:
DiskPartition: ""
diskSize: 50
diskType: CloudBSSD
runtimeRootDir: /var/lib/containerd
type: Native

验证节点池创建成功

节点池创建完成后,检查节点是否已支持 Kata 运行时:
# 查看带有 kata-runtime 标签的节点
kubectl get nodes -l katacontainers.io/kata-runtime=true

# 预期输出
NAME STATUS ROLES AGE VERSION
kata-node-1 Ready <none> 10m v1.24.0
kata-node-2 Ready <none> 10m v1.24.0

步骤2:部署工作负载到 Kata 节点

查看可用的 RuntimeClass

kubectl get runtimeclass

# 预期输出
NAME HANDLER AGE
kata-clh kata-clh 5m
kata-qemu kata-qemu 5m
RuntimeClass 选择建议
kata-clh:性能优先,启动更快,资源占用更低。
kata-qemu:兼容性优先,功能更完善,稳定性更好。

示例:部署 Nginx 应用

创建 nginx-kata.yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-kata
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx-kata
template:
metadata:
labels:
app: nginx-kata
spec:
runtimeClassName: kata-qemu # 指定使用 kata-qemu 运行时
containers:
- name: nginx
image: nginx:1.24.0
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-kata-service
namespace: default
spec:
type: LoadBalancer
selector:
app: nginx-kata
ports:
- port: 80
targetPort: 80
部署应用:
# 部署应用
kubectl apply -f nginx-kata.yaml

# 查看 Pod 状态
kubectl get pods -l app=nginx-kata -o wide

# 预期输出
NAME READY STATUS RESTARTS AGE IP NODE
nginx-kata-5f8d9c7b4d-abc12 1/1 Running 0 1m 10.244.1.10 kata-node-1
nginx-kata-5f8d9c7b4d-def34 1/1 Running 0 1m 10.244.1.11 kata-node-2

# 验证 Pod 是否运行在 Kata 容器中
kubectl exec -it nginx-kata-5f8d9c7b4d-abc12 -- cat /proc/1/cgroup
# 输出应包含 kata 相关信息

部署建议

1. 资源规划

Kata 容器需要额外的资源开销,建议在 Pod 配置中预留:
resources:
requests:
cpu: 200m # 建议比普通容器多 5%-10%
memory: 256Mi # 建议比普通容器多 10%-20%
limits:
cpu: 400m
memory: 512Mi

2. 健康检查配置

Kata 容器启动时间略长,建议调整健康检查参数:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30 # 增加初始延迟
periodSeconds: 10
timeoutSeconds: 5

readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 20 # 增加初始延迟
periodSeconds: 5
timeoutSeconds: 3

3. RuntimeClass 选择

# 性能优先场景(启动快、资源占用低)
runtimeClassName: kata-clh

# 兼容性优先场景(功能完善、稳定性好)
runtimeClassName: kata-qemu

4. 节点池隔离

建议将 Kata 节点和普通容器节点分开管理。

常见问题

1. 创建节点池时提示“不支持该机型”

原因:当前仅支持 BMS5 系列裸金属实例。
解决方案:在控制台选择 BMS5 系列实例。

2. Pod 创建失败,提示字段不支持

常见错误
HostNetwork is not supported for kata containers
hostPID is not supported
解决方案:检查 Pod 配置,移除不支持的字段(hostNetworkhostIPChostPIDshareProcessNamespaceprivileged),请参考本文档的 字段兼容性限制

3. Pod 一直处于 Pending 状态

排查步骤
# 查看 Pod 事件
kubectl describe pod <pod-name>

# 检查是否有 Kata 节点
kubectl get nodes -l katacontainers.io/kata-runtime=true

# 检查 RuntimeClass 是否存在
kubectl get runtimeclass
常见原因
集群中没有 Kata 节点。
RuntimeClass 不存在。
节点资源不足。
Pod 配置使用了不支持的字段。

4. Kata 容器启动慢

原因:Kata 容器需要启动轻量级虚拟机。
优化建议
使用 kata-clh 运行时,启动速度更快。
使用镜像缓存。
调整健康检查参数。

5. 无法采集 Container 级别监控指标

原因:当前版本暂不支持 Container 级别监控。
替代方案
使用 Pod 级别监控指标。
在容器内暴露 Prometheus 指标。
使用 Sidecar 方式部署监控 Agent。