Kustomize
kustomize 是一个通过 kustomization 文件定制 kubernetes 对象的工具,它可以通过一些资源生成一些新的资源,也可以定制不同的资源的集合
一个比较典型的场景是我们有一个应用,在不同的环境例如生产环境和测试环境,它的 yaml 配置绝大部分都是相同的,只有个别的字段不同,这时候就可以利用 kustomize 来解决
结构
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── dev
│ ├── kustomization.yaml
│ └── patch.yaml
├── prod
│ ├── kustomization.yaml
│ └── patch.yaml
└── staging
├── kustomization.yaml
└── patch.yaml
一个常见的项目 kustomize 项目布局如上所示,可以看到每个环境文件夹里面都有一个 kustomization.yaml
文件,这个文件里面就类似配置文件,里面指定源文件以及对应的一些转换文件,例如 patch 等
基础模板
base/kustomization.yaml 示例
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- service.yaml
- deployment.yaml
使用 kustomize build
命令运行后会把两个文件连接在一起
定制
现在我们想要针对一些特定场景进行定制,比如,针对生产环境和测试环境需要由不同的配置
overlays/dev/kustomization.yaml 示例
namespace: dev
namePrefix: dev-
commonLabels:
someName: someValue
bases:
- ../../base
overlays/prod/kustomization.yaml 示例
namespace: prod
namePrefix: prod-
commonLabels:
someName: someValue
bases:
- ../../base
patchesStrategicMerge
可以覆盖一些在 base 文件中已有的配置。如修改 dev 环境的副本数量为2个,同时修改 container1 容器的镜像名
overlays/dev/kustomization.yaml 示例
namespace: prod
namePrefix: prod-
commonLabels:
someName: someValue
bases:
- ../../base
patchesStrategicMerge:
- replica.yaml
overlays/dev/replica.yaml 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: myngx
spec:
replicas: 2
template:
spec:
containers:
- name: container1
image: dev-image:1.0
patchesJson6902
patchesJson6902 列表中的每个条目都应可以解析为 kubernetes 对象和将应用于该对象的 JSON patch
目标字段指向的 kubernetes 对象的 group、 version、 kind、 name 和 namespace 在同一 kustomization 内 path 字段内容是 JSON patch 文件的相对路径
如修改 dev 环境下 myngx deployoment 的 containerPort
base/deployment.yaml 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: myngx
namespace: default
spec:
selector:
matchLabels:
app: myngx
replicas: 1
template:
metadata:
labels:
app: myngx
spec:
containers:
- name: ngx1
image: nginx:1.18-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
- containerPort: 443
overlays/dev/kustomization.yaml 示例
namespace: prod
namePrefix: prod-
commonLabels:
someName: someValue
bases:
- ../../base
patchesStrategicMerge:
- replica.yaml
patchesJson6902:
- target:
group: app
version: v1
kind: Deployment
name: myngx
path: port.yaml
overlays/dev/port.yaml 示例
- op: replace
path: /spec/template/spec/containers/0/ports/0/containerPort
value: 8080
- op: replace
path: /spec/template/spec/containers/0/ports/1/containerPort
value: 8443
configMapGenerator
可以生成 ConfigMap 资源
configMapGenerator:
- name: myconfig
literals:
- host=192.168.0.111
- port=1234
files:
- mycnf.prop
- mysql57=mysql.cnf
generatorOptions
控制生成 ConfigMap 和 Secret 的行为
generatorOptions:
labels:
kustomize.generated.resources: somevalue
annotations:
kustomize.generated.resource: somevalue
disableNameSuffixHash: true
总结
Kustomize 给 Kubernetes 的用户提供一种可以重复使用配置的声明式应用管理,从而在配置工作中用户只需要管理和维护 Kubernetes 的原生 API 对象,而不需要使用复杂的模版。同时,使用 kustomzie 可以仅通过 Kubernetes 声明式 API 资源文件管理任何数量的 kubernetes 定制配置,可以通过 fork/modify/rebase 这样的工作流来管理海量的应用描述文件