kustomize是sig-cli的一个子项目,它的设计目的是为kubernetes提供一种可以重复使用配置的声明式应用管理,从而在配置工作中用户只需要管理和维护kubernetes的原生API对象,不需要使用复杂的模版。详细介绍请见 kustomize 初体验.
kustomize支持对它所管理的API对象设置共同的名字前缀。基于不同的名字前缀,用户可以很容易地确定API对象所在的应用,区分API对象所处的环境。名字前缀使用起来修改简单,效果直观,同时也极大地方便了其他的查找替换工具。这篇文章将通过一个MySQL实例来详细介绍和展示名字前缀的使用。
可以通过如下两种不同方式来安装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:
- configmap.yaml
- deployment.yaml
- service.yaml
运行kustomize build $BASE
,将得到如下输出
apiVersion: v1
data:
password: admin
kind: ConfigMap
metadata:
name: mysql-pass-6k8k9b6fdh
---
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-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: v1
data:
password: admin
kind: ConfigMap
metadata:
name: my-mysql-pass-ft95hb7hbb
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: my-mysql
spec:
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
app: mysql
name: my-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: 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
github.com/kubernetes-sigs/kustomize
网友评论