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/

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Kubernetes Kubernetes
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝