当前位置:网站首页>kustomize入门示例及基本语法使用说明

kustomize入门示例及基本语法使用说明

2022-08-09 12:34:00 学亮编程手记

本文对kustomize进行学习,参见文档GitHub, Document

kustomizelets you customize raw, template-free YAML files for multiple purposes, leaving the original YAML untouched and usable as is.

v1.14之后,the kustomize build system被合到kubectl中。安装kustomize请参见Install

一般使用base+overlays的方式来管理yaml文件,base中包含resource yaml文件以及自己的kustomization.yaml文件,overlays中包含base的变种,用来对base中的yaml文件进行修改,适应于不同的环境。

通常的文件结构如下:

~/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

使用下面命令来生成YAML文件,也可以直接apply生成的YAML文件。

kustomize build ~/someApp/overlays/production
kustomize build ~/someApp/overlays/production | kubectl apply -f -

下面来讲解具体使用Kustomization.yaml来定制化k8s yaml文件。

Kustomization.yaml中通常包含3种类型的标注:

-bases:

bases用来提供一系列包含kustomization.yaml文件的目录或git repo。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- path/to/dir/with/kust/
- https://github.com/org/repo/dir/

-resources:

用来指定一系列需要配置的Resource Config file,每个文件中可定义多个resource config并使用"\n---\n"来分隔。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# list of files containing Resource Config to add
resources:
- path/to/resource.yaml
- another/path/to/resource.yaml

-configMapGenerator:

包含一系列需要生成的ConfigMaps。默认情况下,会将configmap的hash作为name的后缀,放在nameSuffix之后。

ConfigMap data的更改将会创建具有新name的ConfigMap,并滚动更新正在被使用的ConfigMap。PodTemplates中使用ConfigMap需要使用configMapGenerator的name,这样configmap name更新后会自动更新refer的configmap name。

通过指定generatorOptions.disableNameSuffixHash=true并将该kustomization.yaml作为base,将使得生成的configmap中不包含hash后缀。但这样就不会有滚动升级来实时更新configmap。

包含如下的参数:

  • behavior:定义在base中时指定merge行为,包括:create, replace, merge。
  • env:指定生成configmap的文件,文件内容以key=value指定;
  • files: 指定用来生成configmap的多个文件,文件名作为configmap key,文件内容作为value;
  • literals:使用key=value对来生成configmap;
  • name:configmap的名称,会被nameprefix和namesuffix修改;
  • namespace:指定configmap的namespace,会被kustomize的namespace修改。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
# generate a ConfigMap named my-java-server-props-<some-hash> where each file
# in the list appears as a data entry (keyed by base filename).
- name: my-java-server-props
  files:
  - application.properties
  - more.properties
# generate a ConfigMap named my-java-server-env-vars-<some-hash> where each literal
# in the list appears as a data entry (keyed by literal key).
- name: my-java-server-env-vars
  literals:    
  - JAVA_HOME=/opt/java/jdk
  - JAVA_TOOL_OPTIONS=-agentlib:hprof
# generate a ConfigMap named my-system-env-<some-hash> where each key/value pair in the
# env.txt appears as a data entry (separated by \n).
- name: my-system-env
  env: env.txt

-secretGenerator

用来生成Secrets。跟configMapGenerator类似,secretGenerator的name后也会有hash值并在hash值变化时创建新的secret进行滚动升级,同样,可以取消。

具有configMapGenerator中所有的参数并且意义相同。同时,存在参数type来指定Secret的类型,若为"http://kubernetes.io/tls",需要包含2个key:"tls.key" and "tls.crt".

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
secretGenerator:
  # generate a tls Secret
- name: app-tls
  files:
    - secret/tls.cert
    - secret/tls.key
  type: "kubernetes.io/tls"
- name: env_file_secret
  # env is a path to a file to read lines of key=val
  # you can only specify one env file per secret.
  env: env.txt
  type: Opaque

-commonAnnotations

用来为所有resources添加或更新指定annotation。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonAnnotations:
  annotationKey1: "annotationValue2"
  annotationKey2: "annotationValue2"

-commonLabels

类似于commonAnnotations,用来为所有resource添加或更新指定label。但不同的是,label也会添加到PodTemplates中的label selector和label字段。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
  labelKey1: "labelValue1"
  labelKey2: "labelValue2"

-images

用来更新所有匹配image name的[spec.template.]spec.containers.image字段中的image name和image tag。

若image名称为name:tag,digest用来替代tag来refer image的另一种方法。具有如下参数:

  • name 用于获取匹配image name的所有image;
  • newName 用来替换所有匹配image的name;
  • newTag 用来替换所有匹配image的tag;
  • digest 用来替换所有匹配image的tag;

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
  - name: postgres
    newName: my-registry/my-postgres
    newTag: v1
  - name: nginx
    newTag: 1.8.0
  - name: my-demo-app
    newName: my-app
  - name: alpine
    digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3

-patchesJson6902

用来根据path指定的json或yaml文件来生成target指定的k8s resource。Target中可以包含group, kind, name, namespace, version等信息,Path中指定patch file的路径。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patchesJson6902:
- target:
    version: v1
    kind: Deployment
    name: my-deployment
  path: add_init_container.yaml
- target:
    version: v1
    kind: Service
    name: my-service
  path: add_service_annotation.yaml

其中,path字段指定的JSON patch文件,格式参见JSON patch。示例如下:

 - op: add
   path: /some/new/path
   value: value
 - op: replace
   path: /some/existing/path
   value: new value

-patchesStrategicMerge

为匹配的resource config实施patches。推荐使用只修改单个资源的小patch。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patchesStrategicMerge:
- service_port_8888.yaml
- deployment_increase_replicas.yaml
- deployment_increase_memory.yaml

-namespace

用来指定所有resource的namespace,会覆盖resource中已经指定的namespace。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: "my-app-namespace"

-namePrefix/nameSuffix

用来为所有resource name指定前缀或后缀。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: "my-app-name-prefix-"
nameSuffix: "-my-app-name-suffix"

-vars

用来定义Pod container中的参数或环境变量,使用$(MY_VAR_NAME)来使用变量。

包含如下参数:

  • name 变量的名称,以${name}方式使用
  • objref Reference to the object containing the field to be referenced.
  • fieldref Reference to the field in the object, 默认为metadata.name

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
vars:
  - name: SOME_SECRET_NAME
    objref:
      kind: Secret
      name: my-secret
      apiVersion: v1
  - name: MY_SERVICE_NAME
    objref:
      kind: Service
      name: my-service
      apiVersion: v1
    fieldref:
      fieldpath: metadata.name
  - name: ANOTHER_DEPLOYMENTS_POD_RESTART_POLICY
    objref:
      kind: Deployment
      name: my-deployment
      apiVersion: apps/v1
    fieldref:
      fieldpath: spec.template.spec.restartPolicy

使用示例:

containers:
- image: myimage
  command: ["start", "--host", "$(MY_SERVICE_NAME)"]
  env:
   - name: SECRET_TOKEN
     value: $(SOME_SECRET_NAME)

Meta options用来控制Kustomize怎么生成来更新resource config。包含configurations和generatorOptions。

-configurations

用来配置built-in Kustomize Transformers指定CRD过程中的行为。

-generatorOptions

用来定制化configmap/secret generator的行为。

示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
generatorOptions:
  # labels to add to all generated resources
  labels:
    kustomize.generated.resources: somevalue
  # annotations to add to all generated resources
  annotations:
    kustomize.generated.resource: somevalue
  # disableNameSuffixHash is true disables the default behavior of adding a
  # suffix to the names of generated resources that is a hash of
  # the resource contents.
  disableNameSuffixHash: true

样例Kustomization.yaml参见Kustomization.yaml


参考链接:

kustomize - 知乎本文对kustomize进行学习,参见文档 GitHub, Document。 kustomizelets you customize raw, template-free YAML files for multiple purposes, leaving the original YAML untouched and usable as is.在 v1.14之…https://zhuanlan.zhihu.com/p/92487688

原网站

版权声明
本文为[学亮编程手记]所创,转载请带上原文链接,感谢
https://zhangxueliang.blog.csdn.net/article/details/126242767