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
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 |
