容器编排技术 -- Kubernetes 使用 PodPreset 将信息注入 Pods

  • 1 什么是 Pod Preset?
  • 2 准入控制
    • 2.1 行为
  • 3 启用 Pod Preset
  • 4 为 Pod 禁用 Pod Preset
  • 5 创建 Pod Preset
    • 5.1 简单的 Pod Spec 示例
    • 5.2 带有 ConfigMap 的 Pod Spec 示例
    • 5.3 带有 Pod Spec 的 ReplicaSet 示例
    • 5.4 多 PodPreset 示例
    • 5.5 冲突示例
  • 6 删除 Pod Preset

在 pod 创建时,用户可以使用 podpreset 对象将特定信息注入 pod 中,这些信息可以包括 secret、 卷、 卷挂载和环境变量。

查看 PodPreset 提案 了解更多信息。

什么是 Pod Preset?

Pod Preset 是一种 API 资源,在 pod 创建时,用户可以用它将额外的运行时需求信息注入 pod。 使用标签选择器(label selector)来指定 Pod Preset 所适用的 pod。 查看更多关于 标签选择器 的信息。

使用 Pod Preset 使得 pod 模板编写者不必显式地为每个 pod 设置信息。 这样,使用特定服务的 pod 模板编写者不需要了解该服务的所有细节。

准入控制

准入控制 是指 Kubernetes 如何将 Pod Preset 应用于接收到的创建请求中。 当出现创建请求时,系统会执行以下操作:

  1. 检索全部可用 PodPresets 。
  2. 对 PodPreset 的标签选择器和要创建的 pod 进行匹配。
  3. 尝试合并 PodPreset 中定义的各种资源,并注入要创建的 pod。
  4. 发生错误时抛出事件,该事件记录了 pod 信息合并错误,同时_不注入_ PodPreset 信息创建 pod。

行为

当 PodPreset 应用于一个或多个 Pod 时, Kubernetes 修改 pod spec。 对于 Env、 EnvFrom 和 VolumeMounts 的改动, Kubernetes 修改 pod 中所有容器的规格, 对于卷的改动,Kubernetes 修改 Pod spec。

Kubernetes 为改动的 pod spec 添加注解,来表明它被 PodPreset 所修改。 注解形如: podpreset.admission.kubernetes.io/podpreset-<pod-preset name>": "<resource version>"。

启用 Pod Preset

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

  1. 已启用 api 类型 settings.k8s.io/v1alpha1/podpreset
  2. 已启用准入控制器 PodPreset
  3. 已定义 pod preset

为 Pod 禁用 Pod Preset

在一些情况下,用户不希望 pod 被 pod preset 所改动,这时,用户可以在 pod spec 中添加形如 podpreset.admission.kubernetes.io/exclude: "true" 的注解。

创建 Pod Preset

简单的 Pod Spec 示例

这里是一个简单的示例,展示了如何通过 Pod Preset 修改 Pod spec 。

用户提交的 pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontend
spec:containers:- name: websiteimage: ecorp/websiteports:- containerPort: 80

Pod Preset 示例:

kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:name: allow-databasenamespace: myns
spec:selector:matchLabels:role: frontendenv:- name: DB_PORTvalue: "6379"volumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}

通过准入控制器后的 Pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontendannotations:podpreset.admission.kubernetes.io/podpreset-allow-database: "resource version"
spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volumeports:- containerPort: 80env:- name: DB_PORTvalue: "6379"volumes:- name: cache-volumeemptyDir: {}

带有 ConfigMap 的 Pod Spec 示例

这里的示例展示了如何通过 Pod Preset 修改 Pod spec,Pod Preset 中定义了 ConfigMap 作为环境变量取值来源。

用户提交的 pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontend
spec:containers:- name: websiteimage: ecorp/websiteports:- containerPort: 80

用户提交的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:name: etcd-env-config
data:number_of_members: "1"initial_cluster_state: newinitial_cluster_token: DUMMY_ETCD_INITIAL_CLUSTER_TOKENdiscovery_token: DUMMY_ETCD_DISCOVERY_TOKENdiscovery_url: http://etcd_discovery:2379etcdctl_peers: http://etcd:2379duplicate_key: FROM_CONFIG_MAPREPLACE_ME: "a value"

Pod Preset 示例:

kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:name: allow-databasenamespace: myns
spec:selector:matchLabels:role: frontendenv:- name: DB_PORTvalue: 6379- name: duplicate_keyvalue: FROM_ENV- name: expansionvalue: $(REPLACE_ME)envFrom:- configMapRef:name: etcd-env-configvolumeMounts:- mountPath: /cachename: cache-volume- mountPath: /etc/app/config.jsonreadOnly: truename: secret-volumevolumes:- name: cache-volumeemptyDir: {}- name: secret-volumesecret:secretName: config-details

通过准入控制器后的 Pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontendannotations:podpreset.admission.kubernetes.io/podpreset-allow-database: "resource version"
spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volume- mountPath: /etc/app/config.jsonreadOnly: truename: secret-volumeports:- containerPort: 80env:- name: DB_PORTvalue: "6379"- name: duplicate_keyvalue: FROM_ENV- name: expansionvalue: $(REPLACE_ME)envFrom:- configMapRef:name: etcd-env-configvolumes:- name: cache-volumeemptyDir: {}- name: secret-volumesecret:secretName: config-details

带有 Pod Spec 的 ReplicaSet 示例

以下示例展示了(通过 ReplicaSet 创建 pod 后)只有 pod spec 会被 Pod Preset 所修改。

用户提交的 ReplicaSet:

apiVersion: settings.k8s.io/v1alpha1
kind: ReplicaSet
metadata:name: frontend
spec:replicas: 3selector:matchLabels:tier: frontendmatchExpressions:- {key: tier, operator: In, values: [frontend]}template:metadata:labels:app: guestbooktier: frontendspec:containers:- name: php-redisimage: gcr.io/google_samples/gb-frontend:v3resources:requests:cpu: 100mmemory: 100Mienv:- name: GET_HOSTS_FROMvalue: dnsports:- containerPort: 80

Pod Preset 示例:

kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:name: allow-databasenamespace: myns
spec:selector:matchLabels:tier: frontendenv:- name: DB_PORTvalue: "6379"volumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}

通过准入控制器后的 Pod spec:

apiVersion: v1
kind: Pod
metadata:labels:app: guestbooktier: frontendannotations:podpreset.admission.kubernetes.io/podpreset-allow-database: "resource version"
spec:containers:- name: php-redisimage: gcr.io/google_samples/gb-frontend:v3resources:requests:cpu: 100mmemory: 100MivolumeMounts:- mountPath: /cachename: cache-volumeenv:- name: GET_HOSTS_FROMvalue: dns- name: DB_PORTvalue: "6379"ports:- containerPort: 80volumes:- name: cache-volumeemptyDir: {}

多 PodPreset 示例

这里的示例展示了如何通过多个 Pod 注入策略修改 Pod spec。

用户提交的 pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontend
spec:containers:- name: websiteimage: ecorp/websiteports:- containerPort: 80

Pod Preset 示例:

kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:name: allow-databasenamespace: myns
spec:selector:matchLabels:role: frontendenv:- name: DB_PORTvalue: "6379"volumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}

另一个 Pod Preset:

kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:name: proxynamespace: myns
spec:selector:matchLabels:role: frontendvolumeMounts:- mountPath: /etc/proxy/configsname: proxy-volumevolumes:- name: proxy-volumeemptyDir: {}

通过准入控制器后的 Pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontendannotations:podpreset.admission.kubernetes.io/podpreset-allow-database: "resource version"podpreset.admission.kubernetes.io/podpreset-proxy: "resource version"
spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volume- mountPath: /etc/proxy/configsname: proxy-volumeports:- containerPort: 80env:- name: DB_PORTvalue: "6379"volumes:- name: cache-volumeemptyDir: {}- name: proxy-volumeemptyDir: {}

冲突示例

这里的示例展示了 Pod Preset 与原 Pod 存在冲突时,Pod spec 不会被修改。

用户提交的 pod spec:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontend
spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volumeports:volumes:- name: cache-volumeemptyDir: {}- containerPort: 80

Pod Preset 示例:

kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:name: allow-databasenamespace: myns
spec:selector:matchLabels:role: frontendenv:- name: DB_PORTvalue: "6379"volumeMounts:- mountPath: /cachename: other-volumevolumes:- name: other-volumeemptyDir: {}

因存在冲突,通过准入控制器后的 Pod spec 不会改变:

apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websiterole: frontend
spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volumeports:- containerPort: 80volumes:- name: cache-volumeemptyDir: {}

如果运行 kubectl describe... 用户会看到以下事件:

$ kubectl describe ...
....
Events:FirstSeen             LastSeen            Count   From                    SubobjectPath               Reason      MessageTue, 07 Feb 2017 16:56:12 -0700   Tue, 07 Feb 2017 16:56:12 -0700 1   {podpreset.admission.kubernetes.io/podpreset-allow-database }    conflict  Conflict on pod preset. Duplicate mountPath /cache.

删除 Pod Preset

一旦用户不再需要 pod preset,可以使用 kubectl 进行删除:

$ kubectl delete podpreset allow-database
podpreset "allow-database" deleted

译者:lichuqiang / 原文链接

容器编排技术 -- Kubernetes 使用 PodPreset 将信息注入 Pods相关推荐

  1. 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息

    容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息 1 Before you begin 2 Downward API 3 使用 Pod 字段作为环境变量的值 4 使用容器 ...

  2. 容器编排技术 -- Kubernetes kubectl get 命令详解

    容器编排技术 -- Kubernetes kubectl get 命令详解 1 kubectl get 2 语法 3 示例 4 Flags kubectl get 获取列出一个或多个资源的信息. 可以 ...

  3. 容器编排技术 -- Kubernetes kubectl annotate 命令详解

    容器编排技术 -- Kubernetes kubectl annotate 命令详解 1 kubectl annotate 2 有效资源类型包括: 3 语法 4 示例 5 Flags kubectl ...

  4. 容器编排技术 -- Kubernetes kubectl 概述

    容器编排技术 -- Kubernetes kubectl 概述 1 语法 2 Operations 3 Resource types 4 输出选项 Output options 4.1 格式化输出 F ...

  5. 容器编排技术 -- Kubernetes Nodes

    容器编排技术 -- Kubernetes Nodes 1 Node是什么? 2 Node Status 2.1 Addresses 2.2 Phase 2.3 Condition 2.4 Capaci ...

  6. 容器编排技术 -- Kubernetes kubectl rollout history 命令详解

    容器编排技术 -- Kubernetes kubectl rollout history 命令详解 1 kubectl history 2 语法 3 示例 4 Flags kubectl histor ...

  7. 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解

    容器编排技术 -- Kubernetes kubectl create secret generic 命令详解 1 kubectl create secret generic 2 语法 3 示例 4  ...

  8. 容器编排技术 -- Kubernetes kubectl 命令表

    容器编排技术 -- Kubernetes kubectl 命令表 kubectl命令列表 kubectl run(创建容器镜像) kubectl expose(将资源暴露为新的 Service) ku ...

  9. 容器编排技术 -- Kubernetes kubectl create configmap 命令详解

    容器编排技术 -- Kubernetes kubectl create configmap 命令详解 1 kubectl  create configmap 2 语法 3 示例 4 Flags kub ...

最新文章

  1. Android JNI入门第六篇——基本数据类型使用
  2. 「后端小伙伴来学前端了」Vue中全局事件总线(GlobalEventBus)原理及探究过程
  3. 看似无聊的python小游戏 我却摸鱼上班玩了一下午!!
  4. 性能测试学习09_场景设计(一)
  5. UBUNTU中更改文件的打开方式
  6. C++ OpenCV光平面标定-线激光提取
  7. QT 打开选择文件对话框
  8. 雅虎被收购后,Tumblr 前途未卜,准备在所有博客中引入广告
  9. 大学四年总结——找工作是真的难
  10. SAP中寄售结算税码取值问题分析
  11. 液压比例阀放大器比例控制器比例阀放大板
  12. Anaconda 安装及配置
  13. 【记录】Tiff图像的前处理,median blur filter 及 linear stretch
  14. ORACLE如何学习
  15. java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
  16. C++--输出:保留两位小数
  17. python函数返回值和参数_python_函数参数和返回值
  18. 张驰课堂:2022年CAQ中质协六西格玛考试时间通知
  19. Nginx反向代理详解
  20. 论文阅读(数据集):The Extended Cohn-Kanade Dataset (CK+)

热门文章

  1. jQuery常用技巧大放送
  2. ADO.NET 命名规范
  3. 如何使用Pinterest新推出的功能Rich Pin
  4. UITableView 系列四 :项目中行的操作 (添加移动和删除)(实例)
  5. 30+ 新鲜惊奇的 jQuery 插件与教程
  6. 贪心——今年暑假不AC(hdu2037)
  7. LeetCode 69. Sqrt(x)
  8. 【NIPS2020】 Workshop List
  9. 【今日CS 视觉论文速览】Wed, 12 Dec 2018
  10. 【Linux学习】GDB调试器基本命令必知必会(一)