作者:艄公(杨京华)、雪尧(郭耀星)
这是我们的《Kubernetes资源编排系列》的第三篇——Kustomize篇,在上篇《Kubernetes资源编排系列之二:Helm篇》中,我们见识到了Helm强大的管理能力,但是Helm对于服务的定制仅限于预置变量,那么如果需要更多更灵活的YAML定制,有什么办法吗?于是本篇我们来介绍一下Kustomize。
一、 Kustomize是什么
Kustomize是一套采用合并思想,对Kubernetes原生配置进行管理的工具,使用无模板的方案定义应用配置。允许用户使用一系列的描述文件为基础,然后通过overlay的方式生成最终部署应用所需的描述文件。
Kustomize通过Base&Overlays方式维护不同环境的应用配置,在Overlay中描述差异来实现资源复用,管理的是Kubernetes原生YAML文件,不需要学习额外的DSL语法。
二、 Kustomize是怎么做的
Kustomize的文件结构如下:
app ├── base │ ├── deployment.yaml │ ├── service.yaml │ └── kustomization.yaml └── overlays ├── production │ └── kustomization.yaml ├── staging │ └── kustomization.yaml └── production-large └── kustomization.yam
|
app/base/kustomization.yaml声明资源及要应用于它们的一些自定义,如添加一个通用的标签,其内容如下。kustomization还提供了namePrefix、commonAnnoations、images等配置项。
commonLabels: name: app resources: - deployment.yaml - service.yaml
|
可以通过kustomize build命令来看完整的配置,build出来的每个资源对象上都会存在通用的标签name:app。
kustomize build app/base # 构建 kustomize build app/base | kubectl apply -f - # 构建并部署 kubectl apply -k app/base # 1.14及更新的版本可以使用该命令直接部署
|
app/overlays/staging/kustomization.yaml中可以为演示环境定义不同的名称前辍、标签,通过patch的方案将副本数设置为1。
bases: - ../../base commonLabels: env: staging namePrefix: staging- patches: - target: kind: Deployment name: app patch: | [ {"op":"replace","path":"/spec/replicas","value":1} ]
|
app/overlays/production/kustomization.yaml中可以为生产环境定义不同的名称前辍、标签,通过patch的方案将副本数设置为2。
bases: - ../../base commonLabels: env: production namePrefix: production- patches: - target: kind: Deployment name: app patch: | [ {"op":"replace","path":"/spec/replicas","value":2} ]
|
app/overlays/production-large/kustomization.yaml中可以继承生产环境的定义,同时将副本数设置为10支撑大规模场景需求。
bases: - ../production patches: - target: kind: Deployment name: app patch: | [ {"op":"replace","path":"/spec/replicas","value":10} ]
|
通过不同的部署路径,指定不同的环境部署。
kustomize build app/overlays/production | kubectl apply -f - kustomize build app/overlays/staging | kubectl apply -f - kustomize build app/overlays/production-large | kubectl apply -f –
|
通过上面的例子我们可以看出,通过kustomization.yaml来声明继承和patch,可以为各种场景构造不同的YAML输出,同时保持底座YAML不变化。