RuntimeClass 是什么
RuntimeClass 把「用哪个容器运行时」抽象成一个名字:集群级定义一个类(例如 gvisor、kata),Pod 通过 spec.runtimeClassName 声明自己要用它。名字背后是节点上容器运行时注册的 runtime handler,不同的 handler 对应不同隔离强度:runc 是共享内核的常规容器,gVisor 用用户态内核拦截系统调用,Kata 给每个 Pod 起一台轻量虚拟机。隔离越强,启动与内存开销往往越大,选型就是在这条线上取平衡。
基本信息
| 所属 API | node.k8s.io/v1,集群级资源,v1.20 起 GA |
|---|---|
| 关键字段 | metadata.name、handler(必填)、scheduling、overhead |
| Pod 侧引用 | Pod.spec.runtimeClassName 填 RuntimeClass 的名字 |
| 生效前提 | 目标节点上的容器运行时已注册同名 runtime handler |
| overhead 记账 | podFixed 里的 cpu 与 memory 会并入 Pod 的资源请求,由调度器与 kubelet 计入 |
典型使用场景
- 多租户环境下运行外部代码:用户提交的任务放进 gVisor,降低内核漏洞被利用后的影响面
- 合规与强隔离要求:金融、医疗场景把敏感负载放进 Kata 这类带虚拟化边界的运行时
- 同一集群内混跑不同信任等级的负载,用 runtimeClassName 区分,而不是只靠命名空间隔离
- 排查运行时问题:临时把某个 Pod 切到指定运行时验证是否是运行时引起的异常
- 性能对比测试:同一镜像在 runc 与沙箱运行时下跑基准,量化隔离带来的开销
声明与使用
声明与使用
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: gvisor # 这个名字要与容器运行时注册的 handler 对应
handler: runsc
scheduling:
nodeSelector:
sandbox: gvisor # 自动合并到 Pod,把负载限制在具备该运行时的节点
tolerations:
- key: sandbox
operator: Exists
---
apiVersion: v1
kind: Pod
metadata:
name: untrusted
spec:
runtimeClassName: gvisor # 仅这一行即可切换运行时
containers:
- name: worker
image: registry.example.com/worker:1.0.0核对运行时
核对运行时
kubectl get runtimeclass # 集群里定义了哪些运行时
kubectl get runtimeclass gvisor -o yaml # 看 handler 与 scheduling 约束
kubectl get pod untrusted -o jsonpath='{.spec.runtimeClassName}{"\n"}'
crictl info # 在节点上执行,查看容器运行时已注册的 runtime 名称
kubectl describe pod untrusted | sed -n '/Events/,$p' # handler 缺失时事件里会直接说明常见运行时取舍
| 运行时 | 隔离方式 | 性能与兼容性 | 典型用途 |
|---|---|---|---|
| runc | 共享宿主机内核的常规容器 | 开销最小,内核逃逸风险最高 | 普通业务负载 |
| gVisor | 用户态内核拦截系统调用 | 系统调用路径变长,启动更慢,兼容性受限 | 多租户、运行不可信代码 |
| Kata Containers | 每个 Pod 一台轻量虚拟机 | 内存与启动开销最大,隔离最强 | 强隔离与合规场景 |
scheduling.nodeSelector 会在 Pod 创建时合并进 Pod 的 nodeSelector,tolerations 同理,用来把负载限制在具备该运行时的节点上。这部分合并由 API Server 的 RuntimeClass 准入插件完成,具体开关与默认值以对应版本和发行版文档为准。
切换运行时不是零成本的兼容性操作:依赖 /proc 细节、内核模块、设备直通、特权容器或 eBPF 的负载在沙箱运行时下容易报系统调用错误。迁移前应在测试集群把核心链路(启动、读写、网络、探针)完整跑一遍。
不声明 overhead 会让节点资源账本偏乐观:调度器按不含运行时额外开销的请求数计算余量,节点更容易被压满并触发驱逐,这类问题通常在高水位时才显现。