pod-preset


weight: 19 title: Pod Preset date: “2022-05-21T00:00:00+08:00” type: book

Preset就是预设,有时候想要让一批容器在启动的时候就注入一些信息,比如secret、volume、volume mount和环境变量,而又不想一个一个的改这些Podtemplate,这时候就可以用到PodPreset这个资源对象了。

本页是关于PodPreset的概述,该对象用来在Pod创建的时候向Pod中注入某些特定信息。该信息可以包括secret、volume、volume mount和环境变量。

理解Pod Preset

Pod Preset 是用来在Pod被创建的时候向其中注入额外的运行时需求的API资源。

您可以使用 label selector 来指定为哪些Pod应用Pod Preset

使用Pod Preset使得pod模板的作者可以不必为每个Pod明确提供所有信息。这样一来,pod模板的作者就不需要知道关于该服务的所有细节。

关于该背景的更多信息,请参阅 PodPreset的设计方案

如何工作

Kubernetes提供了一个准入控制器(PodPreset,当其启用时,Pod Preset会将应用创建请求传入到该控制器上。当有Pod创建请求发生时,系统将执行以下操作:

  1. 检索所有可用的 PodPresets
  2. 检查PodPreset标签选择器上的标签,看看其是否能够匹配正在创建的Pod上的标签。
  3. 尝试将由 PodPreset 定义的各种资源合并到正在创建的Pod中。
  4. 出现错误时,在该Pod上引发记录合并错误的事件,PodPreset不会注入任何资源到创建的Pod中。
  5. 注释刚生成的修改过的Pod spec,以表明它已被PodPreset修改过。注释的格式为 podpreset.admission.kubernetes.io/podpreset-<pod-preset name>": "<resource version>"

每个Pod可以匹配零个或多个Pod Prestet;并且每个 PodPreset 可以应用于零个或多个PodPodPreset 应用于一个或多个Pod时,Kubernetes会修改Pod Spec。对于 EnvEnvFromVolumeMounts 的更改,Kubernetes修改Pod中所有容器的容器spec;对于 Volume 的更改,Kubernetes修改Pod Spec

注意Pod Preset可以在适当的时候修改Pod spec中的 spec.containers 字段。Pod Preset中的资源定义将不会应用于 initContainers 字段。

禁用特定PodPod Preset

在某些情况下,您可能不希望Pod被任何Pod Preset所改变。在这些情况下,您可以在PodPod Spec中添加注释:podpreset.admission.kubernetes.io/exclude:"true"

启用Pod Preset

为了在集群中使用Pod Preset,您必须确保以下内容:

  1. 您已启用settings.k8s.io/v1alpha1/podpresetAPI类型。例如,可以通过在API server--runtime-config 选项中包含 settings.k8s.io/v1alpha1=true 来完成此操作。
  2. 您已启用 PodPreset 准入控制器。一种方法是将 PodPreset 包含在为API server指定的 --admission-control 选项值中。
  3. 您已经在要使用的命名空间中通过创建 PodPreset 对象来定义 PodPreset
上一页
下一页