容器运行时类(Runtime Class)

FEATURE STATE: Kubernetes v1.14feature-state-beta.txtThis feature is currently in a beta state, meaning:

  • The version names contain beta (e.g. v2beta3).
  • Code is well tested. Enabling the feature is considered safe. Enabled by default.
  • Support for the overall feature will not be dropped, though details may change.
  • The schema and/or semantics of objects may change in incompatible ways in a subsequent beta or stable release. When this happens, we will provide instructions for migrating to the next version. This may require deleting, editing, and re-creating API objects. The editing process may require some thought. This may require downtime for applications that rely on the feature.
  • Recommended for only non-business-critical uses because of potential for incompatible changes in subsequent releases. If you have multiple clusters that can be upgraded independently, you may be able to relax this restriction.
  • Please do try our beta features and give feedback on them! After they exit beta, it may not be practical for us to make more changes.

这个文档主要说明了 RuntimeClass 资源和 kubernetes 指定容器运行时的功能。

警告:

Kubernetes1.14 的 β 版的升级包含了 RuntimeClass 的 破坏性 的变更。如果用户在使用 Kubernetes1.14 以前的 RuntimeClass 版本,请参考文档从 RuntimeClass 的 α 版升级到β版

关于RuntimeClass

RuntimeClass 是可以让用户选择容器运行时的功能。用户通过设定容器运行时可以选择 Pod 的容器运行在那种容器运行时之上。

使用场景

用户可以为不同的 Pod 设定不同的 RuntimeClass ,以达到动态调整容器安全和容器性能间的平衡的目的。例如,如果用户的一部分工作需要确保高安全性,那么可以选择调度Pod使用到硬件虚拟化的容器运行时。受益于硬件虚拟化带来的附加的容器隔离特性的同时,也会带来性能上的额外开销。

用户也可以通过这种方式,为Pod提供不同设定的同一种容器运行时。

设定

首先要先确认 RuntimeClass 功能的 Feature Gate 被设定为开启(默认是有效状态)。设定 Feature Gate 为有效的文档请参考Feature GatesRuntimeClass的 Feature Gate 开启需要 ApiServer 和 kubelet 同时将相关配置开启。

  • 配置节点的 CRI。(依赖于容器运行时)
  • 创建相应的 RuntimeClass 资源。

1. 实现节点上的CRI设定。

通过 RuntimeClass 进行设定的有效化,依赖于 Container Runtime Interface (CRI) 组件。在用户环境中,CRI 的设定方法请参考(见下面)文档。

注意:

<!–RuntimeClass assumes a homogeneous node configuration across the cluster by default (which meansthat all nodes are configured the same way with respect to container runtimes). To supportheterogenous node configurations, see Scheduling below.–>

默认情况下,RuntimeClass 被假设为所有节点上的配置均为一致。(这意味着所有的 Node 节点的容器运行时必须以相同的方式进行设定)。要支持不同配置构节点配置,请参见下面的[Scheduling](#scheduling)。

配置需要具有相应的 handler 名称,被用于 RuntimeClass 的设定。被定义的 Handler 名称必须是有效的 DNS-1123 标准。(只能使用英文字母,数字 和 -)。

2. 创建对应的RuntimeClass资源

为了便于识别各个项目,安装配置的第一步需要每个项目有一个关联的 handler 名称。这样就可以为每个 handler 创建对应的 RuntimeClass 资源了。

所以当前 RuntimeClass 资源有两个重要的设定项。一个是 RuntimeClass 的名称( metadata.name )和 Handler (handler)。RuntimeClass 的资源定义可以参考下面的内容。

  1. apiVersion: node.k8s.io/v1beta1 # RuntimeClass is defined in the node.k8s.io API group
  2. kind: RuntimeClass
  3. metadata:
  4. name: myclass # The name the RuntimeClass will be referenced by
  5. # RuntimeClass is a non-namespaced resource
  6. handler: myconfiguration # The name of the corresponding CRI configuration
注意:

推荐只有集群管理员具有针对 RuntimeClass 的各项操作权限(create/update/patch/delete)。这通常是默认值。具体内容可以授权概况文档了解详细信息。

使用方法

一旦集群中的 RuntimeClass 的设定完成,接下来的使用就变得非常简单了。只需要设定 PodSpec 的 runtimeClassName 设定项。例如:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: mypod
  5. spec:
  6. runtimeClassName: myclass
  7. # ...

这个设定将让Kubelet使用指定的 RuntimeClass 来运行 Pod。如果 RuntimeClass 不存在, 或者 CRI 不能执行相应的 Handler,Pod 将会变成Failed状态。请参考对应的相关事件文档,确定错误信息。

如果 runtimeClassName 没有被设定的情况下,将会使用默认的 RuntimeHandler,这里的运行效果和 RuntimeClass 功能被禁止的情况下是一样的。

CRI的设定

CRI 运行时的相关设定详细内容请参考CRI的安装

dockershim

Kubernetes 的内置 dockershim CRI 不支持容器运行时 handlers。

containerd

运行时 handler 可以通过 containerd 的配置文件 /etc/containerd/config.toml 进行设定。有效的 handlers 被设定在 runtimes 部分的下一层级。

  1. [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 中进行配置。有效的处理程序在crio.runtime表下配置。

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

有关更多详细信息,请参见cri-o的配置文档:https://github.com/kubernetes-sigs/cri-o/blob/master/cmd/crio/config.go

调度

FEATURE STATE: Kubernetes v1.16feature-state-beta.txtThis feature is currently in a beta state, meaning:

  • The version names contain beta (e.g. v2beta3).
  • Code is well tested. Enabling the feature is considered safe. Enabled by default.
  • Support for the overall feature will not be dropped, though details may change.
  • The schema and/or semantics of objects may change in incompatible ways in a subsequent beta or stable release. When this happens, we will provide instructions for migrating to the next version. This may require deleting, editing, and re-creating API objects. The editing process may require some thought. This may require downtime for applications that rely on the feature.
  • Recommended for only non-business-critical uses because of potential for incompatible changes in subsequent releases. If you have multiple clusters that can be upgraded independently, you may be able to relax this restriction.
  • Please do try our beta features and give feedback on them! After they exit beta, it may not be practical for us to make more changes.

从Kubernetes v1.16开始,RuntimeClass 通过 scheduling 字段添加了对异构集群的支持。通过使用这些字段,可以确保将与此 RuntimeClass一 起运行的 Pod 调度到支持它的节点上。要使用计划支持,您必须启用 RuntimeClass admission controller(默认值,自1.16开始)。

为了确保 Pod 被调度到支持特定 RuntimeClass 的节点上,那组节点应该具有一个公共标签,然后由 runtimeclass.scheduling.nodeSelector 字段选择该标签。RuntimeClass 的 nodeSelector 在调度时与 Pod 的 nodeSelector 合并,有效地进行节点选择,并且调度到相应节点。如果有冲突,则将拒绝该 Pod 被调度。

如果受支持的节点被污染以防止其他 RuntimeClass 容器在该节点上运行,则可以向RuntimeClass添加 tolerations 设定。与 nodeSelector 一样,容忍度在接纳时与容器的容忍度合并,从而有效地吸收了每个容忍度的节点集的并集。

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

Pod 开销

FEATURE STATE: Kubernetes v1.16feature-state-alpha.txtThis feature is currently in a alpha state, meaning:

  • The version names contain alpha (e.g. v1alpha1).
  • Might be buggy. Enabling the feature may expose bugs. Disabled by default.
  • Support for feature may be dropped at any time without notice.
  • The API may change in incompatible ways in a later software release without notice.
  • Recommended for use only in short-lived testing clusters, due to increased risk of bugs and lack of long-term support.

从 Kubernetes v1.16 开始,RuntimeClass 包含了对指定与运行 Pod 相关的开销的支持,这是Pod 开销功能的一部分。要使用 PodOverhead ,您必须确保 PodOverhead 功能 已启用(默认情况下处于关闭状态)。

Pod 的开销是在 RuntimeClass 中通过 Overhead 字段定义的。 通过使用这些字段,您可以使用此 RuntimeClass 指定运行 Pod 的开销,并确保在Kubernetes中考虑了这些开销。

将 RuntimeClass 从 Alpha 升级到 Beta

RuntimeClass Beta 功能包括以下更改:

  • node.k8s.io API 组和 runtimeclasses.node.k8s.io 资源已从 CustomResourceDefinition 迁移到内置API。
  • 已在 RuntimeClass 定义中内联了 spec(即不再有RuntimeClassSpec)。
  • runtimeHandler 字段已重命名为 handler
  • 所有 API 版本中现在都需要 handler 字段。 这意味着 Alpha API 中的 runtimeHandler 字段也是必须设定项。
  • handler字段必须是有效的DNS标签(RFC 1123),这意味着它不再包含 . 字符(在所有版本中)。有效的处理程序匹配以下正则表达式:^ [a-z0-9]([-a-z0-9] * [a-z0-9])?$

需要采取的措施: 要从 RuntimeClass 功能的 Alpha 版本升级到 Beta 版本,需要执行以下操作:

  • 在升级到v1.14之后,必须重新创建 RuntimeClass 资源,并且应该手动删除 runtimeclasses.node.k8s.io 的 CRD:
  1. kubectl delete customresourcedefinitions.apiextensions.k8s.io runtimeclasses.node.k8s.io
  • 在处理程序中具有未指定或为空的 runtimeHandler 字段或使用 . 字符的 Alpha RuntimeClass 不再有效,必须将其迁移到有效的处理程序配置中(请参见上文)。

进一步阅读

反馈

此页是否对您有帮助?

感谢反馈。如果您有一个关于如何使用 Kubernetes 的特定的、需要答案的问题,可以访问Stack Overflow.在 GitHub 仓库上登记新的问题报告问题或者提出改进建议.