kubernetes實踐之五十七:PodPreset

百聯達發表於2018-06-12
一:簡介

    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

點選(此處)摺疊或開啟

  1. kind: PodPreset
  2. apiVersion: settings.k8s.io/v1alpha1
  3. metadata:
  4.   name: allow-database
  5.   namespace: myns
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       role: frontend
  10.   env:
  11.     - name: DB_PORT
  12.       value: "6379"
  13.   volumeMounts:
  14.     - mountPath: /cache
  15.       name: cache-volume
  16.   volumes:
  17.     - name: cache-volume
  18.       emptyDir: {}
使用者提交的Pod

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: website
  5.   labels:
  6.     app: website
  7.     role: frontend
  8. spec:
  9.   containers:
  10.     - name: website
  11.       image: ecorp/website
  12.       ports:
  13.         - containerPort: 80
經過准入控制PodPreset後,Pod會自動增加環境變數和儲存卷

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: website
  5.   labels:
  6.     app: website
  7.     role: frontend
  8.   annotations:
  9.     podpreset.admission.kubernetes.io/allow-database: "resource version"
  10. spec:
  11.   containers:
  12.     - name: website
  13.       image: ecorp/website
  14.       volumeMounts:
  15.         - mountPath: /cache
  16.           name: cache-volume
  17.       ports:
  18.         - containerPort: 80
  19.       env:
  20.         - name: DB_PORT
  21.           value: "6379"
  22.   volumes:
  23.     - name: cache-volume
  24.       emptyDir: {}
2.ConfigMap示例

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: etcd-env-config
  5. data:
  6.   number_of_members: "1"
  7.   initial_cluster_state: new
  8.   initial_cluster_token: DUMMY_ETCD_INITIAL_CLUSTER_TOKEN
  9.   discovery_token: DUMMY_ETCD_DISCOVERY_TOKEN
  10.   discovery_url: http://etcd_discovery:2379
  11.   etcdctl_peers: http://etcd:2379
  12.   duplicate_key: FROM_CONFIG_MAP
  13.   REPLACE_ME: "a value"

點選(此處)摺疊或開啟

  1. kind: PodPreset
  2. apiVersion: settings.k8s.io/v1alpha1
  3. metadata:
  4.   name: allow-database
  5.   namespace: myns
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       role: frontend
  10.   env:
  11.     - name: DB_PORT
  12.       value: 6379
  13.     - name: duplicate_key
  14.       value: FROM_ENV
  15.     - name: expansion
  16.       value: $(REPLACE_ME)
  17.   envFrom:
  18.     - configMapRef:
  19.         name: etcd-env-config
  20.   volumeMounts:
  21.     - mountPath: /cache
  22.       name: cache-volume
  23.     - mountPath: /etc/app/config.json
  24.       readOnly: true
  25.       name: secret-volume
  26.   volumes:
  27.     - name: cache-volume
  28.       emptyDir: {}
  29.     - name: secret-volume
  30.       secretName: config-details
使用者提交的Pod

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: website
  5.   labels:
  6.     app: website
  7.     role: frontend
  8. spec:
  9.   containers:
  10.     - name: website
  11.       image: ecorp/website
  12.       ports:
  13.         - containerPort: 80
經過准入控制 PodPreset後,Pod會自動增加ConfigMap環境變數

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: website
  5.   labels:
  6.     app: website
  7.     role: frontend
  8.   annotations:
  9.     podpreset.admission.kubernetes.io/allow-database: "resource version"
  10. spec:
  11.   containers:
  12.     - name: website
  13.       image: ecorp/website
  14.       volumeMounts:
  15.         - mountPath: /cache
  16.           name: cache-volume
  17.         - mountPath: /etc/app/config.json
  18.           readOnly: true
  19.           name: secret-volume
  20.       ports:
  21.         - containerPort: 80
  22.       env:
  23.         - name: DB_PORT
  24.           value: "6379"
  25.         - name: duplicate_key
  26.           value: FROM_ENV
  27.         - name: expansion
  28.           value: $(REPLACE_ME)
  29.       envFrom:
  30.         - configMapRef:
  31.           name: etcd-env-config
  32.   volumes:
  33.     - name: cache-volume
  34.       emptyDir: {}
  35.     - name: secret-volume
  36.       secretName: config-details


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2156005/,如需轉載,請註明出處,否則將追究法律責任。

相關文章