如何在ArgoCD中从远程Values仓库读取XML文件到Helm ConfigMap?
问题描述
已配置ArgoCD应用使用两个远程仓库:Helm仓库(存放Chart模板)和Values仓库(存放配置值),当前可正常从Values仓库传递配置值,且当XML文件与Helm Chart同仓库时,能通过Helm模板生成Kubernetes ConfigMap。现在希望将XML文件移至Values仓库,询问是否可以读取该文件内容并传入ConfigMap的data字段,实现类似传递Values值的远程文件读取能力。
当前ArgoCD应用配置
project: myproject destination: server: 'https://kubernetes.default.svc' namespace: myns syncPolicy: automated: prune: true syncOptions: - CreateNamespace=true sources: - repoURL: >- https://gitlab.com/myrepos/helm-repo.git path: helm targetRevision: HEAD helm: valueFiles: - $values/mocks/values.yaml - repoURL: >- https://gitlab.com/myrepos/values-repo.git targetRevision: HEAD ref: values
Values文件(存放于values-repo)
mocks: projectName: "soapui-project"
Helm ConfigMap模板(存放于helm-repo)
{{ $projectFile := printf "%s.xml" .Values.mocks.projectName }} {{ $projectName := .Values.mocks.projectName }} apiVersion: v1 kind: ConfigMap metadata: name: "{{ $projectName | lower }}" data: {{ ($.Files.Glob $projectFile).AsConfig | indent 1 }}
解决方案
核心限制说明
Helm的$.Files对象仅能访问当前Chart所在仓库的文件,无法直接读取Values仓库中的文件——因为ArgoCD同步时会独立拉取两个仓库,Helm模板渲染阶段只能访问主Chart仓库的文件系统。因此必须通过Values传递的方式间接获取Values仓库中的XML内容。
方法1:将XML内容作为Values多行字符串嵌入
直接在Values仓库的values.yaml中写入XML内容:
mocks: projectName: "soapui-project" projectXmlContent: | <?xml version="1.0" encoding="UTF-8"?> <soapui-project> <!-- 这里填入完整的XML内容 --> </soapui-project>
修改Helm模板,直接引用该值生成ConfigMap:
{{ $projectName := .Values.mocks.projectName }} apiVersion: v1 kind: ConfigMap metadata: name: "{{ $projectName | lower }}" data: {{ $projectName }}.xml: | {{ .Values.mocks.projectXmlContent | indent 4 }}
这种方式简单直接,适合内容不频繁变动的XML文件。
方法2:通过ArgoCD的values字段传递文件内容
修改ArgoCD应用配置,在Helm配置中新增values块,直接读取Values仓库中的XML文件并注入到Values中:
project: myproject destination: server: 'https://kubernetes.default.svc' namespace: myns syncPolicy: automated: prune: true syncOptions: - CreateNamespace=true sources: - repoURL: >- https://gitlab.com/myrepos/helm-repo.git path: helm targetRevision: HEAD helm: valueFiles: - $values/mocks/values.yaml # 新增:读取Values仓库中的XML文件并作为Values传入 values: | mocks: projectXmlContent: '{{ .Files.Get "mocks/soapui-project.xml" }}' - repoURL: >- https://gitlab.com/myrepos/values-repo.git targetRevision: HEAD ref: values
之后修改Helm模板的方式与方法1一致,直接引用.Values.mocks.projectXmlContent即可。若XML包含特殊字符,建议改用多行格式包裹。
内容的提问来源于stack exchange,提问作者titter
相关产品推荐
相关产品推荐

