kustomize 是 sig-cli 的一個子項(xiàng)目般渡,它的設(shè)計目的是給 kubernetes 的用戶提供一種可以重復(fù)使用配置的聲明式應(yīng)用管理况既,從而在配置工作中用戶只需要管理和維護(hù) kubernetes 的原>生 API 對象,而不需要使用復(fù)雜的模版。詳細(xì)介紹請見kustomize 初體驗(yàn).
在之前介紹中接奈,我們學(xué)習(xí)到了 kustomize 可以為一組 k8s API 對象添加共同的名稱前綴咐柜。 類似地兼蜈,在 k8s 應(yīng)用的管理和維護(hù)中,我們通常需要給一組互相關(guān)聯(lián)的 API 對象添加共同的標(biāo)注和注
釋拙友,以記錄它所處的環(huán)境或應(yīng)用为狸。比如在一個應(yīng)用中,包含兩個 MySQL 的數(shù)據(jù)庫遗契,其中一個為微服務(wù) foo 提供數(shù)據(jù)而另
一個為微服務(wù) bar 提供數(shù)據(jù)辐棒。我們可以為這兩組 MySQL 的 API 添加標(biāo)注或注釋,從而得到如下效果
foo所對應(yīng)的MySQL
labels:
app: foo
annotation:
application: foo
bar所對應(yīng)的MySQL
labels:
app: bar
annotation:
application: bar
當(dāng)應(yīng)用規(guī)模很小,僅有幾個微服務(wù)時漾根,我們可以手動給每一個API對象添加標(biāo)注和注釋泰涂。當(dāng)應(yīng)用規(guī)模擴(kuò)大到幾十甚至上百>個為服務(wù)時,依次為每一個 API 對象添加標(biāo)注和注釋就會變得繁雜和不易維護(hù)辐怕。我們需要一種能簡單易行的方法來添加>和更改標(biāo)注或注釋逼蒙。而 kustomize 恰恰提供了這種簡單方便的標(biāo)注使用。這篇文章將通過一個 MySQL 實(shí)例來詳細(xì)介紹和
展示 kustomize 在標(biāo)注和注釋方面的功能寄疏。
可以通過如下兩種不同方式來安裝 kustomize
下載壓縮包是牢,kustomize 提供Linux,Darwin陕截,和windows三個版本的壓縮包驳棱。
如果本地機(jī)器Go的版本在1.10.1以上,可以通過 go get 來直接安裝
Go get github.com/kubernetes-sigs/kustomize
首先來創(chuàng)建一個 MySQL 的 base艘策。base 包含了若干 YAML 文件蹈胡,這些文件聲明了部署一個MySQL數(shù)據(jù)庫所需要的全部 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 包含如下內(nèi)容
resources:
-deployment.yaml
-service.yaml
-configmap.yaml
運(yùn)行 kustomize build $BASE
罚渐,將得到如下輸出。
apiVersion: v1
data:
password: admin
kind: ConfigMap
metadata:
name: mysql-pass
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
spec:
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
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 應(yīng)用由三個k8s API對象所組成:
- ConfigMap
- Deployment
- Service
其中 Deployment 對象通過 configMapKeyRef 來讀取 ConfigMap 中的定義的 password驯妄,然后講環(huán)境變量 MYSQL_ROOT_PASSWORD 設(shè)為這個password荷并。
打開 $BASE/kustomization.yaml, 添加標(biāo)注和注釋
commonLabels:
app: foo
team: Beijing
commonAnnotations:
application: foo
owners: Xiaoming,Damao
運(yùn)行 kustomize build $BASE
青扔, 將得到如下輸出
apiVersion: v1
data:
password: admin
kind: ConfigMap
metadata:
annotations:
application: foo
owners: Xiaoming,Damao
labels:
app: foo
team: Beijing
name: mysql-pass
---
apiVersion: v1
kind: Service
metadata:
annotations:
application: foo
owners: Xiaoming,Damao
labels:
app: foo
team: Beijing
name: mysql
spec:
ports:
- port: 3306
selector:
app: foo
team: Beijing
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
application: foo
owners: Xiaoming,Damao
labels:
app: foo
team: Beijing
name: mysql
spec:
selector:
matchLabels:
app: foo
team: Beijing
strategy:
type: Recreate
template:
metadata:
annotations:
application: foo
owners: Xiaoming,Damao
labels:
app: foo
team: Beijing
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
key: password
name: mysql-pass
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
通過在 kustomization.yaml 添加標(biāo)注和注釋源织,該 MySQL 應(yīng)用中的三個對象都添加了同樣的標(biāo)注和注釋。
【總結(jié)】kustomize支持添加標(biāo)注和注釋微猖,這些標(biāo)注和注釋會加在每一個它所管理的API對象上谈息。Kustomize還會相應(yīng)地更>新API對象的matchLabels。在實(shí)踐中凛剥,針對不同的環(huán)境或應(yīng)用場景侠仇,用戶可以設(shè)置不同的標(biāo)注和注釋。