说明

PodPreset 准入控制器,当启用后,PodPreset 会将应用创建请求传入到该控制器上

当有 Pod 创建请求发生时,系统将执行以下操作:

  • 检索所有可用的 PodPreset
  • 检查有 PodPreset 的标签选择器上的标签与正在创建的 Pod 上的标签是否匹配
  • 尝试将由 PodPreset 定义的各种资源合并到正在创建的 Pod 中
  • 出现错误时,在该 Pod 上引发记录合并错误的事件,PodPreset 不会注入任何资源到创建的 Pod 中
  • 注释刚生成的修改过的 Pod spec,以表明它已被 PodPreset 修改过。注释的格式为

    podpreset.admission.kubernetes.io/podpreset-“: “

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

可能在某些情况下,希望 Pod 不会被任何 Pod Preset 所改变。可以在 Pod 的 Pod Spec 中添加上这样一个 annotation:podpreset.admission.kubernetes.io/exclude:”true”

启用

APIServer 启动参数中添加如下配置:

  • —enable-admission-plugins=NodeRestriction,PodPreset
    - —runtime-config=settings.k8s.io/v1alpha1=true
    image.png

    示例:预设 时间同步

    1. time-preset.yaml
    2. apiVersion: settings.k8s.io/v1alpha1
    3. kind: PodPreset
    4. metadata:
    5. name: time-preset
    6. namespace: default
    7. spec:
    8. selector:
    9. matchLabels:
    10. volumeMounts:
    11. - name: localtime
    12. mountPath: /etc/localtime
    13. volumes:
    14. - name: localtime
    15. hostPath:
    16. path: /etc/localtime
  1. time-pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: time-pod
  6. labels:
  7. app: time
  8. spec:
  9. containers:
  10. - name: time-pod-nginx
  11. image: nginx
  12. ports:
  13. - containerPort: 80