Kustomize 简介
Kustomize 是一种 Kubernetes 配置转换工具,它的作用是对描述 Kubernetes 资源的 YAML 文件进行定制化操作,产生新的 YAML (同时原有的 YAML 文件不会有任何变化)。Kustomize 的一个重要特性是不使用模板,而是直接工作在原始的 YAML 文件之上,还可以根据其他表示法生成 ConfigMap 和 Secret 等资源。

kustomize 解决了什么痛点
- kustomize 通过 Base & Overlays 方式可以管理多个环境的资源配置
- 资源配置可以复用
- kustomize 管理的都是 Kubernetes 原生 YAML 文件,**不需要掌握类似helm的模板语法。**
- 集成在 kubectl 中,可以在**命令行界面中以原生方式运行。**不需要安装额外的工具就可以进行定制化操作
一键安装(kubectl 1.20之后属于内嵌不需要安装)
curl -s “https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh” | bash
详见 https://kubectl.docs.kubernetes.io/installation/kustomize/
常用命令
查看包含 kustomization 文件的目录中的资源应用这些资源
kubectl kustomize <kustomization_directory>#举例kubectl kustomize overlays/prod
#使用参数 --kustomize 或 -kkubectl apply -k <kustomization_directory
Kustomize 理解与使用
①项目初始化格式

apiVersion: apps/v1kind: Deploymentmetadata:name: myngxspec:selector:matchLabels:app: myngxreplicas: 1template:metadata:labels:app: myngxspec:containers:- name: ngx1image: nginx:1.18-alpineimagePullPolicy: IfNotPresentports:- containerPort: 80
apiVersion: v1kind: Servicemetadata:name: myngx-svcspec:ports:- port: 80targetPort: 80selector:app: myngx
初始化渲染
#渲染命令kubectl kustomize#以下为输出- - -apiVersion: v1kind: Servicemetadata:name: myngx-svcspec:ports:- port: 80targetPort: 80selector:app: myngx---apiVersion: apps/v1kind: Deploymentmetadata:name: myngxspec:replicas: 1selector:matchLabels:app: myngxtemplate:metadata:labels:app: myngxspec:containers:- image: nginx:1.18-alpineimagePullPolicy: IfNotPresentname: ngx1ports:- containerPort: 80
②抽取公共部分示例
配置kustomization文件
#公共部分apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization#生成统一namespacenamespace: default#生成统一注释commonAnnotations:myname: hunter#生成统一镜像Tagimages:- name: nginxnewTag: 1.19-alpineresources:- service.yaml- deployment.yaml
修改后渲染

③使用overlay创建多“环境”配置
创建overlays层下级目录用于区分环境(可自定义,dev,uat,prod。。。)

vim overlays/prod/kustomization.yaml
# 生成生产环境namespacenamespace: prod# 生成生产环境的前缀“prod-”namePrefix: prod-# 指向base主目录bases:- ../../base
渲染生产环境模板

③使用patch(补丁)修改原有配置
层级关系如图所示:
示例:配置生产环境副本数以及镜像版本
# 生成生产环境namespacenamespace: prod# 生成生产环境的前缀“prod-”namePrefix: prod-# 指向base主目录bases:- ../../base# 指向同级生产配置目录的·yaml资源patchesStrategicMerge:- replica.yaml- image.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: myngxspec:replicas: 2
apiVersion: apps/v1kind: Deploymentmetadata:name: myngxspec:#需要保留层级关系,同时只保留要改动的字段template:spec:containers:#需要保留name: ngx1用来匹配原资源文件字段- name: ngx1image: nginx:1.20-alpine
配置后的场景渲染

④使用patchesJson6902修改细颗粒度的值
当需要修改的属性值为列表时,列如port。则需要使用patchesJson6902指定更改具体的值
(基于 https://tools.ietf.org/html/rfc6902 规范实现)
# 生成生产环境namespacenamespace: prod# 生成生产环境的前缀“prod-”namePrefix: prod-# 指向base主目录bases:- ../../base# 指向同级生产配置目录的·yaml资源patchesStrategicMerge:- replica.yaml- image.yamlpatchesJson6902:# 指定对应的deployment文件- target:group: appsversion: v1kind: Deploymentname: myngx# 修改同级目录的port.yamlpath: port.yaml
#指定对应列表的port的值- op: replacepath: /spec/template/spec/containers/0/ports/0/containerPortvalue: 8080
渲染效果

拓展章节
使用生成器:configmap生成
官方文档:
https://kubectl.docs.kubernetes.io/zh/api-reference/kustomization/configmapgenerator/
...configMapGenerator:- name: myngx-config#将key,value传递到生成的configmapliterals:- UserName=hunter- PassWord=Admin@123
实际渲染效果

更多配置项
https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/
