我刚开始使用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控制器日志抛出一些无意义的错误。我确信我正确地识别了这个问题,因为如果我只是对字符串进行硬核处理,它就能像预期的那样工作。
我试图提取该值的方式究竟有什么问题?
3条答案
按热度按时间oalqel3c1#
在Argo CD
ApplicationSet
controller中,使用{{ index .Clusters.values "nameOverride" }}
访问nameOverride
值。但是,Clusters
是clusters.yaml
文件中的数组,而不是字典。所以,你不应该试图直接索引它,就好像它是一个字典。(在YAML中,数组(或列表)由以破折号(-
)开头的项表示。.Clusters
字段将包含clusters.yaml
文件中的集群的 * 数组 *,您希望访问每个集群的values.nameOverride
字段。但是,您当前的语法将Clusters
视为可以直接使用.values
进行索引的字典。相反,您应该迭代
Clusters
数组,以单独访问每个values
字典。您可能需要使用循环结构来完成此操作,或者修改配置,使values
不在数组中嵌套。您也可以为
clusters.yaml
文件使用不同的结构。如果你只有一个集群,你可以像这样构建你的
clusters.yaml
文件:{{ index .Clusters.values "nameOverride" }}
直接访问nameOverride
。如果您有多个集群,并且每个集群都需要一个唯一的
nameOverride
,您可以在存储库中为每个集群创建一个单独的文件,并调整ApplicationSet
中的files
字段以匹配新的文件结构。这就是Git文件生成器如何能够读取这些文件中的每一个,并访问它们各自文件中每个集群的
values.nameOverride
字段。ccrfmcuu2#
您遇到的问题与从ArgoCD ApplicationSet的
value
字段中的clusters.yaml
访问nameOverride
值的方式有关。在当前配置中,您使用以下表达式访问该值:
但是,问题在于
values
字段是在clusters.yaml
文件的顶层定义的,而不是嵌套在每个簇下。因此,访问该值的正确路径为:通过如上所示修改表达式,您应该能够从
clusters.yaml
正确访问nameOverride
值并成功部署应用程序。b4lqfgs43#
我认为您遇到的问题可能是由于索引函数的使用不正确。
在您的模板中,您尝试使用index函数从clusters.yaml文件中访问nameOverride的值。但是,你引用它的方式是不正确的。
您应该使用.Values.clusters.values,而不是使用.Clusters. values。.Values引用Helm图表或values文件中定义的值。
要修复此问题,请按如下所示修改模板中的值字段:
此更改可确保您访问值结构中的正确路径。
确保缩进在实际的YAML文件中是正确的,以保持YAML语法。
进行此更改后,value字段应该能够正确访问clusters.yaml文件中的nameOverride值,并在部署期间替换它。