概念

Edit This Page

容器运行时类(Runtime Class)

FEATURE STATE: Kubernetes v1.14 beta
该功能目前处于 beta 状态,意味着:

  • 版本名称包含 beta (例如 v2beta3)。
  • 代码经过了充分测试,启用该功能被认为是安全的。默认情况下被启用。
  • 对整体功能的支持在未来不会被移除,尽管细节上可能会做更改。
  • 在后续的 beta 或稳定版本中,对象的模式、语义可能以不兼容的方式发生变化。当这种情况发生时,我们将提供迁移到下一个版本的说明。这可能需要删除、编辑和重建 API 对象,编辑过程可能需要一些思考。这可能导致依赖该功能的应用程序停机一段时间。
  • 建议仅在非业务关键场景使用该功能,因为在后续版本中可能会发生不兼容的更改。如果您有多个可以独立升级的集群,那么您可能可以放松这个限制。
  • 请尝试使用我们的 beta 版功能,并给出反馈!在它们退出 beta 测试阶段之后,我们将很难去做更多的更改。

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

警告: RuntimeClass 特性在 v1.14 版本升级为 beta 特性时引入了不兼容的改变。 如果你在 v1.14 以前的版本中使用 RuntimeClass,请查阅 Upgrading RuntimeClass from Alpha to Beta

Runtime Class

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

Motivation

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

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

设置

确保 RuntimeClass 特性开关处于开启状态(默认为开启状态)。 关于特性开关的详细介绍,请查阅 Feature GatesRuntimeClass 特性开关必须在 apiservers 和 kubelets 同时开启。

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

1. 在节点上配置 CRI 实现

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

注意: RuntimeClass 假设集群中的节点配置是同构的 (换言之,所有的节点在容器运行时方面的配置是相同的)。 如果需要支持异构节点,配置方法请参阅下面的 Scheduling

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

2. 创建相应的 RuntimeClass 资源

在上面步骤 1 中,每个配置都需要有一个用于标识配置的 handler。 针对每个 handler 需要创建一个 RuntimeClass 对象。

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

apiVersion: node.k8s.io/v1beta1  # RuntimeClass is defined in the node.k8s.io API group
kind: RuntimeClass
metadata:
  name: myclass  # The name the RuntimeClass will be referenced by
  # RuntimeClass is a non-namespaced resource
handler: myconfiguration  # The name of the corresponding CRI configuration
注意: 建议将 RuntimeClass 写操作(create、update、patch 和 delete)限定于集群管理员使用。 通常这是默认配置。参阅授权概述了解更多信息。

使用说明

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

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  runtimeClassName: myclass
  # ...

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

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

CRI Configuration

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

dockershim

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

containerd

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

[plugins.cri.containerd.runtimes.${HANDLER_NAME}]

更详细信息,请查阅 containerd 配置文档: https://github.com/containerd/cri/blob/master/docs/config.md

cri-o

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

[crio.runtime.runtimes.${HANDLER_NAME}]
  runtime_path = "${PATH_TO_BINARY}"

更详细信息,请查阅 containerd 配置文档: https://github.com/kubernetes-sigs/cri-o/blob/master/cmd/crio/config.go

Scheduling

FEATURE STATE: Kubernetes v1.16 beta
该功能目前处于 beta 状态,意味着:

  • 版本名称包含 beta (例如 v2beta3)。
  • 代码经过了充分测试,启用该功能被认为是安全的。默认情况下被启用。
  • 对整体功能的支持在未来不会被移除,尽管细节上可能会做更改。
  • 在后续的 beta 或稳定版本中,对象的模式、语义可能以不兼容的方式发生变化。当这种情况发生时,我们将提供迁移到下一个版本的说明。这可能需要删除、编辑和重建 API 对象,编辑过程可能需要一些思考。这可能导致依赖该功能的应用程序停机一段时间。
  • 建议仅在非业务关键场景使用该功能,因为在后续版本中可能会发生不兼容的更改。如果您有多个可以独立升级的集群,那么您可能可以放松这个限制。
  • 请尝试使用我们的 beta 版功能,并给出反馈!在它们退出 beta 测试阶段之后,我们将很难去做更多的更改。

在 Kubernetes v1.16 版本里,RuntimeClass 特性引入了 scheduling 字段来支持异构集群。 通过该字段,可以确保 pod 被调度到支持指定运行时的节点上。 该调度支持,需要确保 RuntimeClass admission controller 处于开启状态(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 的配置信息,请查阅 Assigning Pods to Nodes

Pod Overhead

FEATURE STATE: Kubernetes v1.16 alpha
该功能目前处于 alpha 状态,意味着:

  • 版本名称包含 alpha(例如 v1alpha1)。
  • 可能存在问题,启用该功能可能会暴露 bug。默认情况下被禁用。
  • 对该功能的支持可能在任何时候被取消,而不另行通知。
  • API 可能会在以后的软件版本中以不兼容的方式被更改,而不另行通知。
  • 建议仅在短期测试集群中使用该功能,这是因为使用该功能会增加出现 bug 的风险,而且缺乏长期支持。

在 Kubernetes v1.16 版本中,RuntimeClass 开始支持 pod 的 overhead,作为 PodOverhead 特性的一部分。 若要使用 PodOverhead 特性,你需要确保 PodOverhead 特性开关处于开启状态(默认为关闭状态)。

Pod 的 overhead 在 RuntimeClass 的 Overhead 字段定义,该字段用于指定使用 RuntimeClass 特性时带来的 overhead。

Upgrading RuntimeClass from Alpha to Beta

RuntimeClass Beta 特性包含如下几个改变:

  • node.k8s.io API 组和 runtimeclasses.node.k8s.io 资源已从 CRD 中迁移到内置的 API 中;
  • spec 被放置到 RuntimeClass 中(例如,没有 RuntimeClassSpec 了);
  • runtimeHandler 字段重命名为 handler
  • handler 字段需要在所有版本的 API 提供,这意味着 runtimeHandler 字段在 Alpha API 中也需要提供;
  • handler 字段必须是一个合法的 DNS 标识(RFC 1123), 这意味着不可以包含 . 字符。合法的 handler 必须满足如下规则:^[a-z0-9]([-a-z0-9]*[a-z0-9])?$

Action Required: RuntimeClass 特性从 alpha 版本升级到 beta 版本,需要做如下动作:

  • RuntimeClass 资源必须在升级到 v1.14 之后 再创建,并且 CRD 资源 runtimeclasses.node.k8s.io 必须要手动删除:

    kubectl delete customresourcedefinitions.apiextensions.k8s.io runtimeclasses.node.k8s.io
    
  • RuntimeClasses 中未指定或为空的 runtimeHandler 和 使用包含 . 符号的 handler 将不再合法, 必须迁移成合法的 handler 配置(见上)。

Further Reading

反馈