kustomization的使用

安装 kustomize 命令

1
2
3
4
#!/bin/sh
wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v5.4.3/kustomize_v5.4.3_linux_amd64.tar.gz >/dev/null 2>&1
tar -xzvf kustomize_v5.4.3_linux_amd64.tar.gz -C /usr/local/bin/ >/dev/null 2>&1
chmod +x /usr/local/bin/kustomize

kustomization

kustomize 是一个通过 kustomization 文件定制 kubernetes 对象的工具,它可以通过一些资源生成一些新的资源,也可以定制不同的资源的集合。

kustomization 常见目录布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├── base
├── deployment.yaml
├── kustomization.yaml
└── service.yaml
└── overlays
├── dev
├── kustomization.yaml
└── patch.yaml
├── prod
├── kustomization.yaml
└── patch.yaml
└── staging
├── kustomization.yaml
└── patch.yaml
  • /bases目录保存的是基本的配置

  • /overlays【此文件夹也可以省略】里放置的不同环境的配置,例如 /dev/staging/prod这些就是不同环境的配置,

  • /base等文件夹下都有一个 kustomization .yml 文件,用于配置。

kustomization 自定义目录布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
├── base
├── configmap
├── configmap.yaml
└── kustomization.yaml
├── nginx
├── deployment.yaml
├── kustomization.yaml
└── service.yaml
└── redis
├── deployment.yaml
├── kustomization.yaml
└── service.yaml
└── overlays
├── dev
├── nginx
├── kustomization.yaml
└── patch.yaml
└── redis
├── kustomization.yaml
└── patch.yaml
├── prod
└── staging

kustomization.yml 常用字段详解

kustomize 提供了比较丰富的字段选择,除此之外还可以自定义插件,下面会大概列举一下每个字段的含义,当我们需要用到的时候知道有这么个能力,然后再去 Kustomize 官方文档 查找对应的 API 文档就行了。kustomization.yaml 中常用字段参考官方文档:

resources

表示 k8s 资源的位置,这个可以是一个文件,也可以指向一个文件夹,读取的时候会按照顺序读取,路径可以是相对路径也可以是绝对路径,如果是相对路径那么就是相对于 kustomization.yml的路径

1
2
3
4
5
6
apiVersion: kustomize.config.k8s.io/v1beta1 #创建该对象所使用的API版本
kind: Kustomization #创建的对象的类别

resources: #资源文件的位置
- nginx.yaml #资源文件为当前文件夹下的nginx.yaml
- ../configmap #资源文件为当前文件夹同级文件夹config

namespace

为所有资源添加 namespace

1
2
3
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: doubao

images

修改镜像的nametagimage digest ,而无需使用 patches 。例如,对于这种 kubernetes Deployment 片段:

1
2
3
4
5
6
7
8
kind: Deployment
...
spec:
template:
spec:
containers:
- name: nginx
image: dockerhub.qingcloud.com/doubao/nginx:latest

想要将 image 做如下更改:

  • 将 nginx tag 从 latest 改为 stable-perl

只需在 kustomization 中添加以下内容:

1
2
3
4
5
6
7
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

images:
- name: dockerhub.qingcloud.com/doubao/nginx #deploy中的镜像名字
newName: dockerhub.qingcloud.com/doubao/nginx #新的镜像名字
newTag: stable-perl #新的镜像的tag

replicas

修改资源副本数

1
2
3
4
5
6
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

replicas:
- name: redis
count: 5

该字段内容为列表,所以可以同时修改许多资源。

由于这个声明无法设置 kind:group:,所以他只能匹配如下资源中的一种:

  • Deployment
  • ReplicationController
  • ReplicaSet
  • StatefulSet

namePrefix

为所有资源和引用的名称添加前缀

1
2
3
4
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namePrefix: doubao-

nameSuffix

为所有资源和引用的名称添加后缀

1
2
3
4
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

nameSuffix: -v2

patches

在资源上添加或覆盖字段,Kustomization 使用 patches 字段来提供该功能。

patches 字段包含要按指定顺序应用的 patch 列表。

patch 可以:

  • 是一个 strategic merge patch,或者是一个 JSON patch
  • 也可以是 patch 文件或 inline string
  • 针对单个资源或多个资源

目标选择器可以通过 group、version、kind、name、namespace、标签选择器和注释选择器来选择资源,选择一个或多个匹配所有指定字段的资源来应用 patch。

patch.yml更该了镜像拉取策略和pod的实例数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
replicas: 6
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
imagePullPolicy: Always

patch.json中修改了deployment的name和部署镜像后的名字

1
2
3
4
[
{ "op": "replace", "path": "/metadata/name", "value": "jsonredis" },
{ "op": "add", "path": "/spec/template/spec/containers/0/name", "value": "jsonredis"}
]

kustomization.yml中添加了patch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../../../base/redis


#修改base/redis/redis.yml中的replicas
replicas:
- name: redis
count: 5
#修改base/redis/redis.yml中的镜像
images:
- name: dockerhub.qingcloud.com/doubao/redis
newName: dockerhub.qingcloud.com/doubao/redis
newTag: latest

#patch属性来添加或者覆盖
patches:
- path: patch.yaml #使用patch.yml中的参数覆盖base/redis/redis.yml,和patchesStrategicMerge一样
target:
kind: Deployment
- patch: |- #使用json的方式来替换base/redis/redis.ym.和patchesJson6902一样
- op: replace
path: /spec/template/spec/containers/0/name
value: bigredis
- op: replace
path: /spec/template/spec/containers/0/ports/0/containerPort
value: 8001
target:
kind: Deployment
- path: patch.json #使用patch.json中的参数覆盖base/redis/redis.yml,和patchesJson6902一样
target:
kind: Deployment #所选择的对象类别
version: v1 #对象的版本
name: redis #deployment的name

namespace: doubao
namePrefix: poc-
nameSuffix: -v2

patchesJson6902

列表中的每个条目都应可以解析为 kubernetes 对象和将应用于该对象的 JSON patch

patch.json

1
2
3
4
[
{ "op": "replace", "path": "/metadata/name", "value": "jsonredis" },
{ "op": "add", "path": "/spec/template/spec/containers/0/name", "value": "jsonredis"}
]

patchesStrategicMerge

使用 strategic merge patch 标准 Patch resources.

patch.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
replicas: 6
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
imagePullPolicy: Always

commonAnnotations 为所有资源加上 annotations 如果对应的 key 已经存在值,这个值将会被覆盖

commonLabels 为所有资源的加上 labellabel selector 注意:这个操作会比较危险

configMapGenerator

列表中的每个条目都将生成一个 ConfigMap (合计可以生成 n 个 ConfigMap)。

以下示例创建四个 ConfigMap:

  • 第一个使用给定文件的名称和内容创建数据
  • 第二个使用文件中的键/值对将数据创建为键/值
  • 第三个使用 literals 中的键/值对创建数据作为键/值
  • 第四个通过 options 设置单个 ConfigMap 的注释和标签

每个 configMapGenerator 项均接受的参数 behavior: [create|replace|merge],这个参数允许修改或替换父级现有的 configMap。

此外,每个条目都有一个 options 字段,该字段具有与 kustomization 文件的 generatorOptions 字段相同的子字段。

options 字段允许用户为生成的实例添加标签和(或)注释,或者分别禁用该实例名称的哈希后缀。此处添加的标签和注释不会被 kustomization 文件 generatorOptions 字段关联的全局选项覆盖。但是如果全局 generatorOptions 字段指定 disableNameSuffixHash: true,其他 options 的设置将无法将其覆盖。

ConfigMap from file

kustomization.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization


resources:
- ../../../base/redis

generatorOptions: #全局设置
disableNameSuffixHash: true #禁止在CM的名字后面添加hash值

configMapGenerator:
- name: base-config #已经存在的configMap的名字
behavior: merge #将新生成的configMap合并到上面已经存在的CM中
file: #根据下面的资源文件生产的CM
- application.properties #同级目录下的资源文件
options:
disableNameSuffixHash: true

application.properties

1
dou=bao #根据此键值对生产CM

ConfigMap from env file

kustomization.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../../../base/redis

generatorOptions: #全局设置
disableNameSuffixHash: true #禁止在CM的名字后面添加hash值

configMapGenerator:
- name: base-config #已经存在的configMap的名字
behavior: merge #将新生成的configMap合并到上面已经存在的CM中
envs: #根据下面的资源文件生产的CM设置成env[环境变量]
- application.properties #同级目录下的资源文件
options:
disableNameSuffixHash: true

application.properties

1
dou=bao #根据此键值对生产CM

ConfigMap from Literals

kustomization.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../../../base/redis

generatorOptions:
disableNameSuffixHash: true

configMapGenerator:
- name: redis-config-gen
literals: #根据此属性下的键值对生产CM
- doubao=xixi

secretGenerator

生成 Secret 资源。

列表中的每个条目都将生成一个 Secret(合计可以生成 n 个 Secrets)。

功能与 configMapGenerator 字段类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../../../base/redis

generatorOptions:
disableNameSuffixHash: true
secretGenerator:
- name: db-secret #secret名字
files:
- "db.username" #从文件中读取信息
- "db.password"

db.username

1
root

db.password

1
123456

生产的db-secret

1
2
3
4
5
6
7
8
9
apiVersion: v1
data:
db.password: cm9vdA==
db.username: MTIzNDU2
kind: Secret
metadata:
name: db-secret
namespace: doubao
type: Opaque

generatorOptions

用于控制configMapGeneratorsecretGenerator 的行为

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

generatorOptions:
#给所有生成的资源添加标签
labels:
kustomize.generated.resources: somevalue
#给所有生成的资源添加注解
annotations:
kustomize.generated.resource: somevalue
# true是禁止生成hash后缀
disableNameSuffixHash: true

Kustomize 的内置功能

Kustomize Built-Ins | SIG CLI (kubernetes.io)