核心问题是:Cilium 自动创建的 CiliumIdentity 资源被 ArgoCD 持续标记为Out-Of-Sync(不同步) ------这是 ArgoCD 与 Cilium 集成的典型问题,根源是 CiliumIdentity 属于 Cilium 动态生成的"运行时资源",但 ArgoCD 会把它纳入资源跟踪范围,导致频繁触发不同步告警。
下面我会拆解问题原因、给出彻底解决的配置方案,以及生产环境的优化建议,确保 ArgoCD 不再监控这类动态资源。
一、问题根源分析
1. CiliumIdentity 的特性
CiliumIdentity 是 Cilium 为集群内 Pod/节点自动分配的"网络身份标识",核心特点:
- 动态生成:Cilium 会根据 Pod 启停、标签变更自动创建/删除/更新该资源;
- 非声明式:该资源不由 YAML 清单管理,完全由 Cilium 运维,属于"运行时状态";
- 高频变更 :集群内 Pod 变动时,
CiliumIdentity会实时更新,无法与 Git 中的配置保持一致。
2. ArgoCD 标记 Out-Of-Sync 的原因
ArgoCD 会监控其管理的 Application 下所有资源 (包括 Cilium 动态生成的 CiliumIdentity),并对比 Git 仓库中的配置:
- Git 中没有
CiliumIdentity的清单(也不应该有); - 集群中存在该资源,且频繁变更;
- ArgoCD 判定"集群状态 ≠ Git 状态",因此持续标记为 Out-Of-Sync。
二、彻底解决:配置 ArgoCD 排除 CiliumIdentity
核心思路是让 ArgoCD 完全忽略 CiliumIdentity 资源,不再跟踪其状态,从根源消除 Out-Of-Sync 告警。
方案1:全局排除(推荐,所有 Application 生效)
修改 ArgoCD 的 argocd-cm ConfigMap(即你之前配置中的 cm.resource.exclusions),补充完整的排除规则(确保覆盖所有场景):
yaml
cm:
resource.exclusions: |
- apiGroups:
- cilium.io
kinds:
- CiliumIdentity
# 可选:同时排除其他 Cilium 动态资源(避免后续同类问题)
- CiliumEndpoint
- CiliumNetworkPolicyNodeStatus
- CiliumClusterwideNetworkPolicy
clusters:
- "*" # 所有集群生效
# 保留你原有其他配置(如 url 等)
url: https://argocd.dev5.dhn122.k8s.fnbbn-dev.dyn.nesc.nokia.net
生效步骤:
-
将上述配置更新到 Git 仓库中 ArgoCD 自管理的
values.yaml; -
触发 ArgoCD 同步自身配置:
bashargocd app sync argocd -
验证排除规则是否生效:
bash# 查看 argocd-cm 中的排除规则 kubectl get cm argocd-cm -n argocd -o yaml | grep -A 10 "resource.exclusions"
方案2:单个 Application 排除(仅特定应用生效)
若不想全局排除,可在包含 Cilium 资源的 Application 中单独配置排除规则:
yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: cilium
namespace: argocd
spec:
# 其他配置(source/destination 等)不变
syncOptions:
# 排除 CiliumIdentity 资源
- "ResourceExclusions=cilium.io/CiliumIdentity"
# 可选:排除多个 Cilium 动态资源
- "ResourceExclusions=cilium.io/CiliumEndpoint"
关键注意事项
-
排除规则的格式 :
apiGroups必须写cilium.io(不能错);kinds必须写资源的单数形式 (CiliumIdentity,而非CiliumIdentities);clusters: "*"确保所有集群都生效(多集群场景必加)。
-
生效延迟 :配置生效后,ArgoCD 会在下次同步(默认 3 分钟)后停止跟踪该资源,若需立即生效,可手动触发 Application 同步:
bashargocd app sync <your-application-name>
三、额外优化:避免其他 Cilium 资源触发 Out-Of-Sync
除了 CiliumIdentity,Cilium 还有以下动态资源可能导致同类问题,建议一并排除:
| 资源名 | 作用 | 是否建议排除 |
|---|---|---|
CiliumEndpoint |
记录 Pod 的网络端点信息,动态更新 | 是 |
CiliumNetworkPolicyNodeStatus |
网络策略在节点上的执行状态 | 是 |
CiliumClusterwideNetworkPolicy |
集群级网络策略(若为动态生成) | 按需(手动创建的不排除) |
CiliumLocalRedirectPolicy |
本地重定向策略,动态生成 | 是 |
完整的全局排除配置(生产推荐)
yaml
cm:
resource.exclusions: |
- apiGroups:
- cilium.io
kinds:
- CiliumIdentity
- CiliumEndpoint
- CiliumNetworkPolicyNodeStatus
- CiliumLocalRedirectPolicy
clusters:
- "*"
url: https://argocd.dev5.dhn122.k8s.fnbbn-dev.dyn.nesc.nokia.net
四、验证问题是否解决
-
检查 ArgoCD UI:对应 Application 的"OutOfSync"状态消失,资源列表中不再显示
CiliumIdentity; -
检查 ArgoCD 日志(无排除相关错误):
bashkubectl logs -n argocd deployment/argocd-application-controller | grep -i "ciliumidentity"正常情况下,日志中会显示"excluding resource cilium.io/CiliumIdentity",无报错;
-
触发 Cilium 资源变更(如重启一个 Pod),观察 ArgoCD 状态:不再出现 Out-Of-Sync 告警。
五、生产环境最佳实践
1. 区分"声明式资源"与"运行时资源"
- 声明式资源 (需 ArgoCD 管理):
CiliumNetworkPolicy、CiliumClusterwideNetworkPolicy(手动编写的)、Cilium 的 Deployment/ConfigMap 等; - 运行时资源 (需排除):
CiliumIdentity、CiliumEndpoint等动态生成的资源。
2. 避免过度排除
仅排除 Cilium 动态生成的资源,不要排除 CiliumNetworkPolicy(网络策略是声明式的,需要 ArgoCD 管理)。
3. 配置 ArgoCD 同步策略(减少误判)
在包含 Cilium 的 Application 中添加以下同步选项,进一步避免无关资源干扰:
yaml
spec:
syncPolicy:
syncOptions:
# 仅同步 Git 中存在的资源(忽略集群中额外的动态资源)
- ApplyOutOfSyncOnly=true
# 禁用资源完整性检查(不检查未在 Git 中的资源)
- PrunePropagationPolicy=foreground
- PruneLast=true
4. 定期清理 ArgoCD 资源缓存
若排除规则生效后仍有残留的 Out-Of-Sync 状态,可清理 ArgoCD 缓存:
bash
# 重启 ArgoCD 控制器(清除缓存)
kubectl rollout restart deployment argocd-application-controller -n argocd
# 重新同步 Application
argocd app sync <your-application-name> --hard
总结
核心解决方案
- 全局排除
CiliumIdentity:修改argocd-cm的resource.exclusions,是最彻底、推荐的方案; - 可选补充 :排除其他 Cilium 动态资源(如
CiliumEndpoint),避免后续同类问题; - 验证生效:同步 ArgoCD 配置,重启控制器,确认 Out-Of-Sync 状态消失。
关键点回顾
CiliumIdentity是动态运行时资源,无法/无需与 Git 同步,必须排除;- 排除规则需确保
apiGroups、kinds拼写正确,clusters: "*"覆盖所有集群; - 生产环境建议一并排除其他 Cilium 动态资源,减少 ArgoCD 不必要的资源跟踪。
如果排除后仍有问题,可检查:① 排除规则是否生效;② Application 是否继承了全局排除规则;③ Cilium 版本是否有特殊的资源命名规则。