View a markdown version of this page

對 Argo CD 功能的問題進行故障診斷 - Amazon EKS

協助改進此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

對 Argo CD 功能的問題進行故障診斷

注意

EKS 功能是完全受管的,並在叢集外部執行。您無法直接存取控制器命名空間。您可以設定控制器日誌交付,以掌握控制器行為。請參閱 存取 EKS 功能控制器日誌。故障診斷著重於功能運作狀態、應用程式狀態和組態。

功能為 ACTIVE,但應用程式未同步

如果您的 Argo CD 功能顯示ACTIVE狀態,但應用程式未同步,請檢查功能運作狀態和應用程式狀態。

檢查功能運作狀態

您可以在 EKS 主控台或使用 AWS CLI 檢視功能運作狀態和狀態問題。

主控台

  1. 在以下網址開啟 Amazon EKS 主控台:https://console.aws.amazon.com/eks/home#/clusters。

  2. 選取您的叢集名稱。

  3. 選擇可觀測性索引標籤。

  4. 選擇監控叢集

  5. 選擇功能索引標籤以檢視所有功能的運作狀態和狀態。

AWS CLI

# View capability status and health aws eks describe-capability \ --region region-code \ --cluster-name my-cluster \ --capability-name my-argocd # Look for issues in the health section

常見原因

  • 未設定儲存庫:Git 儲存庫未新增至 Argo CD

  • 驗證失敗:SSH 金鑰、字符或 CodeCommit 登入資料無效

  • 未建立應用程式:叢集中不存在應用程式資源

  • 同步政策:需要手動同步 (未啟用自動同步)

  • IAM 許可:缺少 CodeCommit 或 Secrets Manager 的許可

檢查應用程式狀態

# List applications kubectl get application -n argocd # View sync status kubectl get application my-app -n argocd -o jsonpath='{.status.sync.status}' # View application health kubectl get application my-app -n argocd -o jsonpath='{.status.health}'

檢查應用程式條件

# Describe application to see detailed status kubectl describe application my-app -n argocd # View application health kubectl get application my-app -n argocd -o jsonpath='{.status.health}'

應用程式停滯在「進行中」狀態

如果應用程式顯示 Progressing但從未達到 Healthy,請檢查應用程式的資源狀態和事件。

檢查資源運作狀態

# View application resources kubectl get application my-app -n argocd -o jsonpath='{.status.resources}' # Check for unhealthy resources kubectl describe application my-app -n argocd | grep -A 10 "Health Status"

常見原因

  • 部署未就緒:Pod 無法啟動或整備探查失敗

  • 資源相依性:等待其他資源準備就緒的資源

  • 映像提取錯誤:無法存取容器映像

  • 資源不足:叢集缺乏 Pod 的 CPU 或記憶體

驗證目標叢集組態 (適用於多叢集設定):

# List registered clusters kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster # View cluster secret details kubectl get secret cluster-secret-name -n argocd -o yaml

儲存庫身分驗證失敗

如果 Argo CD 無法存取您的 Git 儲存庫,請驗證身分驗證組態。

對於 CodeCommit 儲存庫

驗證 IAM 功能角色具有 CodeCommit 許可:

# View IAM policies aws iam list-attached-role-policies --role-name my-argocd-capability-role aws iam list-role-policies --role-name my-argocd-capability-role # Get specific policy details aws iam get-role-policy --role-name my-argocd-capability-role --policy-name policy-name

角色需要儲存庫的codecommit:GitPull許可。

對於私有 Git 儲存庫

確認儲存庫登入資料已正確設定:

# Check repository secret exists kubectl get secret -n argocd repo-secret-name -o yaml

確保秘密包含正確的身分驗證憑證 (SSH 金鑰、字符或使用者名稱/密碼)。

對於使用 Secrets Manager 的儲存庫

# Verify IAM Capability Role has Secrets Manager permissions aws iam list-attached-role-policies --role-name my-argocd-capability-role # Test secret retrieval aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:region-code:111122223333:secret:my-secret

多叢集部署問題

如果應用程式未部署到遠端叢集,請驗證叢集註冊和存取組態。

檢查叢集註冊

# List registered clusters kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster # Verify cluster secret format kubectl get secret CLUSTER_SECRET_NAME -n argocd -o yaml

確保 server 欄位包含 EKS 叢集 ARN,而不是 Kubernetes API URL。

驗證目標叢集存取項目

在目標叢集上,檢查 Argo CD 功能角色是否具有存取項目:

# List access entries (run on target cluster or use AWS CLI) aws eks list-access-entries --cluster-name target-cluster # Describe specific access entry aws eks describe-access-entry \ --cluster-name target-cluster \ --principal-arn arn:aws:iam::111122223333:role/my-argocd-capability-role

檢查跨帳戶的 IAM 許可

對於跨帳戶部署,請確認 Argo CD 功能角色在目標叢集上有存取項目。受管功能使用 EKS 存取項目進行跨帳戶存取,而非 IAM 角色假設。

如需多叢集組態的詳細資訊,請參閱註冊目標叢集

增加應用程式同步時間

如果您的應用程式正在同步,但花費的時間超過預期,請使用下列診斷步驟來識別原因。

檢查上次同步時間

透過檢閱應用程式上次同步的時間來確認延遲:

# View last sync time for all applications kubectl get application -n argocd -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.operationState.finishedAt}{"\n"}{end}' # View last sync time for a specific application kubectl get application my-app -n argocd -o jsonpath='{.status.operationState.finishedAt}'

檢查應用程式條件

檢閱應用程式條件是否有調校佇列延遲:

# Check conditions on an application kubectl get application my-app -n argocd -o jsonpath='{.status.conditions}'

檢查 targetRevision 組態

使用 的應用程式會在每次遞交至儲存庫時使資訊清單快取targetRevision: HEAD失效,這會減慢同步時間:

# List applications using HEAD as targetRevision kubectl get application -n argocd -o jsonpath='{range .items[?(@.spec.source.targetRevision=="HEAD")]}{.metadata.name}{"\n"}{end}'

常見原因

  • 無 Webhook 組態:如果沒有 Webhook,Argo CD 會以預設間隔 6 分鐘輪詢儲存庫。這會延遲新遞交的偵測。

  • targetRevision 設定為 HEAD:對儲存庫的每筆遞交都會使資訊清單快取失效。Argo CD 接著會在每次對帳時重新產生資訊清單。

  • 大型或複雜的 Git 儲存庫:由於要處理的檔案和範本數量, Monorepos 或複雜的 Helm Chart 會導致資訊清單產生緩慢。

  • 單一應用程式中大量的 Kubernetes 資源:管理許多資源的應用程式會導致叢集快取同步緩慢,因為 Argo CD 必須追蹤每個資源的狀態。

緩解措施

  • 設定 Git Webhook:Webhooks 會在推送變更時立即通知 Argo CD,繞過預設輪詢間隔。如需組態步驟,請參閱 Argo CD 考量事項

  • 使用特定分支名稱或遞交 SHAstargetRevision設定為分支名稱或遞交 SHA,而不是HEAD在同步之間保留資訊清單快取。

  • 分割大型單一儲存庫:將大型儲存庫分割成較小的聚焦儲存庫,以減少資訊清單產生時間。

  • 減少每個應用程式的資源:將具有許多 Kubernetes 資源的應用程式分割成多個較小的應用程式,以減少叢集快取同步時間。

  • 啟用控制器日誌交付:控制器日誌提供對調校行為和佇列處理的可見性。如需組態步驟,請參閱 存取 EKS 功能控制器日誌

應用程式重複同步或無法同步

如果您的應用程式同步,然後立即變成 OutOfSync,或者它卡在同步迴圈中,原因通常會在 Git 定義和叢集中存在的內容之間偏離。從基準診斷開始。

收集診斷資訊

# View current sync and health status argocd app get my-app # Show exact fields that differ between Git and live state argocd app diff my-app # Check whether the app has ever reached a stable state argocd app history my-app

argocd app diff 命令是最有用的起點。它確切顯示應用程式出現不同步的欄位。

自我管理憑證造成偏離

cert-manager、OPA Gatekeeper 和 KEDA 等控制器會在執行時間產生憑證。這些執行時間值不在 Git 中,因此 Argo CD 會在每次對帳時偵測偏離。

這些症狀包括:

  • 應用程式同步,然後立即顯示 OutOfSync

  • 差異顯示 Webhook caBundle 欄位或 TLS Secret data 欄位的變更

若要解決此問題,請ignoreDifferences為受影響的欄位新增 ,並在同步選項RespectIgnoreDifferences中啟用 :

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: ignoreDifferences: - group: admissionregistration.k8s.io kind: ValidatingWebhookConfiguration jsonPointers: - /webhooks/0/clientConfig/caBundle - group: "" kind: Secret jsonPointers: - /data/tls.crt - /data/tls.key syncPolicy: syncOptions: - RespectIgnoreDifferences=true

自我修復會中斷啟動緩慢的工作負載

啟用 selfHeal 時,Argo CD 會在偵測到偏離時重新同步應用程式。如果您的工作負載需要 30-60 秒才能啟動,則自我修復會在工作負載變成 之前觸發Healthyprune 啟用 後,這可能會縮減部分啟動的資源。

若要解決此問題,請先修正基礎偏離 (請參閱憑證案例)。如果偏離不是原因,請考慮針對您僅透過 Git 管理的工作負載停用自我修復:

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: syncPolicy: automated: selfHeal: false prune: false
注意

自我修復退避計時是一種執行個體層級控制器設定。如果您需要調整自我修復計時,而不是停用它,請開啟 AWS 支援案例。

ApplicationSet 或資源擁有權衝突

如果兩個應用程式或 ApplicationSets 管理相同的 Kubernetes 資源,Argo CD 會顯示 SharedResourceWarning。資源永遠不會達到穩定狀態。當共用資源名稱未依環境或叢集設定範圍時,通常會發生這種情況。

若要解決此問題:

  • 讓每個擁有者的預期資源是唯一的。將環境或叢集尾碼新增至資源名稱。

  • 重新命名 ApplicationSet 時,preserveResourcesOnDeletion: true請先設定 以避免現有資源的破壞性縮減:

apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: my-appset spec: syncPolicy: preserveResourcesOnDeletion: true

從資源定稿器卡住刪除

如果應用程式停滯在 Terminating 狀態,或顯示「N 個物件保留待刪除」,則resources-finalizer.argocd.argoproj.io定稿器會封鎖移除,直到所有受管資源刪除為止。具有自己無法處理的定稿器的受管資源會無限期地封鎖刪除。

若要確認,請列出具有刪除時間戳記但尚未移除的資源:

kubectl get all -n my-namespace -o json | \ jq '.items[] | select(.metadata.deletionTimestamp != null) | {name: .metadata.name, kind: .kind, finalizers: .metadata.finalizers}'

若要解決此問題:

  • 確定擁有封鎖定稿器的控制器運作狀態良好且正在執行中。

  • 如果擁有控制器運作狀態良好,但尚未處理定案者,請從停滯的資源中移除封鎖定案者:

kubectl patch resource-kind resource-name -n my-namespace \ --type json -p '[{"op": "remove", "path": "/metadata/finalizers/0"}]'

失敗的同步不會自動重試相同的修訂

同步至特定修訂失敗後,Argo CD 不會自動重試相同的修訂。這通常是因為資訊清單瑕疵,例如ComparisonError來自重複環境變數索引鍵的 。

檢查應用程式狀態以確認:

argocd app get my-app # Look for: Operation: Sync Phase: Failed Revision: <sha>

若要解決此問題,請修正 Git 儲存庫中的資訊清單瑕疵,並推送新的遞交。或者,觸發手動同步:

argocd app sync my-app

Monorepo 遞交流失觸發條件廣泛的再生

如果許多應用程式在相同的儲存庫HEAD上追蹤,則所有應用程式對該儲存庫的任何遞交HEAD都會變更。這會為每個應用程式觸發資訊清單重新產生,即使檔案未變更也一樣。如需 targetRevision和 快取的詳細資訊,請參閱此頁面上的「增加應用程式同步時間」一節。

若要僅將重新產生範圍限定為每個應用程式使用的檔案,請新增manifest-generate-paths註釋:

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app annotations: argocd.argoproj.io/manifest-generate-paths: /apps/my-app spec: source: repoURL: https://github.com/my-org/my-monorepo.git targetRevision: HEAD path: apps/my-app

使用此註釋,Argo CD 只會在指定路徑下的檔案變更時重新產生資訊清單。對於跨應用程式使用的共用程式庫,您可以指定多個以分號 () 分隔的路徑;

盡可能將 釘選targetRevision到分支名稱或標籤,而不是 HEAD

Kubernetes 預設和變動 Webhook 會導致假體差異

如果您的應用程式在同步OutOfSync後立即顯示,請檢查從未設定的欄位差異 (例如 terminationGracePeriodSecondsdnsPolicy/spec/replicas)。Kubernetes API 伺服器或變動 Webhook 會在套用時新增這些欄位。

若要解決由其他控制器管理的欄位 (例如 HPA 管理擴展/spec/replicas時),請新增 ignoreDifferences

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app spec: ignoreDifferences: - group: apps kind: Deployment jsonPointers: - /spec/replicas syncPolicy: syncOptions: - RespectIgnoreDifferences=true

對於 Kubernetes 預設或變動 Webhook 新增的欄位,您可以在應用程式上啟用伺服器端差異:

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app annotations: argocd.argoproj.io/compare-options: ServerSideDiff=true,IncludeMutationWebhook=true

伺服器端 diff 會針對每個資源執行試轉套用,這會增加 Kubernetes API 伺服器的負載。在廣泛啟用之前,先在少量應用程式上進行測試。

高流失控制器擁有的資源

有些控制器會產生大量短期或經常更新的資源。範例包括 Karpenter 節點物件、Cilium 身分和端點物件,以及 Kyverno 政策報告。如果這些資源產生大量監看事件並導致同步流失,您可以透過排除這些資源類型或篩選監看事件來減少負載。這些變更需要執行個體層級控制器組態。

在 受管功能上,開啟 AWS 支援案例,請求這些資源類型的資源排除或監看事件篩選。

最佳實務

  • 先使用應用程式差異:執行 argocd app diff做為任何重複同步問題的第一個診斷步驟。它會顯示偏離的確切原因。

  • 偏好窄型 ignoreDifferences:以特定資源類型的特定欄位為目標。避免可遮罩實際組態偏離的廣泛忽略規則。

  • 配對 ignoreDifferences with RespectIgnoreDifferences:一律新增RespectIgnoreDifferences=true同步選項。如果沒有它,同步仍會覆寫忽略的欄位。

  • 保持資源名稱是唯一的:範圍每個環境和叢集的資源名稱,以避免應用程式或 ApplicationSets 之間的所有權衝突。

  • 請謹慎使用 prune 和 selfHeal:請勿在需要很長時間才能啟動的工作負載上啟用兩者。自我修復可以在資源正常運作之前將其銷毀。

  • Pin targetRevision 和範圍資訊清單路徑:對於大型共用儲存庫中的應用程式,請使用分支或標籤,而不是 HEAD並新增manifest-generate-paths註釋。

聯絡 AWS Support 的時機

在下列情況下開啟 AWS 支援案例:

  • 執行個體層級控制器調校似乎是必要的 (處理器計數、自我修復時間或資源排除)。

  • 儲存庫伺服器或控制器容量似乎不足以滿足您的應用程式計數。

  • 工作負載組態、偏離、擁有權或定案者不會解釋行為。

在支援案例中包含受影響應用程式的 argocd app getargocd app diff 輸出。

後續步驟