关于 kustomize
kustomize 技能介绍如何以声明式方式定制 Kubernetes 资源,无需模板。适合管理多环境配置、修改现有清单及组合第三方清单。
主要功能
- 01通过 base 和 overlay 管理环境配置
- 02使用合并补丁或 JSON 补丁
- 03生成 ConfigMap 和 Secret
- 04调整镜像、命名空间和副本数
- 05组合组件与远程资源
适用场景
- 01为开发和生产环境维护不同配置
- 02在不改动基础清单时应用补丁
- 03从配置文件生成 ConfigMap 或 Secret
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill kustomize安装后在 Claude Code 中输入/kustomize确认已加载。
详细介绍
Kustomize
以声明式方式自定义 Kubernetes 资源,无需使用模板。
何时使用此技能
在以下情况下使用此技能:
- 跨环境管理 Kubernetes 配置
- 在不修改现有清单的情况下对其进行补丁
- 基于基础配置创建配置变体
- 自定义第三方清单
- 倾向于使用声明式方法而非模板
前提条件
- kubectl 1.14+(包含 kustomize)
- 或独立的 kustomize CLI
- 具备 Kubernetes 清单基础知识
目录结构
myapp/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── configmap.yaml
└── overlays/
├── development/
│ ├── kustomization.yaml
│ └── replica-patch.yaml
├── staging/
│ ├── kustomization.yaml
│ └── namespace.yaml
└── production/
├── kustomization.yaml
├── replica-patch.yaml
└── resource-patch.yaml
基础配置
kustomization.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
commonLabels:
app: myapp
commonAnnotations:
managed-by: kustomize
基础资源
# base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
覆盖配置
开发环境覆盖配置
# overlays/development/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: myapp-dev
namePrefix: dev-
commonLabels:
environment: development
images:
- name: myapp
newTag: dev-latest
生产环境覆盖配置
# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: myapp-prod
namePrefix: prod-
commonLabels:
environment: production
replicas:
- name: myapp
count: 5
images:
- name: myapp
newName: registry.example.com/myapp
newTag: v2.0.0
patches:
- path: resource-patch.yaml
补丁
Strategic Merge 补丁
# overlays/production/resource-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
containers:
- name: myapp
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1000m"
JSON 补丁
# kustomization.yaml
patches:
- target:
kind: Deployment
name: myapp
patch: |-
- op: replace
path: /spec/replicas
value: 5
- op: add
path: /spec/template/spec/containers/0/env
value:
- name: LOG_LEVEL
value: info
内联补丁
# kustomization.yaml
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
target:
kind: Deployment
name: myapp
配置生成
ConfigMap 生成器
# kustomization.yaml
configMapGenerator:
- name: myapp-config
literals:
- APP_ENV=production
- LOG_LEVEL=info
files:
- config.yaml
envs:
- config.env
options:
disableNameSuffixHash: false
Secret 生成器
# kustomization.yaml
secretGenerator:
- name: myapp-secrets
literals:
- api-key=secret123
files:
- tls.crt
- tls.key
type: kubernetes.io/tls
镜像转换
# kustomization.yaml
images:
# Change tag
- name: myapp
newTag: v2.0.0
# Change registry
- name: myapp
newName: registry.example.com/myapp
newTag: v2.0.0
# Use digest
- name: myapp
digest: sha256:abc123...
资源转换
名称前缀/后缀
# kustomization.yaml
namePrefix: prod-
nameSuffix: -v2
命名空间
# kustomization.yaml
namespace: production
标签和注解
# kustomization.yaml
commonLabels:
app.kubernetes.io/name: myapp
app.kubernetes.io/environment: production
commonAnnotations:
example.com/owner: team-a
副本数
# kustomization.yaml
replicas:
- name: myapp
count: 5
- name: worker
count: 3
组件
# components/monitoring/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
resources:
- servicemonitor.yaml
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
# overlays/production/kustomization.yaml
components:
- ../../components/monitoring
远程资源
# kustomization.yaml
resources:
# Remote Git repository
- https://github.com/org/manifests//base?ref=v1.0.0
# Remote URL
- https://raw.githubusercontent.com/org/repo/main/deployment.yaml
命令
# Build and view output
kubectl kustomize overlays/production
# Apply to cluster
kubectl apply -k overlays/production
# Delete resources
kubectl delete -k overlays/production
# View diff
kubectl diff -k overlays/production
# Build with standalone kustomize
kustomize build overlays/production
# Build and apply
kustomize build overlays/production | kubectl apply -f -
Helm Chart 集成
# kustomization.yaml
helmCharts:
- name: prometheus
repo: https://prometheus-community.github.io/helm-charts
version: 25.0.0
releaseName: prometheus
namespace: monitoring
valuesFile: values.yaml
includeCRDs: true
变量替换
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
replacements:
- source:
kind: ConfigMap
name: myapp-config
fieldPath: data.APP_VERSION
targets:
- select:
kind: Deployment
name: myapp
fieldPaths:
- spec.template.spec.containers.[name=myapp].image
options:
delimiter: ':'
index: 1
常见问题
问题:名称哈希冲突
问题:ConfigMap 发生更改时资源未更新 解决方案:启用名称后缀哈希(默认行为),或使用替换
问题:补丁未应用
问题:Strategic Merge 补丁不起作用 解决方案:确认资源名称匹配;复杂更改请使用 JSON 补丁
问题:远程资源获取失败
问题:无法获取远程资源 解决方案:检查 URL,确认 ref/tag 存在,并确保网络可访问
问题:标签选择器不匹配
问题:commonLabels 导致选择器失效 解决方案:使用 includeSelectors: false,或排除特定资源
commonLabels:
app: myapp
configurations:
- labelExclusions.yaml
最佳实践
- 让基础清单不依赖特定环境
- 使用覆盖配置处理特定环境的配置
- 简单更改优先使用 Strategic Merge 补丁
- 使用组件实现可选功能
- 固定远程资源版本
- 启用 ConfigMap/Secret 哈希后缀
- 在 README 中记录覆盖配置的目录结构
- 应用前测试构建结果
相关技能
- kubernetes-ops - K8s 基础知识
- helm-charts - Helm 替代方案
- argocd-gitops - GitOps 部署
评论
支持 Markdown