运行时类
Kubernetes v1.20 [stable]
本页面描述了 RuntimeClass 资源和运行时选择机制。
RuntimeClass 是用于选择容器运行时配置的特性。容器运行时配置用于运行 Pod 中的容器。
动机
你可以在不同的 Pod 之间设置不同的 RuntimeClass,以在性能和安全性之间取得平衡。例如,如果你的部分工作负载需要高度的信息安全保证,你可以选择将这些 Pod 调度到使用硬件虚拟化的容器运行时中运行。然后,你可以从这种替代运行时的额外隔离中受益,尽管会付出一些额外的开销。
你还可以使用 RuntimeClass 在相同的容器运行时中运行具有不同设置的不同 Pod。
设置
- 在节点上配置 CRI 实现(取决于运行时)
- 创建对应的 RuntimeClass 资源
1. 在节点上配置 CRI 实现
通过 RuntimeClass 可用的配置取决于容器运行时接口 (CRI) 实现。有关如何配置你的 CRI 实现,请参阅相应的文档(参见下文)。
注意
默认情况下,RuntimeClass 假定集群中的节点配置是同构的(这意味着所有节点在容器运行时方面配置方式相同)。为了支持异构节点配置,请参阅下文的调度。这些配置有一个对应的 handler
名称,由 RuntimeClass 引用。处理程序(handler)必须是一个有效的DNS 标签名称。
2. 创建对应的 RuntimeClass 资源
在步骤 1 中设置的配置都应该有一个关联的 handler
名称,该名称标识了配置。对于每个处理程序,创建一个对应的 RuntimeClass 对象。
RuntimeClass 资源目前只有 2 个重要字段:RuntimeClass 名称(metadata.name
)和处理程序(handler
)。对象定义如下所示
# RuntimeClass is defined in the node.k8s.io API group
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
# The name the RuntimeClass will be referenced by.
# RuntimeClass is a non-namespaced resource.
name: myclass
# The name of the corresponding CRI configuration
handler: myconfiguration
RuntimeClass 对象的名称必须是有效的DNS 子域名。
注意
建议将 RuntimeClass 的写操作(创建/更新/修补/删除)限制为集群管理员。这通常是默认设置。有关更多详细信息,请参阅授权概述。使用
为集群配置 RuntimeClass 后,你可以在 Pod 规约中指定 runtimeClassName
来使用它。例如
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: myclass
# ...
这将指示 kubelet 使用指定的 RuntimeClass 来运行此 Pod。如果指定的 RuntimeClass 不存在,或者 CRI 无法运行相应的处理程序,Pod 将进入 Failed
终端阶段。查找相应的事件以获取错误消息。
如果没有指定 runtimeClassName
,将使用默认的 RuntimeHandler,这等同于禁用 RuntimeClass 特性时的行为。
CRI 配置
有关设置 CRI 运行时的更多详细信息,请参阅CRI 安装。
containerd
运行时处理程序通过位于 /etc/containerd/config.toml
的 containerd 配置文件进行配置。有效的处理程序配置在 runtimes 部分下
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}]
有关更多详细信息,请参阅 containerd 的配置文档
CRI-O
运行时处理程序通过位于 /etc/crio/crio.conf
的 CRI-O 配置文件进行配置。有效的处理程序配置在 crio.runtime 表下
[crio.runtime.runtimes.${HANDLER_NAME}]
runtime_path = "${PATH_TO_BINARY}"
有关更多详细信息,请参阅 CRI-O 的配置文档。
调度
Kubernetes v1.16 [beta]
通过为 RuntimeClass 指定 scheduling
字段,你可以设置约束,以确保使用此 RuntimeClass 运行的 Pod 被调度到支持它的节点上。如果未设置 scheduling
,则假定所有节点都支持此 RuntimeClass。
为了确保 Pod 调度到支持特定 RuntimeClass 的节点上,该节点集合应具有一个通用标签,然后通过 runtimeclass.scheduling.nodeSelector
字段进行选择。RuntimeClass 的 nodeSelector 会在准入阶段与 Pod 的 nodeSelector 合并,实际上是取各自选择的节点集的交集。如果存在冲突,Pod 将被拒绝。
如果支持的节点被设置了污点,以阻止其他 RuntimeClass 的 Pod 在该节点上运行,则可以将 tolerations
添加到 RuntimeClass 中。与 nodeSelector
一样,tolerations 会在准入阶段与 Pod 的 tolerations 合并,实际上是取各自容忍的节点集的并集。
要了解有关配置节点选择器和容忍度的更多信息,请参阅将 Pod 分配给节点。
Pod 开销 (Pod Overhead)
Kubernetes v1.24 [stable]
你可以指定与运行 Pod 相关联的 开销 资源。声明开销允许集群(包括调度器)在做出关于 Pod 和资源的决策时将其考虑在内。
Pod 开销通过 RuntimeClass 的 overhead
字段定义。通过使用此字段,你可以指定使用此 RuntimeClass 运行 Pod 的开销,并确保这些开销在 Kubernetes 中得到考虑。