运行时类

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

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

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

动机

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

你还可以使用 RuntimeClass 在相同的容器运行时中运行具有不同设置的不同 Pod。

设置

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

1. 在节点上配置 CRI 实现

通过 RuntimeClass 可用的配置取决于容器运行时接口 (CRI) 实现。有关如何配置你的 CRI 实现,请参阅相应的文档(参见下文)。

这些配置有一个对应的 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 后,你可以在 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 中得到考虑。

下一步

最后修改于 2022 年 10 月 29 日下午 6:14 PST:为 Containers 概念重做索引 (ddfcad4fe8)