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_64和arm64。如果您使用其他一些系统或架构,则必须下载源代码并执行go build来构建二进制文件。
API说明
ResourceDistributionGenerator是kusomize的Exec KRM functions插件,主要由 resource 和 targets 两个字段构成,构建后会生成对应于ResourceDistribution的resource 和 targets 内容。metadata中的name用来设置生成的resourceDistribution的名称,注解config.kubernetes.io/function中需要写入本插件在文件系统中的路径,如果使用的是相对路径,需要相对于引用配置文件的kustomization文件。
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:name: rdnameannotations:config.kubernetes.io/function: |exec:path: ./plugins/resourcedistributiongeneratorresource:... ...targets:... ...
Resource字段说明
resource字段中内容用来生成被分发的资源,literals、files、envs字段的使用和Configmap或Secret Generator中用法相同。
resourceKind: 指定分发的资源类型,Secret或ConfigMapresourceName: 设置分发资源的名称,即Secret或ConfigMap的名称literals: 使用给定的文字中的键/值对创建data内容files: 使用给定文件的名称和内容创建data内容envs: 使用文件中的键/值对创建data内容
一个配置正确的resource字段如下所示:
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:... ...resource:resourceKind: ConfigMapresourceName: cmnamefiles:- file.propertiesliterals:- JAVA_HOME=/opt/java/jdktargets:... ...
ResourceDistribution from File
ResourceDistribution 资源可以从文件中生成 - 例如从一个 java.properties文件。
示例:使用包含文件内容的数据项生成 ResourceDistribution。
ResourceDistribution 将从文件内容中填充数据值。每个文件的内容将显示为 ResourceDistribution 中由文件名作为key的单个数据项。
File Input
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:... ...resource:resourceKind: ConfigMapresourceName: cmnamefiles:- application.propertiestargets:... ...
application.properties
FOO=Bar
Build Output
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionmetadata:... ...spec:resource:apiVersion: v1data:application.properties: |FOO=Barkind: ConfigMapmetadata:name: cmnametargets:... ...
ResourceDistribution from Literals
ResourceDistribution 资源可以从文字键值对生成 - 例如JAVA_HOME=/opt/java/jdk.
- 键/值由 = 分隔(左侧是键)
- 每个文本的值将显示为 ResourceDistribution 中的一个数据项,该数据项的key即为文本的key
示例:使用从文字生成的 2 个数据项创建一个 ResourceDistribution。
File Input
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:... ...resource:resourceKind: ConfigMapresourceName: cmnameliterals:- JAVA_HOME=/opt/java/jdk- JAVA_TOOL_OPTIONS=-agentlib:hproftargets:... ...
Build Output
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionmetadata:... ...spec:resource:apiVersion: v1data:JAVA_HOME: /opt/java/jdkJAVA_TOOL_OPTIONS: -agentlib:hprofkind: ConfigMapmetadata:name: cmnametargets:... ...
ResourceDistribution from env file
ResourceDistribution 资源可以从键值对生成,这与使用文字非常相似,但从env文件中获取键值对。
- 环境文件中的键/值对用 = 分隔(左侧是键)
- 每行的值将显示为 ResourceDistribution 中由其键作为key的数据项。
示例:使用从env文件生成的 3 个数据项创建一个 ResourceDistribution。
File Input
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:... ...resource:resourceKind: ConfigMapresourceName: cmnameenvs:- tracing.envtargets:... ...
tracing.env
ENABLE_TRACING=trueSAMPLER_TYPE=probabilisticSAMPLER_PARAMETERS=0.1
Build Output
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionmetadata:... ...spec:resource:apiVersion: v1data:ENABLE_TRACING: "true"SAMPLER_TYPE: "probabilistic"SAMPLER_PARAMETERS: "0.1"kind: ConfigMapmetadata:name: cmnametargets:... ...
Targets字段说明
targets字段和ResourceDistribution中targets字段的用法基本相同,注意includedNamespaces和excludedNamespaces字段的内容直接是命名空间的名称。
一个配置正确的targets字段如下所示:
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:... ...resource:... ...targets:allNamespaces: trueexcludedNamespaces:- ns-2includedNamespaces:- ns-1namespaceLabelSelector:matchLabels:group: "test"
Options和ResourceOptions字段说明
options和resourceOptions字段分别用来为生成的ResourceDistribution和其中的Resource(即ConfigMap或Secret)设置注解或标签。
一个配置正确的options和resourceOptions字段如下所示:
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:... ...resource:... ...resourceOptions:annotations:dashboard: "1"labels:environment: "dev"targets:... ...options:annotations:type: "slave"labels:version: "stable"
完整用例
- 创建一个demo目录作为工作空间并进入。将下载的ResourceDistributionGenerator插件放在当前目录,并输入以下命令创建一个名为rdGenerator.yaml的配置文件。
cat > rdGenerator.yaml <<EOF#rdGenerator.yamlapiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:name: rdnameannotations:config.kubernetes.io/function: |exec:path: ./resourcedistributiongeneratorresource:resourceKind: ConfigMapresourceName: cmnamefiles:- application.propertiesliterals:- JAVA_HOME=/opt/java/jdkresourceOptions:annotations:dashboard: "1"options:labels:app.kubernetes.io/name: "app1"targets:includedNamespaces:- ns-1namespaceLabelSelector:matchLabels:group: "test"EOF
- 使用以下命令创建application.properties文件作为文件输入。
cat > application.properties <<EOFFOO=BarFIRST=1SECOND=2LAST=3EOF
- 使用以下命令创建kustomization文件。
cat > kustomization.yaml <<EOF#kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationgenerators:- rdGenerator.yamlEOF
- 使用
kustomize build --enable-alpha-plugins --enable-exec .命令构建应用,效果如下
apiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionmetadata:labels:app.kubernetes.io/name: app1name: rdnamespec:resource:apiVersion: v1data:JAVA_HOME: /opt/java/jdkapplication.properties: |FOO=BarFIRST=1SECOND=2LAST=3kind: ConfigMapmetadata:annotations:dashboard: "1"name: cmnametargets:includedNamespaces:list:- name: ns-1namespaceLabelSelector:matchLabels:group: test
在argocd中使用ResourceDistribution generator
在argocd中,kustomize插件的使用方法同上。除此之外,还需为kustomize添加允许第三方插件的构建选项。在kubernetes集群中找到名为argocd-cm的configmap,在data字段添加如下内容kustomize.buildOptions: --enable-alpha-plugins --enable-exec,即可为默认版本的kustomize添加第三方插件的构建选项。更多内容可参考ArgoCD。你可以直接在argocd中使用这个样例。
apiVersion: v1kind: ConfigMapmetadata:name: argocd-cmnamespace: argocdlabels:app.kubernetes.io/name: argocd-cmapp.kubernetes.io/part-of: argocddata:kustomize.buildOptions: --enable-alpha-plugins --enable-exec
使用插件
将resourcedistributiongenerator插件添加到argocd的git存储库中,并在注解config.kubernetes.io/function填入插件位置
#rdGenerator.yamlapiVersion: apps.kruise.io/v1alpha1kind: ResourceDistributionGeneratormetadata:...annotations:config.kubernetes.io/function: |exec:path: ./resourcedistributiongenerator
通过kustomization.yaml的generator字段引用。
#kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationgenerators:- rdGenerator.yaml
上传git仓库后,通过argocd app sync myapp命令,或者点击UI中的SYNC按钮,部署项目即可。
