Files
website/content/zh/docs/concepts/containers/runtime-class.md
T
2018-11-22 05:09:57 -08:00

7.8 KiB
Raw Blame History

reviewers, title, content_template, weight
reviewers title content_template weight
tallclair
dchen1107
Runtime Class templates/concept 20

{{% capture overview %}}

{{< feature-state for_k8s_version="v1.12" state="alpha" >}}

本页面讨论的是 RuntimeClass 资源和运行时选择的机制问题。

{{% /capture %}}

{{< toc >}}

{{% capture body %}}

RuntimeClass

RuntimeClass 是一个 alpha 功能,用来选择容器运行时,运行 pod 的容器。

设置

作为一个 alpha 功能,必须要完成以下设置步骤才能使用 RuntimeClass 功能:

  1. 开启 RuntimeClass 功能门(feature gate (在 apiservers 和 kubelets 上,需要版本号 1.12 以上)
  2. 安装 RuntimeClass CRD
  3. 在节点上配置 CRI 实现(运行时依赖)
  4. 创建相应的 RuntimeClass 资源

1. 开启 RuntimeClass 功能门

参见功能门,了解如何开启功能门。 RuntimeClass 功能门必须要在 apiservers kubelets 上同时开启,才能使用。

2. 安装 RuntimeClass CRD

RuntimeClass [CustomResourceDefinition][/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/] (CRD) 可以在 Kubernetes git 仓库下的 addons 路径下找到:

https://github.com/kubernetes/kubernetes/tree/release-1.12/cluster/addons/runtimeclass/runtimeclass_crd.yaml

安装 CRD 只需要 kubectl apply -f runtimeclass_crd.yaml 一条命令。

[CustomResourceDefinition][/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/]

3. 在节点上配置 CRI 实现

和 RuntimeClass 的相关配置都和 CRI 的实现有关。参见 CRI 实现的相关文档,了解如何进行配置。 由于这是 alpha 功能,并不是所有的 CRI 都能支持多个 RuntimeClass。

{{< note >}}

注意: RuntimeClass 当前假设的是集群中的节点配置是同构的(换言之,所有的节点在容器运行时方面的配置是相同的)。 任何异构(不同的配置)必须要通过调度功能,在 RuntimeClass 之外单独管理 (参见 在节点上分配 Pods)。

{{< /note >}}

所有的配置都有相应的 RuntimeHandler 名,被 RuntimeClass 引用。 RuntimeHandler 的名字必须是合法的 DNS 1123 子域名 (alpha-numeric + - and . characters)

4. 创建相应的 RuntimeClass 资源

步骤3中的配置设置应该有相应的 RuntimeHandler 名,用来标识配置。 对应每个 RuntimeHandler (或者空 "" handler),创建相应的 RuntimeClass 对象。

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

apiVersion: node.k8s.io/v1alpha1  # 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
spec:
  runtimeHandler: myconfiguration  # The name of the correpsonding CRI configuration

{{< note >}}

注意::通常推荐的是 RuntimeClass 写操作 (create/update/patch/delete)应仅限于集群管理员使用。 这也是默认配置。更多细节,参见 [授权概览](https://kubernetes.io/docs/reference/access-authn-authz/authorization/

{{< /note >}}

使用

一旦完成集群中 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 功能被禁用。

{{% /capture %}}