Argo CD 故障排查

我删除/损坏了我的代码仓库,无法删除我的应用程序,该怎么办?

当 Argo CD 无法生成清单时,将无法删除应用程序。您需要:

  1. 恢复或修复您的代码仓库。
  2. 使用 --cascade=false 删除应用程序,然后手动删除相关资源。

为什么我的应用程序在成功同步后仍然显示OutOfSync

请参见 Diffing 文档 了解资源为何可能处于 OutOfSync 状态的原因,以及配置 Argo CD 忽略某些字段的方式。

为什么我的应用程序卡在Progressing 状态?

Argo CD 为多种标准 Kubernetes 类型提供健康检查。IngressStatefulSetSealedSecret 类型存在已知问题,可能导致健康检查返回 Progressing 状态而非 Healthy

  • Ingress 只有在 status.loadBalancer.ingress 列表非空且至少有一个 hostnameIP 值时才被视为健康。有些 Ingress 控制器(如 contour、traefik)不会更新 status.loadBalancer.ingress 字段,导致 Ingress 永远处于 Progressing 状态。

  • StatefulSet 只有在 status.updatedReplicas 字段值与 spec.replicas 字段值匹配时才被视为健康。由于 Kubernetes bug kubernetes#68573status.updatedReplicas 无法填充。因此,除非您使用的 Kubernetes 版本包含修复 kubernetes#67570,否则 StatefulSet 可能会保持在 Progressing 状态。

  • 您的 StatefulSetDaemonSet 使用了 OnDelete 策略而非 RollingUpdate

  • 关于 SealedSecret,请参见 为什么 SealedSecret 类型的资源卡在 Progressing 状态?

作为临时解决方案,Argo CD 允许通过自定义 健康检查 来覆盖默认行为。

如果您使用 Traefik 作为 Ingress,可以通过更新 Traefik 配置发布 loadBalancer IP:

providers:
  kubernetesIngress:
    publishedService:
      enabled: true

如何禁用管理员用户?

argocd-cm ConfigMap 中添加 admin.enabled: "false"

Argo CD 在没有互联网访问的情况下无法部署基于 Helm Chart 的应用程序,如何解决?

如果 Helm Chart 中的依赖项位于外部仓库,Argo CD 可能无法生成 Helm Chart 清单。为了解决此问题,您需要确保 requirements.yaml 仅使用内部可用的 Helm 仓库。即使 Chart 仅使用内部仓库的依赖项,Helm 仍可能决定刷新 stable 仓库。作为解决方案,在 argocd-cm 配置映射中覆盖 stable 仓库 URL:

data:
  repositories: |
    - type: helm
      url: http://<internal-helm-repo-host>:8080
      name: stable

使用 Argo CD 创建 Helm 应用程序后,为什么我无法通过helm ls 等 Helm 命令查看它?

Argo CD 在部署 Helm 应用程序时,仅将 Helm 用作模板机制。它会运行 helm template,然后将生成的清单部署到集群,而不是执行 helm install。这意味着您无法使用任何 Helm 命令查看/验证该应用程序。它完全由 Argo CD 管理。请注意,Argo CD 原生支持一些您可能在 Helm 中错过的功能(例如历史记录和回滚命令)。

此决定是为了使 Argo CD 对所有清单生成器保持中立。

我已配置集群密钥,但它在 CLI/UI 中不可见,如何修复?

检查集群密钥是否具有 argocd.argoproj.io/secret-type: cluster 标签。如果密钥有标签但集群仍然不可见,可能是权限问题。尝试使用 admin 用户列出集群(例如:argocd login --username admin && argocd cluster list)。

为什么我的应用程序在同步后仍显示Out Of Sync 状态?

在某些情况下,您使用的工具可能会通过添加 app.kubernetes.io/instance 标签与 Argo CD 发生冲突,例如使用 Kustomize 通用标签功能。

Argo CD 会自动设置 app.kubernetes.io/instance 标签,并使用它来确定哪些资源构成该应用程序。如果该工具也这么做,就可能导致混淆。您可以通过在 argocd-cm 中设置 application.instanceLabelKey 值来更改此标签。我们建议使用 argocd.argoproj.io/instance

INFO

进行此更改后,您的应用程序将变为不同步状态,需要重新同步。

Argo CD 多久检查一次 Git 或 Helm 仓库的变更?

默认的轮询间隔为 3 分钟(180 秒),并带有可配置的抖动。您可以通过更新 argocd-cm 配置映射中的 timeout.reconciliation 值和 timeout.reconciliation.jitter 来更改设置。如果有任何 Git 更改,Argo CD 仅会更新启用了 auto-sync 设置的应用程序。如果您将其设置为 0,Argo CD 将停止自动轮询 Git 仓库,您只能使用其他方法(如 webhooks 和/或 手动同步)来创建应用程序。

Argo CD 使用 JWT 作为身份验证令牌。您可能属于许多组,并且超出了为 cookies 设置的 4KB 限制。您可以通过打开"开发者工具 -> 网络"获取组列表:

  1. 点击登录到 Argo CD 控制面板 如何获取 Argo CD 访问信息
  2. 找到对 <argocd_instance>/auth/callback?code=<random_string> 的调用

jwt.io 解码该令牌。这将提供您可以退出的团队列表。

使用 CLI 时,为什么会收到rpc error: code = Unavailable desc = transport is closing 错误?

您可能位于不支持 HTTP 2 的代理后面?尝试使用 --grpc-web 标志:

argocd ... --grpc-web

为什么SealedSecret 类型的资源卡在Progressing 状态?

SealedSecret 资源的控制器可能会在其提供的资源上公开状态条件。从版本 v2.0.0 开始,Argo CD 会根据该状态条件来推导 SealedSecret 的健康状态。

v0.15.0 之前的 SealedSecret 控制器版本受到与状态条件更新相关的问题的影响,因此在这些版本中默认禁用此功能。状态条件更新可以通过使用 --update-status 命令行参数启动 SealedSecret 控制器,或通过设置 SEALED_SECRETS_UPDATE_STATUS 环境变量来启用。

要禁用 Argo CD 检查 SealedSecret 资源的状态条件,请在 argocd-cm ConfigMap 中通过 resource.customizations.health.<group_kind> 键添加以下资源自定义。

resource.customizations.health.bitnami.com_SealedSecret: | hs = hs.status = "Healthy" hs.message = "Controller doesn't report resource status" return hs

如何轮换 Redis 密钥?

  • 删除 Argo CD 安装命名空间中的 argocd-redis 密钥:
kubectl delete secret argocd-redis -n <argocd namespace>
  • 如果您在 HA 模式下运行 Redis,重启 HA:
kubectl rollout restart deployment argocd-redis-ha-haproxy
kubectl rollout restart statefulset argocd-redis-ha-server
  • 如果您在非 HA 模式下运行 Redis,重启 Redis:
kubectl rollout restart deployment argocd-redis
  • 重启其他组件:
kubectl rollout restart deployment argocd-server argocd-repo-server
kubectl rollout restart statefulset argocd-application-controller

如何修复Manifest generation error (cached) 错误?

Manifest generation error (cached) 意味着在生成清单时出现错误,且错误消息已被缓存以避免无限重试。

进行硬刷新(忽略缓存的错误)可以克服临时问题。但如果有持续原因导致清单生成失败,硬刷新将无济于事。

请尝试在 repo-server 日志中搜索应用程序名称,以识别导致清单生成失败的错误。