Kustomize

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 集成

要查找 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 文档

用法

1)制作kustomization文件

在包含 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 -

2)使用overlay创建[variant

使用修改通用 baseoverlay 来管理配置的传统 variant - 例如 developmentstagingproduction

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 -

3)结合 Helm 使用 Kustomize

  1. 使用 Helm Chart 和 Kustomize 覆盖配置

    这种方法的优点是,你可以利用 Helm 进行更复杂的应用安装(例如处理依赖关系、版本控制等),而使用 Kustomize 来轻松地定制和管理应用程序的配置。

  2. 通过 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 配置进行覆盖。