kustomize 是 sig-cli 的一个子项目,它的设计目的是给 kubernetes 的用户提供一种可以重复使用配置的声明式应用管理,从而在配置工作中用户只需要管理和维护 kubernetes 的原>生 API 对象,而不需要使用复杂的模版。详细介绍请见kustomize 初体验.
在之前介绍中,我们学习到了 kustomize 可以为一组 k8s API 对象添加共同的名称前缀。 类似地,在 k8s 应用的管理和维护中,我们通常需要给一组互相关联的 API 对象添加共同的标注和注
释,以记录它所处的环境或应用。比如在一个应用中,包含两个 MySQL 的数据库,其中一个为微服务 foo 提供数据而另
一个为微服务 bar 提供数据。我们可以为这两组 MySQL 的 API 添加标注或注释,从而得到如下效果
foo所对应的MySQL
labels:
app: foo
annotation:
application: foo
bar所对应的MySQL
labels:
app: bar
annotation:
application: bar
当应用规模很小,仅有几个微服务时,我们可以手动给每一个API对象添加标注和注释。当应用规模扩大到几十甚至上百>个为服务时,依次为每一个 API 对象添加标注和注释就会变得繁杂和不易维护。我们需要一种能简单易行的方法来添加>和更改标注或注释。而 kustomize 恰恰提供了这种简单方便的标注使用。这篇文章将通过一个 MySQL 实例来详细介绍和
展示 kustomize 在标注和注释方面的功能。
可以通过如下两种不同方式来安装 kustomize
下载压缩包,kustomize 提供Linux,Darwin,和windows三个版本的压缩包。
如果本地机器Go的版本在1.10.1以上,可以通过 go get 来直接安装
Go get github.com/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:
-deployment.yaml
-service.yaml
-configmap.yaml
运行 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 应用由三个k8s API对象所组成:
- ConfigMap
- Deployment
- Service
其中 Deployment 对象通过 configMapKeyRef 来读取 ConfigMap 中的定义的 password,然后讲环境变量 MYSQL_ROOT_PASSWORD 设为这个password。
打开 $BASE/kustomization.yaml, 添加标注和注释
commonLabels:
app: foo
team: Beijing
commonAnnotations:
application: foo
owners: Xiaoming,Damao
运行 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 添加标注和注释,该 MySQL 应用中的三个对象都添加了同样的标注和注释。
【总结】kustomize支持添加标注和注释,这些标注和注释会加在每一个它所管理的API对象上。Kustomize还会相应地更>新API对象的matchLabels。在实践中,针对不同的环境或应用场景,用户可以设置不同的标注和注释。
参考资料
kubernetes-sigs/kustomize
Kustomize blogpost