前言
在前面的文章中已经介绍了 kustomize 是什么,以及如何开始使用和如何简单的在 CI/CD 中使用,本篇文章将会介绍 kustomize 的核心文件 kustomization.yaml。
另外,博主已经向 kustomize 贡献了中文文档,已被官方采纳,现在在 kustomize 中的 docs/zh
目录中就可看到,翻译的不好的地方欢迎指正。同时也在 GitHub 上新建了一个 名为 kustomize-lab 的 repo 用于演示 kustomize 的各种用法及技巧,本文中介绍的内容也会同步更新到该 repo 中,欢迎 fork、star、PR。
kustomization.yaml
的作用
Kustomize 允许用户以一个应用描述文件 (YAML 文件)为基础(Base YAML),然后通过 Overlay 的方式生成最终部署应用所需的描述文件。
有前面的文章《使用 Kustomize 帮你管理 kubernetes 应用(二): Kustomize 的使用方法》中已经介绍了,每个 base
或 overlays
中都必须要有一个 kustomization.yaml
,这里我们看一下官方示例 helloWorld
中的 kustomization.yaml
:
commonLabels:
app: hello
resources:
- deployment.yaml
- service.yaml
- configMap.yaml
可以看到该项目中包含3个 resources , deployment.yaml
、service.yaml
、 configMap.yaml
。
.
└── helloWorld
├── configMap.yaml
├── deployment.yaml
├── kustomization.yaml
└── service.yaml
直接执行命令:
kustomize build helloWorld
就可以看到结果了:
apiVersion: v1
data:
altGreeting: Good Morning!
enableRisky: "false"
kind: ConfigMap
metadata:
labels:
app: hello
name: the-map
image:
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello
name: the-service
spec:
ports:
- port: 8666
protocol: TCP
targetPort: 8080
selector:
app: hello
deployment: hello
type: LoadBalancer
image:
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hello
name: the-deployment
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
deployment: hello
spec:
containers:
- command:
- /hello
- --port=8080
- --enableRiskyFeature=$(ENABLE_RISKY)
env:
- name: ALT_GREETING
valueFrom:
configMapKeyRef:
key: altGreeting
name: the-map
- name: ENABLE_RISKY
valueFrom:
configMapKeyRef:
key: enableRisky
name: the-map
image: monopole/hello:1
name: the-container
ports:
- containerPort: 8080
从上面的结果可以看大 kustomize 通过 kustomization.yaml
将3个 resources 进行了处理,给三个 resources 添加了共同的 labels app: hello
。这个示例展示了 kustomization.yaml
的作用:将不同的 resources 进行整合,同时为他们加上相同的配置。
进阶使用
上面只不过是一个简单的示例,下面将结合实际情况分享一些比较实用的用法
根据环境生成不同配置
在实际的使用中,使用最多的就是为不同的环境配置不同的 deploy.yaml
,而使用 kustomize 可以把配置拆分为多个小的 patch ,然后通过 kustomize 来进行组合。而根据环境的不同,每个 patch 都可能不同,包括分配的资源、访问的方式、部署的节点都可以自由的定制。
.
├── flask-env
│ ├── README.md
│ ├── base
│ │ ├── deployment.yaml
│ │ ├── kustomization.yaml
│ │ └── service.yaml
│ └── overlays
│ ├── dev
│ │ ├── healthcheck_patch.yaml
│ │ ├── kustomization.yaml
│ │ └── memorylimit_patch.yaml
│ └── prod
│ ├── healthcheck_patch.yaml
│ ├── kustomization.yaml
│ └── memorylimit_patch.yaml
这里可以看到配置分为了 base
和 overlays
, overlays
则是继承了 base
的配置,同时添加了诸如 healthcheck 和 memorylimit 等不同的配置,那么我们分别看一下 base
和 overlays
中 kustomization.yaml
的内容
base
commonLabels: app: test-cicd resources: - service.yaml - deployment.yaml
base
中的 kustomization.yaml
中定义了一些基础配置
overlays
bases: - ../../base patchesStrategicMerge: - healthcheck_patch.yaml - memorylimit_patch.yaml namespace: devops-dev
overlays
中的 kustomization.yaml
则是基于 base
新增了一些个性化的配置,来达到生成不同环境的目的。
执行命令
kustomize build flask-env/overlays/dev
结果
apiVersion: v1
kind: Service
metadata:
labels:
app: test-cicd
name: test-cicd
namespace: devops-dev
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: test-cicd
type: ClusterIP
image:
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-cicd
name: test-cicd
namespace: devops-dev
spec:
replicas: 1
selector:
matchLabels:
app: test-cicd
template:
metadata:
labels:
app: test-cicd
version: 0.0.3
spec:
containers:
- env:
- name: ENV
value: dev
image: guoxudongdocker/flask-python:latest
imagePullPolicy: Always
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 20
name: test-cicd
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 20
resources:
limits:
cpu: 300m
memory: 500Mi
requests:
cpu: 300m
memory: 500Mi
volumeMounts:
- mountPath: /etc/localtime
name: host-time
imagePullSecrets:
- name: registry-pull-secret
volumes:
- hostPath:
path: /etc/localtime
name: host-time
可以看到包括 replicas
、limits
、requests
、env
等 dev 中个性的配置都已经出现在了生成的 yaml 中。由于篇幅有限,这里没有把所有的配置有罗列出来,需要的可以去 GitHub 上自取。
结语
上面所有的 kustomize build dir/
都可以使用 kubectl apply -k dir/
实现,但是需要 v14.0
版以上的 kubectl
,也就是说,其实我们在集成到 CI/CD 中的时候,甚至都不需要用来 kustomize
命令集,有 kubectl
就够了。
由于篇幅有限,这里没法吧所有 kustomization.yaml
的用途都罗列出来,不过可以在官方文档中找到我提交的中文翻译版 kustomization.yaml
,可以直接去官方 GitHub 查看。同时 kustomize-lab 会持续更行,敬请关注。