Git推送时ArgoCD因自动生成证书/密码频繁不同步的问题求助
问题核心:Bitnami的Kafka、MongoDB等Helm Chart会自动生成密码、TLS证书这类动态资源,但这类资源不会被提交到Git仓库。ArgoCD同步时会对比Git期望状态与集群实际状态,判定这些资源为out-of-sync,同步后会重新生成密码/证书,导致依赖服务连接失败。
以下是几种可行的解决方案:
方案1:提前创建Secret,让Chart复用现有敏感资源
Bitnami官方Chart提供了existingSecret、existingCertificates等参数,可以指定预先创建的Secret来存储密码、证书,避免Chart自动生成新资源。
MongoDB配置示例:
auth: enabled: true # 指定已存在的Secret,需提前在集群中创建,包含所需密码字段 existingSecret: "mongodb-auth-secret"
Kafka配置示例:
auth: interBrokerProtocol: tls controllerProtocol: tls clientProtocol: tls sasl: interBrokerMechanism: scram-sha-512 tls: type: pem autoGenerated: false # 指定已存在的TLS证书Secret existingCertificates: - secretName: kafka-tls-secret certificate: tls.crt key: tls.key caCertificate: ca.crt # SASL密码同样可以指定existingSecret sasl: existingSecret: "kafka-sasl-secret"
这种方式完全掌控敏感资源的生命周期,ArgoCD不会因为动态生成的内容触发不必要的同步。
方案2:配置ArgoCD忽略敏感资源的差异
在ArgoCD的Application配置中添加ignoreDifferences规则,让ArgoCD忽略自动生成的Secret/ConfigMap中的动态内容差异,不再标记为out-of-sync,同步时也不会覆盖这些内容。
Application配置示例:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: kafka-app spec: destination: server: "https://kubernetes.default.svc" namespace: kafka project: default source: repoURL: "https://charts.bitnami.com/bitnami" chart: kafka targetRevision: 26.x.x helm: values: auth: interBrokerProtocol: tls controllerProtocol: tls clientProtocol: tls sasl: interBrokerMechanism: scram-sha-512 tls: type: pem autoGenerated: true syncPolicy: automated: prune: true selfHeal: true # 添加忽略差异规则 ignoreDifferences: # 忽略Kafka TLS证书Secret的内容差异 - group: "" kind: Secret name: kafka-tls jsonPointers: - /data/tls.crt - /data/tls.key - /data/ca.crt # 忽略Kafka SASL密码Secret的内容差异 - group: "" kind: Secret name: kafka-secrets jsonPointers: - /data/client-password - /data/inter-broker-password
注意:需根据实际集群中Secret的名称调整name字段,可通过kubectl get secrets -n <namespace>查看。
方案3:启用ArgoCD的ReuseValues同步选项
在Application的同步策略中添加ReuseValues=true,让Helm在升级时重用之前发布的Values(包括Chart自动生成的密码/证书参数),避免重新生成。
配置示例:
spec: syncPolicy: automated: prune: true selfHeal: true syncOptions: - ReuseValues=true
这种方式操作简单,但需注意:如果后续需要修改Chart的核心配置,可能需要手动清理旧Values或重新生成敏感资源,存在一定兼容性风险。
方案4:将敏感资源同步到Git(不推荐)
通过自定义脚本或工具,将集群中自动生成的Secret内容同步回Git仓库,并配合Git加密(如Git-Crypt)存储敏感信息。这种方式能让Git期望状态与集群实际状态一致,但会将敏感信息存入版本控制系统,风险较高,仅在特殊场景下考虑使用。
内容的提问来源于stack exchange,提问作者Linux Dev

