kubernetes實踐之五十七:PodPreset
一:簡介
PodPreset 資源物件只有 kubernetes 1.8 以上版本才支援。Preset 就是預設,有時候想要讓一批容器在啟動的時候就注入一些資訊,比如 secret、volume、volume mount 和環境變數,而又不想一個一個的改這些 Pod 的 tmeplate,這時候就可以用到 PodPreset 這個資源物件了。該物件用來在 Pod 建立的時候向 Pod 中注入某些特定資訊。該資訊可以包括 secret、volume、volume mount 和環境變數。
Pod Preset 是用來在 Pod 被建立的時候向其中注入額外的執行時需求的 API 資源。可以使用 label selector 來指定為哪些 Pod 應用 Pod Preset。使用 Pod Preset 使得 pod 模板的作者可以不必為每個 Pod 明確提供所有資訊。這樣一來,pod 模板的作者就不需要知道關於該服務的所有細節。
二:開啟PodPreset
1.開啟API:在apiserver配置檔案中增加--runtime-config=settings.k8s.io/v1alpha1/podpreset
2.開啟准入控制器:在apiserver配置檔案中增加--admission-control=PodPreset
三:PodPreset工作機制
當有 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 可以應用於零個或多個 Pod。 PodPreset 應用於一個或多個 Pod 時,Kubernetes 會修改 Pod Spec。對於 Env、EnvFrom 和 VolumeMounts 的更改,Kubernetes 修改 Pod 中所有容器的容器 spec;對於 Volume 的更改,Kubernetes 修改 Pod Spec。
四:示例
1.增加環境變數和儲存卷的PodPreset
PodPreset
使用者提交的Pod
經過准入控制PodPreset後,Pod會自動增加環境變數和儲存卷
2.ConfigMap示例
使用者提交的Pod
經過准入控制 PodPreset後,Pod會自動增加ConfigMap環境變數
PodPreset 資源物件只有 kubernetes 1.8 以上版本才支援。Preset 就是預設,有時候想要讓一批容器在啟動的時候就注入一些資訊,比如 secret、volume、volume mount 和環境變數,而又不想一個一個的改這些 Pod 的 tmeplate,這時候就可以用到 PodPreset 這個資源物件了。該物件用來在 Pod 建立的時候向 Pod 中注入某些特定資訊。該資訊可以包括 secret、volume、volume mount 和環境變數。
Pod Preset 是用來在 Pod 被建立的時候向其中注入額外的執行時需求的 API 資源。可以使用 label selector 來指定為哪些 Pod 應用 Pod Preset。使用 Pod Preset 使得 pod 模板的作者可以不必為每個 Pod 明確提供所有資訊。這樣一來,pod 模板的作者就不需要知道關於該服務的所有細節。
二:開啟PodPreset
1.開啟API:在apiserver配置檔案中增加--runtime-config=settings.k8s.io/v1alpha1/podpreset
2.開啟准入控制器:在apiserver配置檔案中增加--admission-control=PodPreset
三:PodPreset工作機制
當有 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 可以應用於零個或多個 Pod。 PodPreset 應用於一個或多個 Pod 時,Kubernetes 會修改 Pod Spec。對於 Env、EnvFrom 和 VolumeMounts 的更改,Kubernetes 修改 Pod 中所有容器的容器 spec;對於 Volume 的更改,Kubernetes 修改 Pod Spec。
1.增加環境變數和儲存卷的PodPreset
PodPreset
點選(此處)摺疊或開啟
-
kind: PodPreset
-
apiVersion: settings.k8s.io/v1alpha1
-
metadata:
-
name: allow-database
-
namespace: myns
-
spec:
-
selector:
-
matchLabels:
-
role: frontend
-
env:
-
- name: DB_PORT
-
value: "6379"
-
volumeMounts:
-
- mountPath: /cache
-
name: cache-volume
-
volumes:
-
- name: cache-volume
- emptyDir: {}
點選(此處)摺疊或開啟
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: website
-
labels:
-
app: website
-
role: frontend
-
spec:
-
containers:
-
- name: website
-
image: ecorp/website
-
ports:
- - containerPort: 80
點選(此處)摺疊或開啟
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: website
-
labels:
-
app: website
-
role: frontend
-
annotations:
-
podpreset.admission.kubernetes.io/allow-database: "resource version"
-
spec:
-
containers:
-
- name: website
-
image: ecorp/website
-
volumeMounts:
-
- mountPath: /cache
-
name: cache-volume
-
ports:
-
- containerPort: 80
-
env:
-
- name: DB_PORT
-
value: "6379"
-
volumes:
-
- name: cache-volume
- emptyDir: {}
點選(此處)摺疊或開啟
-
apiVersion: v1
-
kind: ConfigMap
-
metadata:
-
name: etcd-env-config
-
data:
-
number_of_members: "1"
-
initial_cluster_state: new
-
initial_cluster_token: DUMMY_ETCD_INITIAL_CLUSTER_TOKEN
-
discovery_token: DUMMY_ETCD_DISCOVERY_TOKEN
-
discovery_url: http://etcd_discovery:2379
-
etcdctl_peers: http://etcd:2379
-
duplicate_key: FROM_CONFIG_MAP
- REPLACE_ME: "a value"
點選(此處)摺疊或開啟
-
kind: PodPreset
-
apiVersion: settings.k8s.io/v1alpha1
-
metadata:
-
name: allow-database
-
namespace: myns
-
spec:
-
selector:
-
matchLabels:
-
role: frontend
-
env:
-
- name: DB_PORT
-
value: 6379
-
- name: duplicate_key
-
value: FROM_ENV
-
- name: expansion
-
value: $(REPLACE_ME)
-
envFrom:
-
- configMapRef:
-
name: etcd-env-config
-
volumeMounts:
-
- mountPath: /cache
-
name: cache-volume
-
- mountPath: /etc/app/config.json
-
readOnly: true
-
name: secret-volume
-
volumes:
-
- name: cache-volume
-
emptyDir: {}
-
- name: secret-volume
- secretName: config-details
點選(此處)摺疊或開啟
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: website
-
labels:
-
app: website
-
role: frontend
-
spec:
-
containers:
-
- name: website
-
image: ecorp/website
-
ports:
- - containerPort: 80
點選(此處)摺疊或開啟
-
apiVersion: v1
-
kind: Pod
-
metadata:
-
name: website
-
labels:
-
app: website
-
role: frontend
-
annotations:
-
podpreset.admission.kubernetes.io/allow-database: "resource version"
-
spec:
-
containers:
-
- name: website
-
image: ecorp/website
-
volumeMounts:
-
- mountPath: /cache
-
name: cache-volume
-
- mountPath: /etc/app/config.json
-
readOnly: true
-
name: secret-volume
-
ports:
-
- containerPort: 80
-
env:
-
- name: DB_PORT
-
value: "6379"
-
- name: duplicate_key
-
value: FROM_ENV
-
- name: expansion
-
value: $(REPLACE_ME)
-
envFrom:
-
- configMapRef:
-
name: etcd-env-config
-
volumes:
-
- name: cache-volume
-
emptyDir: {}
-
- name: secret-volume
- secretName: config-details
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2156005/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- kubernetes實踐之十一:EFK
- kubernetes實踐之五十二:Helm
- kubernetes實踐之五十八:CronJob
- kubernetes實踐之十七:架構架構
- kubernetes實踐之十九:API概述API
- kubernetes實踐之六十:Cabin-Manage Kubernetes
- kubernetes實踐之五十九:NetworkPolicy
- kubernetes實踐之六十四:CoreDNSDNS
- kubernetes實踐之九:kube-dnsDNS
- kubernetes實踐之五:網路模型模型
- kubernetes實踐之五十六:雲原生
- kubernetes實踐之四十二:StatefulSet
- kubernetes生產實踐之redis-clusterRedis
- GitOps實踐之kubernetes安裝argocdGitGo
- kubernetes實踐之六十二:Secret 使用
- kubernetes實踐之六十三:使用技巧
- kubernetes實踐之六十五:Service Mesh
- kubernetes實踐之八:TLS bootstrappingTLSbootAPP
- kubernetes實踐之十二:部署Traefik Ingress
- kubernetes實踐之十四:Service Account與Secret
- kubernetes實踐之七十三:Istio之配置請求路由路由
- kubernetes實踐之七十二:Istio之策略與遙測
- kubernetes實踐之五十五:kubectl之配置kubeconfig
- kubernetes實踐之七十:Istio之流量管理(上)
- kubernetes實踐之六十七:Istio介紹
- kubernetes實踐之四十九:Scheduler原理分析
- kubernetes實踐之六:CFSSL構建本地CA
- kubernetes實踐之五:Node節點安裝
- kubernetes實踐之五十四:垃圾回收機制
- kubernetes實踐之十六:RBAC 角色訪問控制
- kubernetes實踐之四十三: Service詳解
- kubernetes實踐之十:Kubernetes-dashboard+Heapster+InfluxDB+GrafanaUXGrafana
- kubernetes實踐之七十一:Istio之流量管理(下)
- kubernetes實踐之六十八:部署 coredns 外掛DNS
- kubernetes實踐之六十一:kubectl port-forwardForward
- kubernetes實踐之四十七:ResourceQuota ControllerController
- kubernetes實踐之五十:kubelet執行機制分析
- kubernetes實踐之五十三:Service中的故障排查