안녕하세요. 이 글은 ArgoCD시리즈입니다.
git에 의도된 상태를 쿠버네티스 클러스터에 동기화 할 때, 필요한 개념과 자주 사용하는 기능을 설명합니다.
영상: https://youtu.be/XBcoj3-pjDA
1. Refresh Period
1.1 개념
argocd는 default 설정으로 3분(180초)마다 git과 현재상태를 비교합니다. 이 주기를 Period 시간(time)이라고 합니다.
1.2 Period 시간 수정
helm으로는 values.yaml을 오버라이딩해서 수정할 수 있고 yaml파일로 배포했다면 Argo Controller deployment(또는 statefulset) command을 수정해야 합니다.
helm values.yaml 링크: https://github.com/muwon/argo-helm/blob/master/charts/argo-cd/values.yaml#L38
2. 수동 Refresh
2.1 개념
3분 주기를 기다리지 않고 사용자가 수동으로 Refresh하는 방법이 존재합니다. git에 업데이된 내용을 바로 쿠버네티스 클러스터에 적용하고 싶을 떄 사용합니다.
2.2 Refresh 종류
refresh는 일반 refresh와 hard refresh가 있습니다. hard refresh는 캐시를 무효화시키고 refresh를 수행합니다. 아마도 argocd controller가 내부적으로 캐시 매커니즘을 사용하는 것 같아요.
참고자료: https://github.com/argoproj/argo-cd/discussions/8260#discussioncomment-2031106
참고자료: https://argo-cd.readthedocs.io/en/stable/core_concepts/
참고자료: https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_app_get/
2.3 수동 Refresh 실행방법
2.4 예제
예제 실습을 위해 실습 github repo fork(https://github.com/choisungwook/argocd-practice)가 필요합니다.
fork한 repo에 있는 example-3을 기준으로 애플리케이션을 생성합니다. git주소를 제외하고는 helloworld예제) 생성단계와 동일합니다.
- application 이름: example-3
- git 정보
- repo: fork한 github 주소
- branch: main
- path: example-3
- kubernetes
- namespace: default
application 상세페이지에서 [Sync]버튼을 클릭해서 동기화를 해줍니다. 동기화가 잘되었다면 왼쪽 위에 Healthy라고 표시됩니다.
github에 있는 example-3폴더의 deployment.yaml을 수정해볼게요. replica갯수를 현재 설정된 갯수가 아닌 다른 갯수로 변경합니다. 그리고 git push를 하세요
argocd로 돌아와 상댄메뉴에 있는 [Refresh]버튼을 클릭합니다. 몇 초 뒤에 OutOfSync라는 문자열이 보이면서 주황색 아이콘이 표시됩니다. git과 현재 클러스터 정보가 달라, argocd가 의도된 상태와 현재 생태가 다르다고 표현한 겁니다.
git에 push된 의도된 상태가 올바르지 않다면(예: 쿠버네티스 문법 오류, namespace 없음) Error메세지가 표시됩니다.
3. Sync와 Sync Policy
3.1 Sync
Sync는 git에 있는 의도된 상태를 쿠버네티스 클러스터에 배포하는 작업으로 동기화라고 불립니다. sync의 조건은 git과 쿠버네티스 현재 상태와 차이가 있어야 합니다.
3.2 Sync Policy
Sync Policy는 Auto sync와 Manual sync가 있습니다. 차이점은 누가 sync을 수행하는가 입니다.
git과 쿠버네티스 현재 상태를 비교해서 차이가 있다면, Auto Sync는 argocd가 자동으로 sync 수행합니다. manual로 되어 있으면 사용자가 수동으로 sync를 해줘야 합니다. helloworld예제에서는 manual sync으로 설정했기 때문에 저희가 직접 sync버튼을 클릭했었습니다
sync Policy는 상황에 따라 적절히 선택하면 됩니다. 예를 들어 sync전 검토가 필요하다하면 manual sync를 선택할 수 있습니다. 또 다른 예제는 개발은 auto sync, 운영은 manual sync로 선택할 수 있습니다.
3.3 Sync가 필요한지 확인
Application이 sync가 필요한지 쉽게 확인할 수 있습니다. OutOfSync라는 메세지가 보이면 됩니다. 이 메세지는 git과 쿠버네티스 클러스터 상태와 다르다는 의미이므로 sync가 필요하나는 의미입니다. 자세한 내용은 Sync Status챕터 에서 다룹니다.
4. Sync Status
4.1 개념
Sync Status git과 쿠버네티스 현재 상태를 비교한 결과를 보여줍니다. 디폴트로 3분마다 또는 사용자가 Refresh을 수행하면 Sync Status가 업데이트 됩니다.
상태(status)는 Synced, Out Of Sync 2종류가 있습니다. git과 클러스터 현재 상태가 같으면 Synced, 다르면 Out Of Sync입니다.
4.2 Sync Status 확인방법
메인 화면에서는 왼쪽 [Sync Status]메뉴에서 볼 수 있습니다. Sync상태는 초록색 막대기가 표시되고 OutOfSync은 주황색 막대기로 표시됩니다.
운영할 때는 OutOfSync 상태로 필터링 설정해서 모니터링을 합니다.
application 상세 페이지에서는 현재 Sync 상태와 가장 최근 Sync Status가 있습니다.
[More]버튼을 클릭하면 각 sync 상태의 상세정보를 볼 수 있습니다.
Sync이력은 상단메뉴 [Sync Status]버튼을 클릭하면 볼 수 있습니다.
git에 push된 의도된 상태가 올바르지 않다면(예: 쿠버네티스 문법 오류, namespace 없음) Error메세지가 표시됩니다.
5. Health Status
5.1 개념
5.2 Healthy 상태
동기화 한 쿠버네티스 리소스가 이상없는 상태입니다.
5.3 Missing 상태
Sync Status가 OutOfSync일 때, 어떤 리소스가 git과 클러스터 상태가 불일치 한지 보여줍니다. 아래 예제에서는 service가 불일치하여 service에만 불일치 아이콘이 보입니다. 다른 아이콘은 Healthy이죠? service가 불일치하여 최종적으로는 Application자체가 불일치로 판단되었습니다.
5.4 Missing 상태 상세정보
Missing 상태를 발견하면 리소스 어떤 부분이 git과 현재 클러스터 상태 차이가 있는지 보고 싶으실겁니다. ArgoCD는 친절하게도 어떻게 차이가 나는지 보여줍니다
missing 상태인 리소스를 클릭합니다.
상세정보 창에서 [Diff]탭을 클릭하시면, 현재 클러스터와 git이 어떤 차이가 있는지 볼 수 있습니다. 왼쪽이 현재 클러스터 상태이고 오른쪽이 git에 있는 의도된 상태입니다. 아래 그림 예제에서는 service 리소스가 전혀 없는 상황이고 git에 service리소스가 추가된 상황입니다.
애플리케이션 전체 리소스 차이를 보려면 application을 클릭하고 [Diff]탭으로 이동하면 됩니다.
5.5 Progressing 상태
Sync작업(git의 의도된 상태를 클러스터로 동기화)이 수행 중이면 Progressing으로 표시됩니다.
5.6 Degraded 상태
Degraded는 Sync작업을 실패했다는 의미입니다. 쿠버네티스 설정 문제(예: serviceaccount 권한 없음, 노드에 스케쥴링 불가 등) 또는 네트워크 등 인프라 문제 등 때문에 동기화를 실패할 수 있습니다. 운영단계에서 가장 주목받는 Health Status입니다.
5.7 Suspended 상태
sync작업이 일시중지된 상태입니다. 다른 작업이 끝나야 수행되거나 외부 이벤트가 필요한 경우 suspended상태로 됩니다.
6. Prune
6.1 개념
prune은 동기화된 리소스 삭제옵션입니다. argocd로 쿠버네티스 리소스를 동기화하고 git에서 리소스를 삭제할 때, 해당 리소스를 쿠버네티스에서 삭제할지 유지할지 결정하는 옵션입니다.
prune이 비활성화되어 있으면 argocd로 동기화한 쿠버네티스 리소스는, git에 리소스가 삭제되더라도 쿠버네티스에 삭제되지 않고 유지됩니다. 반대로 prune이 활성화되면 git에 삭제되면 쿠버네티스 리소스도 삭제됩니다.
6.2 Prune 비활성화
prune옵션은 default로 비활성화 되어 있습니다. applicatino생성 때 Prune체크박스를 선택해야 활성화 됩니다.
Sync Policy가 Auto이면 [Prune Resources]로 설정할 수 있습니다.
Prune이 비활성화 되어 있으면 리소스는 삭제되지 않지만 X표시 아이콘이 보입니다.
6.3 운영 Tip
prune이 비활성화 되어 있으면 OutOfSync Health Status상태가 늘어납니다. git에 삭제되었지만 쿠버네티스 클러스터에는 있기 때문이죠.
7. Directory Recurse
7.1 개념
argocd는 path로 선택한 리소스 파일만 배포합니다. 지정한 경로에 폴더가 있다면, 폴더의 리소스는 배포되지 않습니다.
폴더를 포함한 모든 리소스를 배포하고 싶다면 [DIRECTORY RECURSE] 옵션을 선택해야 합니다.
7.2 예제
application을 생성하고 sync버튼을 클릭하여 동기화 합니다.
- application 이름: example-5
- git
- repo: https://github.com/choisungwook/argocd-practice.git
- branch: main
- path: example-5
- kubernetes
- namespace: default
sync결과를 보면 deployment는 생성이 되었지만, service폴더에 있는 service리소스는 배포되지 않았습니다.
[DIRECTORY RECURSE] 옵션을 활성화 해서 service폴더에 있는 리소스를 동기화해보겠습니다. 왼쪽 위에 있는 [App Details]버튼을 클릭합니다. 그리고 [Parameters]탭으로 이동하고 [DIRECTORY RECURSE]체크박스를 선택합니다.
[Refresh]버튼을 클릭하여 service폴더에 있는 리소스를 인식하는지 확인합니다.
Refresh결과를 보면 service폴더에 있는 리소스를 argocd가 인식했습니다.
Sync버튼을 클릭하면 service리소스가 생성됩니다.
8. Self Healing
8.1 개념
sync policy가 auto로 설정된 경우 선택할 수 있는 옵션입니다. argocd로 동기화된 리소스를 항상 git에 있는 의도된 상태로 보장해주는 기능입니다.
8.2 예제
예를 들어 git의 deployment에 replica가 1이 있다고 가정해봅시다. argocd로 동기화 한 후에, 긴급 패치로 kubectl로 replica 2로 수정했습니다. 이 때, Self Healing이 활성화 되어 있으면 긴급패치 했던 replica의 갯수는 git 설정되어 있는 1로 자동 수정됩니다.
'연재 시리즈' 카테고리의 다른 글
ArgoCD 6편 - Private Repository (0) | 2022.09.16 |
---|---|
ArgoCD 6편 - Phase (0) | 2022.08.30 |
ArgoCD 5편 - project (0) | 2022.08.14 |
ArgoCD 4편 - Application (0) | 2022.08.13 |
ArgoCD 3편 - helloworld (0) | 2022.08.13 |