ArgoCD에서 OutOfSync나 Degraded가 보인다고 바로 sync 버튼을 누르거나 Pod를 지우면 안 됨.
먼저 상태 의미를 나눠서 봐야 함.
GitOps 기준.
Git 저장소
= 원하는 상태
Kubernetes 클러스터
= 실제 상태
ArgoCD
= 원하는 상태와 실제 상태를 비교하는 도구
기본 상태 의미.
Synced
= Git에 적힌 상태와 클러스터 실제 상태가 같음
OutOfSync
= Git과 클러스터 상태가 다름
= 무조건 장애는 아님
Healthy
= ArgoCD가 보기에는 리소스가 정상
Degraded
= 리소스가 정상 상태로 돌아가지 못함
Progressing
= 적용 중
= 배포 직후 잠깐은 정상일 수 있지만 오래 지속되면 확인 필요
먼저 전체 Application 상태 확인.
# ArgoCD Application의 sync와 health 상태를 확인한다.
kubectl -n argocd get app
또는 전체 리소스 이름으로 확인.
# ArgoCD Application의 sync와 health 상태를 확인한다.
kubectl -n argocd get applications.argoproj.io
문제가 있는 Application 상세 확인.
# 문제가 있는 ArgoCD Application 상세 상태를 확인한다.
kubectl -n argocd describe application <application-name>
여기서 확인할 것.
Sync Status
Health Status
자동 sync 여부
문제가 나는 리소스
최근 sync 시각
메시지
Git revision
Events
ArgoCD 자체 문제인지도 확인.
# argocd namespace의 Pod와 Service 상태를 확인한다.
kubectl -n argocd get pods,svc -o wide
argocd-repo-server가 이상하면 Git 저장소를 못 읽을 수 있음.
argocd-application-controller가 이상하면 Application 상태 계산이나 sync가 제대로 안 될 수 있음.
Git repo 상태 확인.
# cluster-apps repo의 현재 branch와 변경 상태를 확인한다.
cd /home/ioniere/gitlab-project-clones/ioniere/cluster-apps
git status --short --branch
최근 커밋 확인.
# cluster-apps repo의 최근 커밋 목록을 확인한다.
cd /home/ioniere/gitlab-project-clones/ioniere/cluster-apps
git log --oneline --decorate -n 10
의심 커밋 확인.
# 대상 커밋이 어떤 파일을 바꿨는지 확인한다.
git show --stat <commit-hash>
# 대상 커밋에서 특정 파일이 어떻게 바뀌었는지 확인한다.
git show <commit-hash> -- <file-path>
OutOfSync는 Git과 클러스터가 다르다는 뜻.
다음처럼 나눠서 봄.
Git 변경 직후 OutOfSync
= 아직 반영 전일 수 있음
직접 kubectl로 수정한 뒤 OutOfSync
= Git과 클러스터가 drift된 상태일 수 있음
자동 sync 실패 후 OutOfSync
= ArgoCD가 반영하려다 실패했을 수 있음
오래 지속되는 OutOfSync
= 의도한 상태와 실제 상태가 계속 다르므로 확인 필요
Degraded는 리소스가 정상 상태로 돌아가지 못한다는 뜻.
이때는 어떤 리소스가 문제인지 먼저 봐야 함.
Deployment / Pod 문제
= Pod 상태와 로그 확인
Ingress / Service 문제
= Ingress, Service, EndpointSlice 확인
PVC / StatefulSet 문제
= 저장소와 PVC 확인
NFS mount 문제
= NFS 경로와 mount 확인
최근 Git 변경 문제
= 변경 커밋 확인
자동 sync와 selfHeal도 구분해야 함.
automated sync
= Git 변경을 자동으로 클러스터에 반영
selfHeal
= 클러스터에서 직접 바뀐 리소스를 Git 기준으로 자동 원복
자동 sync가 켜져 있어도 selfHeal이 꺼져 있으면, 직접 kubectl edit, patch, scale로 만든 drift가 자동으로 원복되지 않을 수 있음.
반대로 selfHeal이 켜져 있으면 직접 수정한 내용이 오래 유지되지 않을 수 있음.
직접 수정했다면 나중에 정리해야 함.
서비스 복구에 필요한 변경
= 같은 내용을 Git에 반영
임시 확인이나 실수로 생긴 변경
= Git 기준으로 원복
정리 후에도 OutOfSync
= 어떤 리소스가 다른지 다시 확인
바로 하지 않을 것.
전체 Application 무작정 sync
전체 Application 무작정 delete
원인 확인 없는 force sync
argocd namespace 삭제
ArgoCD controller Pod 임의 삭제
Secret 값 출력
Git revert 대상 확인 없이 revert
운영 중인 리소스를 Git에 남기지 않고 직접 수정
정리.
OutOfSync는 장애 확정이 아니라 Git과 실제 상태가 다르다는 신호.
Degraded는 리소스가 정상화되지 못하는 상태.
ArgoCD 상태를 볼 때는 sync 상태, health 상태, Git revision, 최근 커밋, 직접 수정 여부를 같이 봐야 함.