容器运行时类(Runtime Class)

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

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

    你可以在不同的 Pod 设置不同的 RuntimeClass,以提供性能与安全性之间的平衡。 例如,如果你的部分工作负载需要高级别的信息安全保证,你可以决定在调度这些 Pod 时尽量使它们在使用硬件虚拟化的容器运行时中运行。 这样,你将从这些不同运行时所提供的额外隔离中获益,代价是一些额外的开销。

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

    确保 RuntimeClass 特性开关处于开启状态(默认为开启状态)。 关于特性开关的详细介绍,请参阅 。 RuntimeClass 特性开关必须在 API 服务器和 kubelet 端同时开启。

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

    RuntimeClass 的配置依赖于 运行时接口(CRI)的实现。 根据你使用的 CRI 实现,查阅相关的文档(下方)来了解如何配置。

    所有这些配置都具有相应的 handler 名,并被 RuntimeClass 引用。 handler 必须符合 DNS-1123 命名规范(字母、数字、或 -)。

    RuntimeClass 资源当前只有两个重要的字段:RuntimeClass 名 (metadata.name) 和 handler ()。 对象定义如下所示:

    说明: 建议将 RuntimeClass 写操作(create、update、patch 和 delete)限定于集群管理员使用。 通常这是默认配置。参阅了解更多信息。

    一旦完成集群中 RuntimeClasses 的配置,使用起来非常方便。 在 Pod spec 中指定 runtimeClassName 即可。例如:

    这一设置会告诉 kubelet 使用所指的 RuntimeClass 来运行该 pod。 如果所指的 RuntimeClass 不存在或者 CRI 无法运行相应的 handler, 那么 pod 将会进入 Failed 终止阶段。 你可以查看相应的, 获取出错信息。

    如果未指定 runtimeClassName ,则将使用默认的 RuntimeHandler,相当于禁用 RuntimeClass 功能特性。

    关于如何安装 CRI 运行时,请查阅 CRI 安装

    dockershim

    Kubernetes 内置的 dockershim CRI 不支持配置运行时 handler。

    通过 containerd 的 /etc/containerd/config.toml 配置文件来配置运行时 handler。 handler 需要配置在 runtimes 块中:

    通过 cri-o 的 /etc/crio/crio.conf 配置文件来配置运行时 handler。 handler 需要配置在 下面:

    更详细信息,请查阅 CRI-O 配置文档

    FEATURE STATE:

    在 Kubernetes v1.16 版本里,RuntimeClass 特性引入了 scheduling 字段来支持异构集群。 通过该字段,可以确保 pod 被调度到支持指定运行时的节点上。 该调度支持,需要确保 处于开启状态(1.16 版本默认开启)。

    为了确保 pod 会被调度到支持指定运行时的 node 上,每个 node 需要设置一个通用的 label 用于被 runtimeclass.scheduling.nodeSelector 挑选。在 admission 阶段,RuntimeClass 的 nodeSelector 将会于 pod 的 nodeSelector 合并,取二者的交集。如果有冲突,pod 将会被拒绝。

    如果 node 需要阻止某些需要特定 RuntimeClass 的 pod,可以在 tolerations 中指定。 与 nodeSelector 一样,tolerations 也在 admission 阶段与 pod 的 tolerations 合并,取二者的并集。

    更多有关 node selector 和 tolerations 的配置信息,请查阅 将 Pod 分派到节点

    FEATURE STATE: Kubernetes v1.18 [beta]

    Pod 开销通过 RuntimeClass 的 字段定义。 通过使用这些字段,你可以指定使用该 RuntimeClass 运行 Pod 时的开销并确保 Kubernetes 将这些开销计算在内。