运行时类

特性状态: Kubernetes v1.20 [stable]

此页面描述了 RuntimeClass 资源和运行时选择机制。

RuntimeClass 是一个用于选择容器运行时配置的特性。容器运行时配置用于运行 Pod 的容器。

动机

你可以在不同的 Pod 之间设置不同的 RuntimeClass,以在性能和安全性之间取得平衡。例如,如果你的工作负载的一部分需要高水平的信息安全保证,你可以选择调度这些 Pod,使其在使用硬件虚拟化的容器运行时中运行。这样,你将受益于替代运行时的额外隔离,但会付出一些额外的开销。

你还可以使用 RuntimeClass 以相同的容器运行时但不同的设置来运行不同的 Pod。

设置

  1. 在节点上配置 CRI 实现(依赖于运行时)
  2. 创建相应的 RuntimeClass 资源

1. 在节点上配置 CRI 实现

通过 RuntimeClass 可用的配置是容器运行时接口 (CRI) 实现相关的。请参阅你的 CRI 实现的相应文档(如下)以了解如何配置。

配置具有一个相应的 handler 名称,由 RuntimeClass 引用。该处理程序必须是有效的 DNS 标签名称

2. 创建相应的 RuntimeClass 资源

步骤 1 中设置的每个配置都应该有一个关联的 handler 名称,用于标识配置。对于每个处理程序,创建一个相应的 RuntimeClass 对象。

RuntimeClass 资源目前只有两个重要字段: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,你可以在 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

运行时处理程序通过 containerd 的配置文件 /etc/containerd/config.toml 进行配置。有效的处理程序在 runtimes 部分下配置:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}]

有关详细信息,请参阅 containerd 的配置文档

CRI-O

运行时处理程序通过 CRI-O 的配置文件 /etc/crio/crio.conf 进行配置。有效的处理程序在 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 在节点上运行,你可以向 RuntimeClass 添加 tolerations。与 nodeSelector 一样,容忍度在准入阶段与 Pod 的容忍度合并,有效地取两者所容忍节点集的并集。

要了解有关配置节点选择器和容忍度的更多信息,请参阅将 Pod 分配给节点

Pod 开销

特性状态: Kubernetes v1.24 [stable]

你可以指定与运行 Pod 相关的**开销**资源。声明开销允许集群(包括调度器)在对 Pod 和资源做出决策时将其考虑在内。

Pod 开销通过 RuntimeClass 的 overhead 字段定义。通过使用此字段,你可以指定利用此 RuntimeClass 运行 Pod 的开销,并确保这些开销在 Kubernetes 中得到考虑。

下一步

上次修改时间:2022 年 10 月 29 日下午 6:14 (PST):重做容器概念索引 (ddfcad4fe8)