Crossplane XRD在ArgoCD中显示OutOfSync状态求助
XRD在ArgoCD显示OutOfSync但实际已同步的问题解决
原因
ArgoCD默认的差异检测和健康逻辑不适配Crossplane的XRD资源:
- Crossplane会自动给XRD注入状态字段、默认元数据(比如
status.conditions、spec.claimNames的默认值),这些不在你从仓库同步的原始YAML里,ArgoCD会判定集群状态和期望状态不一致,标记为OutOfSync。 - XRD的
spec.versions[*].schema.openAPIV3Schema会被Crossplane自动补全校验规则,这也会触发ArgoCD的差异检测。
解决配置
针对Crossplane的XRD/Composite Resource(XR),需要给ArgoCD做以下特殊配置:
1. 忽略Crossplane自动生成的字段
在ArgoCD应用的spec.syncPolicy.ignoreDifferences中添加规则,跳过Crossplane注入的字段:
spec: syncPolicy: ignoreDifferences: - group: apiextensions.crossplane.io kind: CompositeResourceDefinition jsonPointers: - /status - /spec/claimNames - /spec/versions/0/schema/openAPIV3Schema/properties/status
如果是XObjectStorage这类XR实例,也要补充对应的忽略规则:
- group: storage.example.com # 替换成你的XR所属的group kind: XObjectStorage jsonPointers: - /status
2. 配置Crossplane专属健康检查
ArgoCD默认不识别Crossplane的Synced状态,需要在ArgoCD的configmap/argocd-cm中添加自定义健康检查逻辑:
data: resource.customizations: | apiextensions.crossplane.io/CompositeResourceDefinition: health.lua: | hs = {} if obj.status ~= nil then for _, condition in ipairs(obj.status.conditions) do if condition.type == "Established" and condition.status == "True" then hs.status = "Healthy" hs.message = "XRD已创建完成" return hs end end end hs.status = "Progressing" hs.message = "XRD正在创建中" return hs storage.example.com/XObjectStorage: # 替换成你的XR的group/kind health.lua: | hs = {} if obj.status ~= nil then for _, condition in ipairs(obj.status.conditions) do if condition.type == "Synced" and condition.status == "True" then hs.status = "Healthy" hs.message = "XR已同步完成" return hs end end end hs.status = "Progressing" hs.message = "XR正在同步中" return hs
3. 启用ArgoCD Crossplane插件(可选,适用于ArgoCD 2.5+)
官方插件会自动处理Crossplane资源的同步和健康检查:
- 安装插件:
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-extensions/main/crossplane/crossplane-plugin.yaml
- 在ArgoCD应用中指定使用该插件:
spec: syncPolicy: syncOptions: - SyncStrategy=Apply plugin: name: crossplane
验证
配置完成后,执行以下操作确认修复:
- 触发同步:
argocd app sync <你的应用名称> - 查看状态:
argocd app get <你的应用名称>,确认OutOfSync状态消失,健康状态显示为Healthy
内容的提问来源于stack exchange,提问作者Amitb
相关产品推荐
相关产品推荐

