Kubernetes之kustomization
kustomization介绍
Kustomize是一个独立的工具,用来通过kustomization文件定制Kubernetes对象,从1.14 版本开始,kubectl也开始支持使用kustomization文件来管理Kubernetes对象。 要查看包含kustomization文件的目录中的资源,执行下面的命令:
#只渲染输出不创建资源
kubectl kustomize <kustomization_directory>
要应用这些资源,使用 --kustomize 或 -k 参数来执行 kubectl apply
#渲染并创建资源
kubectl apply -k <kustomization_directory>
kustomization使用
Kustomize是一个用来定制Kubernetes配置的工具,它提供以下功能特性来管理应用配置文件:
从其他来源生成资源
为资源设置贯穿性(Cross-Cutting)字段
组织和定制资源集合
生成配置文件
configMapGenerator
configMapGenerator用来生成configmap资源文件
使用files生成configmap
#创建配置文件
[root@k8s01 ~]# cat >application.properties<<EOF
> host mysql
> EOF
#生成Kustomize配置文件
[root@k8s01 ~]# cat kustomization.yaml
configMapGenerator:
- name: configmap-file
files:
- application.properties
#输出渲染结果
[root@k8s01 ~]# kubectl kustomize ./
apiVersion: v1
data:
application.properties: |
host mysql
kind: ConfigMap
metadata:
name: configmap-file-2tchm7gc98
使用env生成configmap
#生成env文件
[root@k8s01 ~]# cat <<EOF >.env
host mysql
EOF
#生成Kustomize配置文件
[root@k8s01 ~]# cat kustomization.yaml
configMapGenerator:
- name: configmap-env
envs:
- .env
#渲染验证
[root@k8s01 ~]# kubectl kustomize
apiVersion: v1
data:
host mysql
kind: ConfigMap
metadata:
name: configmap-env-85d29ccbg6
使用literals生成configmap
#生成生成Kustomize配置文件
[root@k8s01 ~]# cat kustomization.yaml
configMapGenerator:
- name: configmap-literals
literals:
- IP=mysql
- DBNAME=test
#渲染验证
[root@k8s01 ~]# kubectl kustomize
apiVersion: v1
data:
DBNAME: test
IP: mysql
kind: ConfigMap
metadata:
name: configmap-literals-cfh96f5g4m
secretGenerator
可以基于文件或者键值偶对来生成Secret,基本与configMapGenerator使用相同
secretGenerator:
- name: secret-file
files:
- application.properties
- name: secret-env
envs:
- .env
- name: secret-literals
literals:
- TEST=abc
使用配置文件
configmap使用
#kustomization配置文件
configMapGenerator:
- name: config-file
files:
- application.properties
resources:
- configMapGenerator.yml
#deploy配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: config
labels:
app: config
spec:
selector:
matchLabels:
app: config
template:
metadata:
labels:
app: config
spec:
containers:
- name: config
image: echo
volumeMounts:
- name: password
mountPath: /secrets
volumes:
- name: password
secret:
secretName: config-file
secret使用
#kustomization配置文件
secretGenerator:
- name: secret-file
files:
- application.properties
resources:
- secretGenerator.yml
#deploy配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: secret
labels:
app: secret
spec:
selector:
matchLabels:
app: secret
template:
metadata:
labels:
app: secret
spec:
containers:
- name: secret
image: echo
volumeMounts:
- name: password
mountPath: /secrets
volumes:
- name: password
secret:
secretName: secret-file
generatorOptions
所生成的ConfigMap和Secret都会包含内容哈希值后缀,这是为了确保内容发生变化时所生成的是新的ConfigMap或Secret,要禁止自动添加后缀的行为,用户可以使用generatorOptions,除此以外为生成的ConfigMap和Secret指定贯穿性选项也是可以的
configMapGenerator:
- name: configmap-file
files:
- application.properties
secretGenerator:
- name: secret-file
files:
- application.properties
generatorOptions:
disableNameSuffixHash: true #关闭哈希
设置贯穿性字段
在项目中为所有Kubernetes对象设置贯穿性字段是一种常见操作, 贯穿性字段的一些使用场景如下:
为所有资源设置相同的名字空间
为所有对象添加相同的前缀或后缀
为对象添加相同的标签集合
为对象添加相同的注解集合
示例:
namespace: test #为所有资源知道ns
namePrefix: dev- #为所有资源名称添加前缀
nameSuffix: "-001" #为所有资源名称添加后缀
commonLabels: #为所有资源添加lable
app: tools
commonAnnotations: #为所有资源添加注释annotations
oncallPager: 200-659-9999
组织和定制资源
一种常见的做法是在项目中构造资源集合并将其放到同一个文件或目录中管理,Kustomize提供基于不同文件来组织资源并向其应用补丁或者其他定制的能力
组织resources
Kustomize支持组合不同的资源,kustomization.yaml文件的resources字段定义配置中要包含的资源列表,可以将resources列表中的路径设置为资源配置文件的路径,下面是由Deployment和Service构成的NGINX应用的示例:
resources: #引用资源文件
- nginx/deploy.yml
- nginx/service.yml
定制Patches
补丁文件(Patches)可以用来对资源执行不同的定制,Kustomize通过patchesStrategicMerge和patchesJson6902支持不同的打补丁机制,例如构造一个补丁来增加Deployment 的副本个数,构造另外一个补丁来设置内存限制
#patchesJson6902
cat nginx_set_raplace.yml
- op: replace
path: /spec/replicas
value: 3
#patchesStrategicMerge
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
template:
spec:
containers:
- name: nginx
resources:
limits:
memory: 512Mi
#使用
resources:
- nginx/deploy.yml
- nginx/service.yml
patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: nginx
path: nginx_set_raplace.yml
patchesStrategicMerge:
- nginx_set_memory.yml
设置资源新的镜像
Kustomize还提供定制容器镜像或者将其它对象的字段值注入到容器中的能力,并且不需要创建补丁, 例如可以通过在kustomization.yaml文件的images字段设置新的镜像来更改容器中使用的镜像
#Nginx资源文件
[root@k8s01 ~]# cat nginx/deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
run: nginx
replicas: 1
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: nginx:1.18.0
ports:
- containerPort: 80
#kustomization文件
[root@k8s01 ~]# cat kustomization.yaml
...
resources:
- nginx/deploy.yml
- nginx/service.yml
images:
- name: nginx #旧的镜像名称
newName: nginx #新的镜像名称
newTag: 1.20.0 #新的镜像tag
...
基准(Bases)与覆盖(Overlays)
Kustomize中有基准(bases)和覆盖(overlays) 的概念区分。 基准是包含kustomization.yaml文件的一个目录,其中包含一组资源及其相关的定制。 基准可以是本地目录或者来自远程仓库的目录,只要其中存在kustomization.yaml文件即可。 覆盖也是一个目录,其中包含将其它kustomization目录当做bases来引用的kustomization.yaml文件。 基准不了解覆盖的存在,且可被多个覆盖所使用。 覆盖则可以有多个基准,且可针对所有基准中的资源执行组织操作,还可以在其上执行定制
# 查看创建的目录结构
[root@k8s01 ~]# tree app/
app/
├── base
│ ├── deploy.yml
│ ├── kustomization.yaml
│ └── service.yml
└── overlays
├── dev
│ └── kustomization.yaml
├── uat
│ └── kustomization.yaml
└── prod
└── kustomization.yaml
# deploy文件内容
[root@k8s01 app]# cat base/deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.18.0
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx
# base/kustomization.yaml
[root@k8s01 app]# cat base/kustomization.yaml
resources:
- deploy.yml
# dev/kustomization.yaml
[root@k8s01 app]# cat overlays/dev/kustomization.yaml
namespace: dev-env
namePrefix: dev-
commonLabels:
app: app-dev
namespace: dev-env
namePrefix: dev-
namespace: dev-env
namePrefix: dev-
commonLabels:
app: app-dev
commonAnnotations:
oncallPager: app-dev
resources:
- ../../base
images:
- name: nginx
newName: nginx
newTag: 1.20.0
# uat/kustomization.yaml
[root@k8s01 app]# cat overlays/uat/kustomization.yaml
namespace: test-env
namePrefix: uat-
commonLabels:
app: app-uat
commonAnnotations:
oncallPager: app-uat
resources:
- ../../base
images:
- name: nginx
newName: nginx
newTag: 1.20.0
#使用
[root@k8s01 ~]# kubectl apply -k app/overlays/dev/
[root@k8s01 ~]# kubectl apply -k app/overlays/uat/
Kustomize命令
kubectl命令中使用--kustomize或-k参数来识别被kustomization.yaml所管理的资源。 注意-k要指向一个kustomization目录,例如:
#渲染资源文件并输出
kubectl kustomize app/overlays/uat/
#创建资源
kubectl apply -k app/overlays/dev/
#查看所创建的资源
kubectl get -k app/overlays/dev/
#查看详细信息
kubectl describe -k app/overlays/dev/
#比较对象与清单被应用之后集群将处于的状态
kubectl diff -k app/overlays/dev/
#删除资源
kubectl delete -k app/overlays/dev/