目 录CONTENT

文章目录

Kustomize实战指南:从基础配置到环境差异化管理

Administrator
2025-08-13 / 0 评论 / 2 点赞 / 10 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Kustomize实战指南:从基础配置到环境差异化管理

什么是kustomize

Kustomize是Kubernetes原生的配置管理工具,通过声明式语法实现配置的复用与差异化定制。其核心设计理念是"补丁式"配置管理,支持通过资源合并、变量注入、标签管理等特性,在不修改原始配置文件的前提下,实现多环境部署的灵活适配。

代码仓库位置

本次分享涉及的代码存放在好来斯gitops仓库
,具体路径为xianqu/tmall目录下。

一个典型的deployment.yaml文件

# 定义资源的类型为Deployment  
kind: Deployment  
  
# 使用的API版本为apps/v1  
apiVersion: apps/v1  
  
# 元数据部分  
metadata:  
  # Deployment的名称  
  name: tmall  
  # Deployment所在的命名空间  
  namespace: tmall-project  
  # 标签,用于标识和选择资源  
  labels:  
    app: tmall  
  # 注解,用于存储关于资源的额外信息  
  annotations:  
    # Deployment的修订版本号  
    deployment.kubernetes.io/revision: '11'  
  
# 定义Deployment的规格  
spec:  
  # 期望的Pod副本数,这里设置为0,表示不运行任何Pod  
  replicas: 1
  
  # 用于选择哪些Pod属于这个Deployment的标签选择器  
  selector:  
    matchLabels:  
      app: tmall  
  
  # 定义Pod的模板  
  template:  
    metadata:  
      # Pod的创建时间戳,这里设置为null,表示由Kubernetes自动设置  
      creationTimestamp: null  
      # Pod的标签  
      labels:  
        app: tmall  
  
    # 定义Pod的规格  
    spec:  
      # 定义Pod的卷  
      volumes:  
        - name: host-time  
          hostPath:  
            # 卷的路径,这里指向宿主机的/etc/localtime  
            path: /etc/localtime  
            type: ''  
  
      # 定义Pod中的容器  
      containers:  
        - name: tmall  
          # 容器的镜像  
          image: 'k8s-harbor:30002/tmall-project/tmall:30_2d590d2'  
  
          # 容器开放的端口  
          ports:  
            - name: http-8080  
              containerPort: 8080  
              protocol: TCP  
  
          # 容器的资源限制和请求  
          resources:  
            limits:  
              cpu: 250m  
              memory: 512Mi  
            requests:  
              cpu: 10m  
              memory: 10Mi  
  
          # 将上面定义的卷挂载到容器内的路径  
          volumeMounts:  
            - name: host-time  
              readOnly: true  
              mountPath: /etc/localtime  
  
          # 容器终止时的消息路径  
          terminationMessagePath: /dev/termination-log  
          # 容器终止消息的策略  
          terminationMessagePolicy: File  
  
          # 镜像拉取策略,Always表示始终拉取  
          imagePullPolicy: Always  
  
      # Pod的重启策略,Always表示始终重启  
      restartPolicy: Always  
  
      # Pod终止前的宽限期  
      terminationGracePeriodSeconds: 30  
  
      # Pod的DNS策略  
      dnsPolicy: ClusterFirst  
  
      # Pod的安全上下文  
      securityContext: {}  
  
      # 镜像拉取的秘密,用于私有仓库的认证  
      imagePullSecrets:  
        - name: zhangjialin-harbor-id  
  
      # Pod的反亲和性规则  
      affinity:  
        podAntiAffinity:  
          preferredDuringSchedulingIgnoredDuringExecution:  
            - weight: 100  
              podAffinityTerm:  
                labelSelector:  
                  matchLabels:  
                    app: tmall  
                topologyKey: kubernetes.io/hostname  
  
      # Pod使用的调度器  
      schedulerName: default-scheduler  
  
  # 定义Deployment的更新策略  
  strategy:  
    type: RollingUpdate  
    rollingUpdate:  
      # 在更新过程中,最多可以有多少个Pod不可用  
      maxUnavailable: 50%  
      # 在更新过程中,最多可以创建多少个额外的Pod  
      maxSurge: 50%  
  
  # Deployment的历史版本保留的数量  
  revisionHistoryLimit: 2  
  
  # Deployment更新的进度截止时间  
  progressDeadlineSeconds: 600
  
  # 未包含:生命周期,健康检查等其他的一些配置

单个应用一般目录

├── 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里面可以不写以下内容,只要 kustomize 能够识别出这是一个 kustomization 文件,并且能够找到相关的资源和补丁文件,你就可以省略 apiVersion 和 kind 字段。这种简化的方式使得 kustomization 文件更加易读和易于管理。

apiVersion: kustomize.config.k8s.io/v1beta1 
kind: Kustomization

resources

resources关键字,类似于java中的import, 类似于python中的from xxx import yyy

resources.png

namespace

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-1/kustomization.yaml
...
namespace: xianqu-tmall-dev-project
...
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-1 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-1 --dry-run=client -o yaml | grep namespace

image

image.png

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-2/kustomization.yaml
...
images:
  - name: tmall-server-image
    newName: k8s-harbor:30002/xianqu-tmall-dev-project/tmall-server-dev
    newTag: dev-39-43ea383
...
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-2 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-2 --dry-run=client -o yaml | grep image

为什么要在base里面使用类似于:

images:
- name: tmall-server-image
  newName: k8s-harbor:30002/xianqu-tmall-dev-project/tmall-server-dev
  newTag: dev-39-43ea383

1、在复制tmall-server整个应用可以被全局替换

2、在overlays中,可能存在不同的环境,但同一个base里面的tmall-server-image可能对应着不同的仓库,如xianqu-tmall-dev-project/tmall-server-dev,xianqu-tmall-test-project/tmall-server-test,因此需要一个当变量的功能

commonAnnotations

为所有字段添加注释

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-3/kustomization.yaml
...
commonAnnotations:
  MACHINE_ROOT_NAME: howlaisi-a
...
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-3 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-3 --dry-run=client -o yaml | grep annotations -C 3

# 使用场景:commonAnnotations可以用来标志一个集群,deployment,service,pod可能通过环境变量:valueFrom.fieldRef.fieldPath知道自己在哪里集群

commonLabels

为所有资源和 selectors 增加标签

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-4/kustomization.yaml
...
commonLabels:
  app: tmall-server
...
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-4 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-4 --dry-run=client -o yaml | grep label -C 3

# 统一的标签,会在如下以下地方,自动加上标签
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tmall-server
spec:
  selector:
    matchLabels:
      app: tmall-server
  template:
    metadata:
      labels:
        app: tmall-server

一句话总结,就是涉及到label的地方,都会自动加需要注意的是:kustomize翻译成的k8s的yaml文件被生成之后,label标签就固定了,后续如果想再添加|修改|删除label|都会导致应用失败, 需要将原来的整个部署起来的应用删掉之后重新部署才行,annotations不会出现这个问题

nameSuffix

为所有资源和引用的名称添加后缀(以nacos举例,不同版本加后缀,比如说nacos-230,nacos-240)

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-5/kustomization.yaml
...
nameSuffix: -sit
...

kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-5 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-5 --dry-run=client -o yaml | grep sit -C 5

# deployment,service,rs,pod,configmap都会加,但是pod里面的container不会加

namePrefix

为所有资源和引用的名称添加前缀(以nacos举例,不同应用加前缀,比如说bpp-nacos,smp-nacos)

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-6/kustomization.yaml
...
namePrefix: xianqu-
...

kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-6 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-6 --dry-run=client -o yaml | grep xianqu -C 5

# deployment,service,rs,pod,configmap都会加,但是pod里面的container不会加

patchesStrategicMerge

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-7/tmall-server/kustomization.yaml
...
patchesStrategicMerge:
  - timezone.yaml
  - quota.yaml
...

kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-7 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-7 --dry-run=client -o yaml | grep TZ -C 5
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-7 --dry-run=client -o yaml | grep limits -C 5

一个应用里面,一种kind里面的应用,resources里面只能写一个,其他给这个kind里面的应用添加上更多的属性,都应该是使用patchesStrategicMerge的方式,比如: tmall-server里面的deployment.yaml,应该是放入到resources关键字下面,其他的都给这个deployment添加上各种属性,都算是"补丁",这些yaml,都应该是写在patchesStrategicMerge下面

replicas

修改资源的副本数

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-8/kustomization.yaml
...
replicas:
  - name: tmall-server
    count: 3
  - name: tmall-web
    count: 5
...

kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-8 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-8 --dry-run=client -o yaml | grep replicas -C 5

vars

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-9/kustomization.yaml
...
vars:
  - name: SERVICE_NAME
    objref:
      kind: Service
      name: tmall-server
      apiVersion: apps/v1
...

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-9/tmall-server/service-name.yaml
...
service-name.yaml: apps/v1
kind: Deployment
metadata:
  name: tmall-server
spec:
  template:
    spec:
      containers:
        - name: tmall-server
          env:
            - name: SERVICE_NAME
              value: $(SERVICE_NAME)

...

kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-9 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-9 --dry-run=client -o yaml | grep SERVICE_NAME -C 5

在pod里面,取到service名字

configMapGenerator和generatorOptions

这里可能比较难理解,可以clone好来斯的gitops仓库直接看代码。

cat  /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10/kustomization.yaml
...
configMapGenerator:
  - name: test1
    files:
      - app1.ini

  - name: test2
    behavior: create
    files:
      - app1.ini
      - app2.ini

  - name: test3
    literals:
      - JAVA_HOME=/opt/java/jdk
      - JAVA_TOOL_OPTIONS=-agentlib:hprof

  - name: tmall-server-cm
    behavior: merge
    files:
      - app1.ini
      - app2.ini
...

kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10 --dry-run=client -o yaml
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10 --dry-run=client -o yaml | grep test1 -C 10
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10 --dry-run=client -o yaml | grep test2 -C 10
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10 --dry-run=client -o yaml | grep test3 -C 10
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10 --dry-run=client -o yaml | grep tmall-server-cm -C 10
kubectl apply -k /home/xlss/argocd-gitops/xianqu/tmall/overlays/dev-10 --dry-run=client -o yaml | grep generatorOptions -C 10

参考文档

官方文档

2

评论区