Kustomize ResourceDistribution Generator

Kruise-tools 为 kruise 的功能提供了作为kustomize的第三方插件的generator和transformers。

ResourceDistribution Generator

ResourceDistribution Generator插件从 v1.0.0 (alpha/beta) 开始,要求使用 Kustomize >= 4.3.0 的版本,安装参考 kustomize

在使用kustomize管理应用时,利用kustomize自带的generator能够直接读取文件作为data内容来创建Configmap或Secret ,避免了手动复制时容易出现的种种格式错误。ResourceDistribution Generator为kustomize的第三方插件,使用该插件可以完成读取文件作为data内容来创建ResourceDistribution的工作。

下载ResourceDistribution generaotor

该页面提供了常见版本的二进制文件下载路径。目前linux, darwin(OS X),windows提供x86_64arm64。如果您使用其他一些系统或架构,则必须下载源代码并执行go build来构建二进制文件。

API说明

ResourceDistributionGenerator是kusomize的Exec KRM functions插件,主要由 resourcetargets 两个字段构成,构建后会生成对应于ResourceDistribution的resourcetargets 内容。metadata中的name用来设置生成的resourceDistribution的名称,注解config.kubernetes.io/function中需要写入本插件在文件系统中的路径,如果使用的是相对路径,需要相对于引用配置文件的kustomization文件。

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. name: rdname
  5. annotations:
  6. config.kubernetes.io/function: |
  7. exec:
  8. path: ./plugins/resourcedistributiongenerator
  9. resource:
  10. ... ...
  11. targets:
  12. ... ...

Resource字段说明

resource字段中内容用来生成被分发的资源,literalsfilesenvs字段的使用和Configmap或Secret Generator中用法相同。

  • resourceKind: 指定分发的资源类型,Secret或ConfigMap
  • resourceName: 设置分发资源的名称,即Secret或ConfigMap的名称
  • literals: 使用给定的文字中的键/值对创建data内容
  • files: 使用给定文件的名称和内容创建data内容
  • envs: 使用文件中的键/值对创建data内容

一个配置正确的resource字段如下所示:

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. ... ...
  5. resource:
  6. resourceKind: ConfigMap
  7. resourceName: cmname
  8. files:
  9. - file.properties
  10. literals:
  11. - JAVA_HOME=/opt/java/jdk
  12. targets:
  13. ... ...

ResourceDistribution from File

ResourceDistribution 资源可以从文件中生成 - 例如从一个 java.properties文件。

示例:使用包含文件内容的数据项生成 ResourceDistribution。

ResourceDistribution 将从文件内容中填充数据值。每个文件的内容将显示为 ResourceDistribution 中由文件名作为key的单个数据项。

File Input

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. ... ...
  5. resource:
  6. resourceKind: ConfigMap
  7. resourceName: cmname
  8. files:
  9. - application.properties
  10. targets:
  11. ... ...

application.properties

  1. FOO=Bar

Build Output

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistribution
  3. metadata:
  4. ... ...
  5. spec:
  6. resource:
  7. apiVersion: v1
  8. data:
  9. application.properties: |
  10. FOO=Bar
  11. kind: ConfigMap
  12. metadata:
  13. name: cmname
  14. targets:
  15. ... ...

ResourceDistribution from Literals

ResourceDistribution 资源可以从文字键值对生成 - 例如JAVA_HOME=/opt/java/jdk.

  • 键/值由 = 分隔(左侧是键)
  • 每个文本的值将显示为 ResourceDistribution 中的一个数据项,该数据项的key即为文本的key

示例:使用从文字生成的 2 个数据项创建一个 ResourceDistribution。

File Input

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. ... ...
  5. resource:
  6. resourceKind: ConfigMap
  7. resourceName: cmname
  8. literals:
  9. - JAVA_HOME=/opt/java/jdk
  10. - JAVA_TOOL_OPTIONS=-agentlib:hprof
  11. targets:
  12. ... ...

Build Output

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistribution
  3. metadata:
  4. ... ...
  5. spec:
  6. resource:
  7. apiVersion: v1
  8. data:
  9. JAVA_HOME: /opt/java/jdk
  10. JAVA_TOOL_OPTIONS: -agentlib:hprof
  11. kind: ConfigMap
  12. metadata:
  13. name: cmname
  14. targets:
  15. ... ...

ResourceDistribution from env file

ResourceDistribution 资源可以从键值对生成,这与使用文字非常相似,但从env文件中获取键值对。

  • 环境文件中的键/值对用 = 分隔(左侧是键)
  • 每行的值将显示为 ResourceDistribution 中由其键作为key的数据项。

示例:使用从env文件生成的 3 个数据项创建一个 ResourceDistribution。

File Input

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. ... ...
  5. resource:
  6. resourceKind: ConfigMap
  7. resourceName: cmname
  8. envs:
  9. - tracing.env
  10. targets:
  11. ... ...

tracing.env

  1. ENABLE_TRACING=true
  2. SAMPLER_TYPE=probabilistic
  3. SAMPLER_PARAMETERS=0.1

Build Output

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistribution
  3. metadata:
  4. ... ...
  5. spec:
  6. resource:
  7. apiVersion: v1
  8. data:
  9. ENABLE_TRACING: "true"
  10. SAMPLER_TYPE: "probabilistic"
  11. SAMPLER_PARAMETERS: "0.1"
  12. kind: ConfigMap
  13. metadata:
  14. name: cmname
  15. targets:
  16. ... ...

Targets字段说明

targets字段和ResourceDistribution中targets字段的用法基本相同,注意includedNamespacesexcludedNamespaces字段的内容直接是命名空间的名称。

一个配置正确的targets字段如下所示:

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. ... ...
  5. resource:
  6. ... ...
  7. targets:
  8. allNamespaces: true
  9. excludedNamespaces:
  10. - ns-2
  11. includedNamespaces:
  12. - ns-1
  13. namespaceLabelSelector:
  14. matchLabels:
  15. group: "test"

Options和ResourceOptions字段说明

optionsresourceOptions字段分别用来为生成的ResourceDistribution和其中的Resource(即ConfigMap或Secret)设置注解或标签。

一个配置正确的optionsresourceOptions字段如下所示:

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistributionGenerator
  3. metadata:
  4. ... ...
  5. resource:
  6. ... ...
  7. resourceOptions:
  8. annotations:
  9. dashboard: "1"
  10. labels:
  11. environment: "dev"
  12. targets:
  13. ... ...
  14. options:
  15. annotations:
  16. type: "slave"
  17. labels:
  18. version: "stable"

完整用例

  1. 创建一个demo目录作为工作空间并进入。将下载的ResourceDistributionGenerator插件放在当前目录,并输入以下命令创建一个名为rdGenerator.yaml的配置文件。
  1. cat > rdGenerator.yaml <<EOF
  2. #rdGenerator.yaml
  3. apiVersion: apps.kruise.io/v1alpha1
  4. kind: ResourceDistributionGenerator
  5. metadata:
  6. name: rdname
  7. annotations:
  8. config.kubernetes.io/function: |
  9. exec:
  10. path: ./resourcedistributiongenerator
  11. resource:
  12. resourceKind: ConfigMap
  13. resourceName: cmname
  14. files:
  15. - application.properties
  16. literals:
  17. - JAVA_HOME=/opt/java/jdk
  18. resourceOptions:
  19. annotations:
  20. dashboard: "1"
  21. options:
  22. labels:
  23. app.kubernetes.io/name: "app1"
  24. targets:
  25. includedNamespaces:
  26. - ns-1
  27. namespaceLabelSelector:
  28. matchLabels:
  29. group: "test"
  30. EOF
  1. 使用以下命令创建application.properties文件作为文件输入。
  1. cat > application.properties <<EOF
  2. FOO=Bar
  3. FIRST=1
  4. SECOND=2
  5. LAST=3
  6. EOF
  1. 使用以下命令创建kustomization文件。
  1. cat > kustomization.yaml <<EOF
  2. #kustomization.yaml
  3. apiVersion: kustomize.config.k8s.io/v1beta1
  4. kind: Kustomization
  5. generators:
  6. - rdGenerator.yaml
  7. EOF
  1. 使用kustomize build --enable-alpha-plugins --enable-exec .命令构建应用,效果如下
  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: ResourceDistribution
  3. metadata:
  4. labels:
  5. app.kubernetes.io/name: app1
  6. name: rdname
  7. spec:
  8. resource:
  9. apiVersion: v1
  10. data:
  11. JAVA_HOME: /opt/java/jdk
  12. application.properties: |
  13. FOO=Bar
  14. FIRST=1
  15. SECOND=2
  16. LAST=3
  17. kind: ConfigMap
  18. metadata:
  19. annotations:
  20. dashboard: "1"
  21. name: cmname
  22. targets:
  23. includedNamespaces:
  24. list:
  25. - name: ns-1
  26. namespaceLabelSelector:
  27. matchLabels:
  28. group: test

在argocd中使用ResourceDistribution generator

在argocd中,kustomize插件的使用方法同上。除此之外,还需为kustomize添加允许第三方插件的构建选项。在kubernetes集群中找到名为argocd-cm的configmap,在data字段添加如下内容kustomize.buildOptions: --enable-alpha-plugins --enable-exec,即可为默认版本的kustomize添加第三方插件的构建选项。更多内容可参考ArgoCD你可以直接在argocd中使用这个样例

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: argocd-cm
  5. namespace: argocd
  6. labels:
  7. app.kubernetes.io/name: argocd-cm
  8. app.kubernetes.io/part-of: argocd
  9. data:
  10. kustomize.buildOptions: --enable-alpha-plugins --enable-exec

使用插件

将resourcedistributiongenerator插件添加到argocd的git存储库中,并在注解config.kubernetes.io/function填入插件位置

  1. #rdGenerator.yaml
  2. apiVersion: apps.kruise.io/v1alpha1
  3. kind: ResourceDistributionGenerator
  4. metadata:
  5. ...
  6. annotations:
  7. config.kubernetes.io/function: |
  8. exec:
  9. path: ./resourcedistributiongenerator

通过kustomization.yaml的generator字段引用。

  1. #kustomization.yaml
  2. apiVersion: kustomize.config.k8s.io/v1beta1
  3. kind: Kustomization
  4. generators:
  5. - rdGenerator.yaml

上传git仓库后,通过argocd app sync myapp命令,或者点击UI中的SYNC按钮,部署项目即可。

ContainerRecreateRequest