Kustomize ResourceDistribution Generator

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

    该页面提供了常见版本的二进制文件下载路径。目前, 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文件。

    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的单个数据项。

    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.

    示例:使用从文字生成的 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. - JAVA_TOOL_OPTIONS=-agentlib:hprof
    9. targets:
    10. ... ...

    Build Output

    ResourceDistribution from env file

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

    示例:使用从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. ... ...
    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"

    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. annotations:
    15. labels:
    16. version: "stable"

    完整用例

    1. 创建一个demo目录作为工作空间并进入。将下载的ResourceDistributionGenerator插件放在当前目录,并输入以下命令创建一个名为rdGenerator.yaml的配置文件。
    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中,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字段引用。

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