Kustomize 简介

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

Kustomize云原生配置管理 - 图1

kustomize 解决了什么痛点

  1. kustomize 通过 Base & Overlays 方式可以管理多个环境的资源配置
  2. 资源配置可以复用
  3. kustomize 管理的都是 Kubernetes 原生 YAML 文件,**不需要掌握类似helm的模板语法。**
  4. 集成在 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 文件的目录中的资源
  1. kubectl kustomize <kustomization_directory>
  2. #举例
  3. kubectl kustomize overlays/prod
应用这些资源
  1. #使用参数 --kustomize 或 -k
  2. kubectl apply -k <kustomization_directory

Kustomize 理解与使用

①项目初始化格式

Kustomize云原生配置管理 - 图2

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: myngx
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: myngx
  9. replicas: 1
  10. template:
  11. metadata:
  12. labels:
  13. app: myngx
  14. spec:
  15. containers:
  16. - name: ngx1
  17. image: nginx:1.18-alpine
  18. imagePullPolicy: IfNotPresent
  19. ports:
  20. - containerPort: 80
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: myngx-svc
  5. spec:
  6. ports:
  7. - port: 80
  8. targetPort: 80
  9. selector:
  10. app: myngx

初始化渲染

  1. #渲染命令
  2. kubectl kustomize
  3. #以下为输出
  4. - - -
  5. apiVersion: v1
  6. kind: Service
  7. metadata:
  8. name: myngx-svc
  9. spec:
  10. ports:
  11. - port: 80
  12. targetPort: 80
  13. selector:
  14. app: myngx
  15. ---
  16. apiVersion: apps/v1
  17. kind: Deployment
  18. metadata:
  19. name: myngx
  20. spec:
  21. replicas: 1
  22. selector:
  23. matchLabels:
  24. app: myngx
  25. template:
  26. metadata:
  27. labels:
  28. app: myngx
  29. spec:
  30. containers:
  31. - image: nginx:1.18-alpine
  32. imagePullPolicy: IfNotPresent
  33. name: ngx1
  34. ports:
  35. - containerPort: 80

②抽取公共部分示例

配置kustomization文件

  1. #公共部分
  2. apiVersion: kustomize.config.k8s.io/v1beta1
  3. kind: Kustomization
  4. #生成统一namespace
  5. namespace: default
  6. #生成统一注释
  7. commonAnnotations:
  8. myname: hunter
  9. #生成统一镜像Tag
  10. images:
  11. - name: nginx
  12. newTag: 1.19-alpine
  13. resources:
  14. - service.yaml
  15. - deployment.yaml

修改后渲染

Kustomize云原生配置管理 - 图3

③使用overlay创建多“环境”配置

创建overlays层下级目录用于区分环境(可自定义,dev,uat,prod。。。)

Kustomize云原生配置管理 - 图4

vim overlays/prod/kustomization.yaml

  1. # 生成生产环境namespace
  2. namespace: prod
  3. # 生成生产环境的前缀“prod-”
  4. namePrefix: prod-
  5. # 指向base主目录
  6. bases:
  7. - ../../base

渲染生产环境模板

Kustomize云原生配置管理 - 图5

③使用patch(补丁)修改原有配置

层级关系如图所示:

Kustomize云原生配置管理 - 图6示例:配置生产环境副本数以及镜像版本

  1. # 生成生产环境namespace
  2. namespace: prod
  3. # 生成生产环境的前缀“prod-”
  4. namePrefix: prod-
  5. # 指向base主目录
  6. bases:
  7. - ../../base
  8. # 指向同级生产配置目录的·yaml资源
  9. patchesStrategicMerge:
  10. - replica.yaml
  11. - image.yaml
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: myngx
  5. spec:
  6. replicas: 2
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: myngx
  5. spec:
  6. #需要保留层级关系,同时只保留要改动的字段
  7. template:
  8. spec:
  9. containers:
  10. #需要保留name: ngx1用来匹配原资源文件字段
  11. - name: ngx1
  12. image: nginx:1.20-alpine

配置后的场景渲染

Kustomize云原生配置管理 - 图7

④使用patchesJson6902修改细颗粒度的值

当需要修改的属性值为列表时,列如port。则需要使用patchesJson6902指定更改具体的值

(基于 https://tools.ietf.org/html/rfc6902 规范实现)

  1. # 生成生产环境namespace
  2. namespace: prod
  3. # 生成生产环境的前缀“prod-”
  4. namePrefix: prod-
  5. # 指向base主目录
  6. bases:
  7. - ../../base
  8. # 指向同级生产配置目录的·yaml资源
  9. patchesStrategicMerge:
  10. - replica.yaml
  11. - image.yaml
  12. patchesJson6902:
  13. # 指定对应的deployment文件
  14. - target:
  15. group: apps
  16. version: v1
  17. kind: Deployment
  18. name: myngx
  19. # 修改同级目录的port.yaml
  20. path: port.yaml
  1. #指定对应列表的port的值
  2. - op: replace
  3. path: /spec/template/spec/containers/0/ports/0/containerPort
  4. value: 8080

渲染效果

Kustomize云原生配置管理 - 图8

拓展章节

使用生成器:configmap生成

官方文档:

https://kubectl.docs.kubernetes.io/zh/api-reference/kustomization/configmapgenerator/

  1. ...
  2. configMapGenerator:
  3. - name: myngx-config
  4. #将key,value传递到生成的configmap
  5. literals:
  6. - UserName=hunter
  7. - PassWord=Admin@123

实际渲染效果

Kustomize云原生配置管理 - 图9

更多配置项

https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/