標籤:

k8s kustomize 使用指南:名字前綴

k8s kustomize 使用指南:名字前綴

來自專欄 Kubernetes指南4 人贊了文章

kustomize是sig-cli的一個子項目,它的設計目的是為kubernetes提供一種可以重複使用配置的聲明式應用管理,從而在配置工作中用戶只需要管理和維護kubernetes的原生API對象,不需要使用複雜的模版。詳細介紹請見 kustomize 初體驗.

kustomize支持對它所管理的API對象設置共同的名字前綴。基於不同的名字前綴,用戶可以很容易地確定API對象所在的應用,區分API對象所處的環境。名字前綴使用起來修改簡單,效果直觀,同時也極大地方便了其他的查找替換工具。這篇文章將通過一個MySQL實例來詳細介紹和展示名字前綴的使用。

可以通過如下兩種不同方式來安裝kustomize

  • 下載壓縮包,kustomize提供Linux,Darwin,和windows三個版本的壓縮包。

[kubernetes-sigs/kustomize](kubernetes-sigs/kustomize)

  • 如果本地機器 go 的版本在 1.10.1 以上,可以通過 go get 來直接安裝

    go get kubernetes-sigs/kustomize

首先來創建一個MySQL的base。base包含了若干 yaml 文件,這些文件聲明了部署一個MySQL資料庫所需要的全部API對象。

BASE=$(mktemp -d)CONTENT="https://raw.githubusercontent.com/Liujingfang1/mysql/master"curl -s -o "$BASE/#1.yaml" "$CONTENT//{deployment,service,configmap,kustomization}.yaml"

將這些文件下載到本地之後,我們可以看到 $BASE/kustomization.yaml 文件包含如下內容

resources:- configmap.yaml- deployment.yaml- service.yaml

運行kustomize build $BASE,將得到如下輸出

apiVersion: v1data: password: adminkind: ConfigMapmetadata: name: mysql-pass-6k8k9b6fdh---apiVersion: v1kind: Servicemetadata: labels: app: mysql name: mysqlspec: ports: - port: 3306 selector: app: mysql---apiVersion: apps/v1beta2kind: Deploymentmetadata: labels: app: mysql name: mysqlspec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - env: - name: MYSQL_ROOT_PASSWORD valueFrom: configMapKeyRef: key: password name: mysql-pass-6k8k9b6fdh image: mysql:5.6 name: mysql ports: - containerPort: 3306 name: mysql volumeMounts: - mountPath: /var/lib/mysql name: mysql-persistent-storage volumes: - emptyDir: {} name: mysql-persistent-storage

可以看到這個MySQL應用由三個kubernetes API對象所組成:

  • ConfigMap: mysql-pass-6k8k9b6fdh
  • Deployment: mysql
  • Service: mysql

其中Deployment對象通過configMapKeyRef來讀取 ConfigMap 中的定義的 password,然後將環境變數MYSQL_ROOT_PASSWORD 設為這個 password。

打開$BASE/kustomization.yaml文件, 添加如下一行從而為MySQL 的 base 設置一個名字前綴

namePrefix: my-

運行customize build $BASE, 將得到如下輸出

apiVersion: v1data: password: adminkind: ConfigMapmetadata: name: my-mysql-pass-ft95hb7hbb---apiVersion: v1kind: Servicemetadata: labels: app: mysql name: my-mysqlspec: ports: - port: 3306 selector: app: mysql---apiVersion: apps/v1beta2kind: Deploymentmetadata: labels: app: mysql name: my-mysqlspec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - env: - name: MYSQL_ROOT_PASSWORD valueFrom: configMapKeyRef: key: password name: my-mysql-pass-ft95hb7hbb image: mysql:5.6 name: mysql ports: - containerPort: 3306 name: mysql volumeMounts: - mountPath: /var/lib/mysql name: mysql-persistent-storage volumes: - emptyDir: {} name: mysql-persistent-storage

通過設置名字前綴,該 MySQL 應用中的三個對象的名字都添加了同樣的前綴。

  • configmap: my-mysql-pass-ft95hb7hbb
  • deployment: my-mysql
  • service: my-mysql

值得注意的是,在 Deployment 對象中,引用 ConfigMap 的地方也添加了同樣的前綴。假如kustomize在更改 ConfigMap 名字的時候,沒有相應地更改此處的引用,就會導致下面的情況發生。我們聲明了一個名字是 my-mysql-pass-ft95hb7hbb 的 ConfigMap,而Deployment對象卻需要一個名字是 mysql-pass-6k8k9b6fdh 的 ConfigMap。 mysql-pass-6k8k9b6fdh 並沒有被聲明,就會導致在部署該應用的時候出現錯誤。kustomize通過更新所有 ConfigMap 被引用的地方,從而避免了這樣的錯誤發生。

【總結】kustomize支持設置名字前綴,這個前綴會被加在每一個它所管理的API對象上,kustomize 還會相應更新這些對象的每一個引用,從而避免了在部署的時候發生名字不匹配的錯誤。在實踐中,針對不同的環境或應用場景,用戶可以設置不同的前綴,比如在開發環境下使用 dev前綴,在生產環境下使用 prod 前綴。

參考資料

introducing-kustomize-template-free-configuration-customization-for-kubernetes

kubernetes-sigs/kustomize

推薦閱讀:

關於 docker 的網路,你需要知道的事情
openshift s2i 漏洞小窺
Kubernetes中的CI/CD——TheNewStack的報告解讀
華為雲在 K8S 大規模場景下的 Service 性能優化實踐
Kubernetes中文指南/雲原生應用架構實踐手冊v1.3發布

TAG:Kubernetes |