kubernetes 如何从Git中的文件中拉取参数值

mi7gmzs6  于 2023-06-21  发布在  Kubernetes
关注(0)|答案(3)|浏览(98)

我刚开始使用ArgoCD,我有一个问题,我找不到答案。
在我的Git repo中有一个名为clusters.yaml的文件:

clusters:
- name: cluster1-eu-k8s-002
  url: https://cluster1.hcp.northeurope.azmk8s.io:443
  values: 
    nameOverride: ReplaceWithThis

我正在使用以下ApplicationSet,以便在标签group:dev下分组的一组集群上部署Opentelemetry-collector。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: opentelemetry-applicationset
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: git@github.com:removed/cloud.git
      revision: HEAD
      files:
      - path: GitOps/argocd-apps/clusters.yaml
  - clusters:
      selector:
        matchLabels:
          argocd.argoproj.io/secret-type: cluster
          group: dev
  template:
    metadata:
      name: 'opentelemetry-{{name}}'
    spec:
      project: default
      sources:
      - repoURL: https://open-telemetry.github.io/opentelemetry-helm-charts
        chart: opentelemetry-collector
        targetRevision: 0.51.3
        helm:
          valueFiles: 
            - $values/GitOps/argocd-apps/opentelemetry-collector/values/values-dev.yaml
          parameters:
            - name: nameOverride
              value: '{{ index .Clusters.values "nameOverride" }}'
      - repoURL: git@github.com:removed/cloud.git
        ref: values
      destination:
        server: '{{ server }}'
        namespace: opentelemetry

我尝试将一个名为nameOverride的参数替换为来自clusters.yaml的值ReplaceWithThis
ArgoCD没有部署我的应用程序,因为这行:value: '{{ index .Clusters.values "nameOverride" }}'
ArgoCD ApplicationSet控制器日志抛出一些无意义的错误。我确信我正确地识别了这个问题,因为如果我只是对字符串进行硬核处理,它就能像预期的那样工作。
我试图提取该值的方式究竟有什么问题?

oalqel3c

oalqel3c1#

Argo CD ApplicationSet controller中,使用{{ index .Clusters.values "nameOverride" }}访问nameOverride值。但是,Clustersclusters.yaml文件中的数组,而不是字典。所以,你不应该试图直接索引它,就好像它是一个字典。(在YAML中,数组(或列表)由以破折号(-)开头的项表示。
.Clusters字段将包含clusters.yaml文件中的集群的 * 数组 *,您希望访问每个集群的values.nameOverride字段。但是,您当前的语法将Clusters视为可以直接使用.values进行索引的字典。
相反,您应该迭代Clusters数组,以单独访问每个values字典。您可能需要使用循环结构来完成此操作,或者修改配置,使values不在数组中嵌套。
您也可以为clusters.yaml文件使用不同的结构。
如果你只有一个集群,你可以像这样构建你的clusters.yaml文件:

clusters:
  name: cluster1-eu-k8s-002
  url: https://cluster1.hcp.northeurope.azmk8s.io:443
  values: 
    nameOverride: ReplaceWithThis
  • 然后 *,在这种情况下,您可以通过{{ index .Clusters.values "nameOverride" }}直接访问nameOverride

如果您有多个集群,并且每个集群都需要一个唯一的nameOverride,您可以在存储库中为每个集群创建一个单独的文件,并调整ApplicationSet中的files字段以匹配新的文件结构。
这就是Git文件生成器如何能够读取这些文件中的每一个,并访问它们各自文件中每个集群的values.nameOverride字段。

ccrfmcuu

ccrfmcuu2#

您遇到的问题与从ArgoCD ApplicationSet的value字段中的clusters.yaml访问nameOverride值的方式有关。
在当前配置中,您使用以下表达式访问该值:

value: '{{ index .Clusters.values "nameOverride" }}'

但是,问题在于values字段是在clusters.yaml文件的顶层定义的,而不是嵌套在每个簇下。因此,访问该值的正确路径为:

value: '{{ index .ApplicationSetParameters.values "nameOverride" }}'

通过如上所示修改表达式,您应该能够从clusters.yaml正确访问nameOverride值并成功部署应用程序。

b4lqfgs4

b4lqfgs43#

我认为您遇到的问题可能是由于索引函数的使用不正确。
在您的模板中,您尝试使用index函数从clusters.yaml文件中访问nameOverride的值。但是,你引用它的方式是不正确的。
您应该使用.Values.clusters.values,而不是使用.Clusters. values。.Values引用Helm图表或values文件中定义的值。
要修复此问题,请按如下所示修改模板中的值字段:

value: '{{ index .Values.clusters.values "nameOverride" }}'

此更改可确保您访问值结构中的正确路径。
确保缩进在实际的YAML文件中是正确的,以保持YAML语法。
进行此更改后,value字段应该能够正确访问clusters.yaml文件中的nameOverride值,并在部署期间替换它。

相关问题