【CICD】:Kustomize 管理多环境部署文件
Kustomize 管理多环境部署文件
操作文档:使用 Kustomize 对 Kubernetes 对象进行声明式管理
kustomize-github
1. 目录结构
- base 该目录下存放基底yaml
- overlays 该目录下创建各个环境的个性化配置文件(仅需写修改部分)
- kustomization.yaml
Kustomize 入口,通过此文件声明调用,根据其生成完整的部署yaml文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19tree -l test-web-kust/
└── base
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays
├── dev
│ ├── configmap.yaml
│ ├── deployment.yaml
│ └── kustomization.yaml
├── test
│ ├── configmap.yaml
│ ├── deployment.yaml
│ └── kustomization.yaml
└── prod
├── configmap.yaml
├── deployment.yaml
└── kustomization.yaml2. kustomization.yaml 文件的常规写法
- base/kustomization.yaml
1
2
3
4
5
6
7
8
9
10
11
#指定基底依赖文件
resources:
- configmap.yaml
- deployment.yaml
- service.yaml
#修改新镜像,镜像匹配通过原镜像名匹配,为防止修改出错,所有
images:
- name: VAR_NAMESPACE
newName: fat178.testeameastcmiot.cn/test/horn_server_2
newTag: master-1b8ef290508f3663dca223284a56a029cb8909f2 - overlays/prod/kustomization.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#指定基底文件夹
bases:
- ../../base
#指定补丁文件
patchesStrategicMerge:
- configmap.yaml
- deployment.yaml
#指定命名空间
namespace: my-namespace
#为各个服务增加前缀
namePrefix: dev-
#为各个服务增加前缀
nameSuffix: "-001" - 注:kustomize按照kustomization.yaml中的配置自上而下逐层替换
3. yaml 文件管理规范
- base文件夹中
- 存放所有公共信息的yaml文件
- 所有的镜像修改更新在 base/kustomization.yaml 中
- overlays/xxx 下
- 仅存放当前环境的特殊定义信息 (其余冗余信息全部删除)
如,在test环境中的replicas
需设为1
而生产中replicas
需配置为2
则在base为全量信息的情况下 - overlays/test/xxx.yaml中- overlays/prod/xxx.yaml中1
2
3
4
5
6
7
8
9apiVersion: apps/v1
kind: Deployment
metadata:
#元数据中必须填写 name 和 namespace(标志位)
name: test-Deployment
namespace: VAR_NAMESPACE
#需逐层写好信息,kustomize才可识别出
spec:
replicas: 11
2
3
4
5
6
7apiVersion: apps/v1
kind: Deployment
metadata:
name: prod-Deployment
namespace: VAR_NAMESPACE
spec:
replicas: 2 - 如需要指定namespace 写在环境下的
overlays/xxx/kustomization.yaml
文件最末尾1
2
3
4
5
6
7
8apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- deployment.yaml
- service.yaml
namespace: test - 两个标志位
image
在base/deployment.yaml
中使用的镜像需要使用占位符,实际替换通过base/kustomization.yaml
中指定base/deployment.yaml
占位符命名规则VAR_
+业务名大写
+_IMAGE
1
2
3containers:
- name: example
image: VAR_EXAMPLE_IMAGEbase/kustomization.yaml
1
2
3
4
5
6
7
8
resources:
- deployment.yaml
- service.yaml
images:
- name: VAR_EXAMPLE_IMAGE
newName: hub.iot.chinamobile.com/example
newTag: 1.0.0
- 【注意事项】 1. 所有image信息均需要使用 占位符 写在 base 目录中 2. 使用 占位符 指定的 image 均需要在
base/kustomization.yaml
进行替换、 3.overlays
目录下的各个环境中不得出现image信息,否则会被替换 namespace
所有涉及命名空间的 yaml 中使用的namespace
需要使用占位符,实际替换通过overlays/xxx/kustomization.yaml
中指定base/deployment.yaml
占位符命名规则VAR_NAMESPACE
1
2
3
4
5apiVersion: apps/v1
kind: Deployment
metadata:
name: example
namespace: VAR_NAMESPACEoverlays/xxx/kustomization.yaml
1
2
3
4
5
6
7apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- deployment.yaml
namespace: test- 【注意事项】
- 所有涉及命名空间的 yaml 均需要将 namespace 指定成占位符形式:
namespace: VAR_NAMESPACE
包括base
和overlays/xxx
目录下 - 最后指定namespace 需在
overlays/xxx/kustomization.yaml
文件中的patchesStrategicMerge
之下
- 所有涉及命名空间的 yaml 均需要将 namespace 指定成占位符形式:
- 【注意事项】
- 元数据中必须填写 namespace 和 name
- 需逐层写好信息,kustomize才可识别出
如遇到containers
或volumes
等,内有多个,需要name
区别,则也需要(逐层)写上name
1
2
3
4
5
6
7containers:
- name: container1
image: hub.iot.chinamobile.com/szhcpb/fsis/ax-opens-2.1.0:2021-10-11-12-50.wuxi-dev.h5
ports:
- name: port1
containerPort: 80
protocol: TCP - 两个标志位 中注意事项见上
3. 遗留问题
- configmap的处理
当configmap以如下形式写,kustomize认定为一行,无法进项多环境仅写 非共有的信息待测试的解决方法:https://github.com/kubernetes-sigs/kustomize/blob/master/examples/zh/springboot.md1
2
3
4
5
6
7
8
9apiVersion: v1
kind: ConfigMap
metadata:
name: fsis-ais-service-application
namespace: VAR_NAMESPACE
data:
application.yml: |
server:
port: 8280