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
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
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
评论区