【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
    19
    tree -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.yaml

    2. kustomization.yaml 文件的常规写法

  1. 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
  2. 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"
  3. 注:kustomize按照kustomization.yaml中的配置自上而下逐层替换

    3. yaml 文件管理规范

  4. base文件夹中
  5. 存放所有公共信息的yaml文件
  6. 所有的镜像修改更新在 base/kustomization.yaml 中
  7. overlays/xxx 下
  8. 仅存放当前环境的特殊定义信息 (其余冗余信息全部删除)
    如,在test环境中的replicas需设为1而生产中replicas需配置为2
    则在base为全量信息的情况下 - overlays/test/xxx.yaml中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    #元数据中必须填写 name 和 namespace(标志位)
    name: test-Deployment
    namespace: VAR_NAMESPACE
    #需逐层写好信息,kustomize才可识别出
    spec:
    replicas: 1
    - overlays/prod/xxx.yaml中
    1
    2
    3
    4
    5
    6
    7
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: prod-Deployment
    namespace: VAR_NAMESPACE
    spec:
    replicas: 2
  9. 如需要指定namespace 写在环境下的 overlays/xxx/kustomization.yaml 文件最末尾
    1
    2
    3
    4
    5
    6
    7
    8
    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    resources:
    - ../../base
    patchesStrategicMerge:
    - deployment.yaml
    - service.yaml
    namespace: test
  10. 两个标志位
  • image
    base/deployment.yaml 中使用的镜像需要使用占位符,实际替换通过 base/kustomization.yaml 中指定
    • base/deployment.yaml
      占位符命名规则 VAR_ + 业务名大写 + _IMAGE
      1
      2
      3
      containers:
      - name: example
      image: VAR_EXAMPLE_IMAGE
    • base/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
      5
      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: example
      namespace: VAR_NAMESPACE
    • overlays/xxx/kustomization.yaml
      1
      2
      3
      4
      5
      6
      7
      apiVersion: kustomize.config.k8s.io/v1beta1
      kind: Kustomization
      resources:
      - ../../base
      patchesStrategicMerge:
      - deployment.yaml
      namespace: test
    • 【注意事项】
      1. 所有涉及命名空间的 yaml 均需要将 namespace 指定成占位符形式: namespace: VAR_NAMESPACE
        包括baseoverlays/xxx目录下
      2. 最后指定namespace 需在 overlays/xxx/kustomization.yaml 文件中的 patchesStrategicMerge 之下
  1. 【注意事项】
  2. 元数据中必须填写 namespace 和 name
  3. 需逐层写好信息,kustomize才可识别出
    如遇到containersvolumes等,内有多个,需要 name 区别,则也需要(逐层)写上name
    1
    2
    3
    4
    5
    6
    7
    containers:
    - 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
  4. 两个标志位 中注意事项见上

3. 遗留问题

  1. configmap的处理
    当configmap以如下形式写,kustomize认定为一行,无法进项多环境仅写 非共有的信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: fsis-ais-service-application
    namespace: VAR_NAMESPACE
    data:
    application.yml: |
    server:
    port: 8280
    待测试的解决方法:https://github.com/kubernetes-sigs/kustomize/blob/master/examples/zh/springboot.md