github, 使用 Kustomize 声明式管理 Kubernetes 对象
Kustomize 提供了一种无需模板和 DSL 即可定制 Kubernetes 资源配置的解决方案。
Kustomize 允许您自定义原始的、无模板的 YAML 文件以用于多种用途,同时保持原始 YAML 不变并可按原样使用。
Kustomize 以 kubernetes 为目标;它能够理解并修补kubernetes styleAPI 对象。它与 make类似,其功能在文件中声明;它与sed类似,其功能是发出编辑后的文本。
该工具由sig-cli ( KEP )赞助。
二进制
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
https://github.com/kubernetes-sigs/kustomize/releases/tag/v2.0.3
https://github.com/kubernetes-sigs/kustomize/releases/download/v2.0.3/kustomize_2.0.3_linux_amd64
tar -xf kustomize_v5.0.1_linux_amd64.tar.gz
mv kustomize /usr/bin/
Docker
# pull the image
docker pull registry.k8s.io/kustomize/kustomize:v5.0.0
# run 'kustomize version'
docker run registry.k8s.io/kustomize/kustomize:v5.0.0 version
要查找 kubectl 最新版本中嵌入的 kustomize 版本,请运行kubectl version:
> kubectl version --client
Client Version: v1.31.0
Kustomize Version: v5.4.2
v2.0.3中的 kustomize 构建流程已添加到kubectl v1.14中。kubectl 中的 kustomize 流程一直冻结在 v2.0.3 上,直到 kubectl v1.21 将其更新至 v4.0.5。它将在未来定期更新,此类更新将反映在 Kubernetes 发行说明中。
| Kubectl 版本 | Kustomize 版本 |
|---|---|
| < v1.14 | 无 |
| v1.14-v1.20 | v2.0.3 |
| v1.21 | v4.0.5 |
| v1.22 | v4.2.0 |
| v1.23 | v4.4.1 |
| v1.24 | v4.5.4 |
| v1.25 | v4.5.7 |
| v1.26 | v4.5.7 |
| v1.27 | v5.0.1 |
有关使用 kubectl 集成的示例和指南,请参阅kubernetes 文档。
在包含 YAML资源 文件(部署、服务、配置图等) 的某个目录中,创建一个kustomization文件。
该文件应该声明这些资源以及应用于它们的任何自定义,例如添加一个通用标签。
base: kustomization + resources
kustomization.yaml
+---------------------------------------------+
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: true
pairs:
app: myapp
resources:
- deployment.yaml
- service.yaml
configMapGenerator:
- name: myapp-map
literals:
- KEY=value
+---------------------------------------------+
deployment.yaml
+-------------------------------------------------------+
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 6060
+-------------------------------------------------------+
service.yaml
+-----------------------------------+
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 6060
targetPort: 6060
+-----------------------------------+
文件结构:
~/someApp ├── deployment.yaml ├── kustomization.yaml └── service.yaml
此目录中的资源可能是其他人配置的分支。如果是这样,您可以轻松地从源材料重新定位以捕获改进,因为您不会直接修改资源。
使用以下方法生成定制的 YAML:
kustomize build ~/someApp
YAML 可以直接应用于集群:
kustomize build ~/someApp | kubectl apply -f -
使用修改通用 base 的 overlay 来管理配置的传统 variant - 例如 development、staging 和 production。
overlay: kustomization + patches
kustomization.yaml
+-----------------------------------------------+
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
labels:
- includeSelectors: true
pairs:
variant: prod
resources:
- ../../base
patches:
- path: replica_count.yaml
- path: cpu_count.yaml
+-----------------------------------------------+
replica_count.yaml
+-------------------------------+
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 80
+-------------------------------+
cpu_count.yaml
+------------------------------------------+
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
containers:
- name: myapp
resources:
limits:
memory: "128Mi"
cpu: "7000m"
+------------------------------------------+
文件结构:
~/someApp ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays ├── development │ ├── cpu_count.yaml │ ├── kustomization.yaml │ └── replica_count.yaml └── production ├── cpu_count.yaml ├── kustomization.yaml └── replica_count.yaml
将上面步骤 (1) 中的工作移到 someApp名为 的子目录中base,然后将覆盖放置在同级目录中。
覆盖只是另一种定制,指的是基础,并指的是应用于该基础的补丁。
这种安排使得使用 管理配置变得容易git。基础存储库可以包含其他人管理的上游存储库中的文件。覆盖存储库可以位于您自己的存储库中。将存储库克隆安排为磁盘上的同级存储库可避免使用 git 子模块(尽管如果您是子模块爱好者,这样做效果很好)。
使用以下方式生成 YAML
kustomize build ~/someApp/overlays/development
kustomize build ~/someApp/overlays/production
YAML 可以直接应用于集群:
kustomize build ~/someApp/overlays/development | kubectl apply -f -
kustomize build ~/someApp/overlays/production | kubectl apply -f -
使用 Helm Chart 和 Kustomize 覆盖配置:
这种方法的优点是,你可以利用 Helm 进行更复杂的应用安装(例如处理依赖关系、版本控制等),而使用 Kustomize 来轻松地定制和管理应用程序的配置。
通过 Helm 渲染并使用 Kustomize:
你可以使用类似以下的命令来将 Helm Chart 渲染为 Kubernetes YAML 配置:
bashCopy helm template <chart-name> --namespace <namespace> --values <values-file> > rendered.yaml
然后使用 Kustomize 对 rendered.yaml 进行定制:
bashCopy kustomize build . > customized.yaml
这样,你就可以对 Helm 渲染出的 Kubernetes 配置进行覆盖。