Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Study_note

[CI/CD] ArgoCD sync 설정 본문

CICD

[CI/CD] ArgoCD sync 설정

Study_note 2022. 11. 25. 22:34
ArgoCD sync
git에 올라와 있는 파일을 argocd를 통해 클러스터에 동기화 하는 작업을 의미한다
 
여기서 argocd는 default 설정으로 3분마다 git과 버네티스 클러스터의 현재상태를 비교하며 이 주기를 Period라고 한다.
중요한건 Period가 디폴트로 3분으로 설정된 상황에서 git의 업데이트 내용이 바로 반영이 안되는 상황이 발생한다면 최대 3분까지 동기화를 기다려야 한다
 
이러한 문제로 git에 업데이된 내용을 바로 쿠버네티스 클러스터에 적용하고 싶을 때 사용하는 Refresh가 있다.
Refresh는 3분 주기를 기다리지 않고 사용자가 수동으로 git의 업데이트 내용을 argo가 바로 인지하는 방법이다.

 Refresh 사용
git에서 디플로이먼트 파일에 레플리카 수를 변경하였을때 바로 인지 못하고 synced 즉 동기화 되어있다 나와있다 하지만
period 기간 전에 refresh를 누르면 아래 처럼 sync status가 out of sync로 나타나는것을 확인 가능하다.
\
 
 
여기서 그럼 sync status이란 무엇일까?
 
sync status
application에 등록된 git의 현재 파일과 현재 쿠버네티스 클러스터 내 현재 상태를 비교한 결과를 보여는것이다.
period 시간(3분) 또는  Refresh을 수행하여 git 내부 파일 변경 시 또는 클러스터 내부 리소스 변경 시 Sync Status가 업데이트 됩니다.
sync status는 Synced, Out Of Sync 2종류로 나뉘어 지고
git과 클러스터 현재 상태가 같으면 Synced(초록색), 상태가 다르면 Out Of Sync(주황색)을 나타낸다.
 
 

 

[More]버튼을 클릭하면 각 sync 상태의 상세정보를 볼 수 있습니다.

여기까지는 argo를 통해 git과 쿠버네티스 상태를 비교하는 설명이고
다음으로는 어떻게 argo를 통해 변경된 부분을 어떻게 동기화 시키는지 설명한다. 
 
 
그전 포스트에 설명 하듯 Sync Policy은 2가지 방법으로 설정 할 수 있다
Auto sync와 Manual sync로 말그대로 자동과 수동 차이점이다
 누가 동기화를 수행하는가로 sync status가 Out Of Sync로 바뀔때
 
Auto sync는 argocd를 통해 변경된 점을 동기화 시켜주고
Manual sync는 사용자가 수동으로 sync를 선택 변경된 점을 동기화 시켜준다.

 

sync status를 설명했으니 다음으로는 health status를 설명해본다.

 

health status

상태들은 다음과 같이 Health, Missing, Progressing, Degraded, Suspended로 총 5가지 상태가 있으며 각각 상태의 의미는 아래와 같다

 

Healthy

git과 동기화 한 쿠버네티스의 리소스가 문제가 없다면 Healthy

 

Missing

Sync Status가 OutOfSync일 때,  git과 쿠버네티스의 특정 리소스가 맞지 않을때 나오는 상태로 맞지 않는 특정 리소스를 찾아준다 (diff 설정이 있어 틀린 부분을 찾아주는거 같지만 필자 생각은 썩 유용한거 같지는 않다)

 

 

Progressing

동기화 작업(sync)이 진행 중이면 Progressing으로 표시되면 Sync작업을 실패 한다면 Degraded, Suspended 성공한다면 Health로 변한다.

 

Degraded

동기화 작업 중 에러나 문제가 발생하여 동기화를 실패할 때 나오는 상태이다.

생성되지 않는 파드를 describe 명령어로 찾아보니 노드의 파드들이 많아 할당이 안되었던것을 확인 할 수 있다.

그렇기 떄문에 health status가 Degraded로 동기화 실패를 보여준다.

 

Suspended

동기화 작업이 일시 중지 된 상태로 다른 작업이 끝나야 수행되거나 외부 이벤트가 필요한 경우 suspended상태로 변경된다

 

application에서 app details를 선택 시 sync policy를 설정 가능하다(automated가 manual 시 prune, self heal 선택 불가능)

automated 및 prune, self heal 설정 할 수 있는데 아래와 같다

 

automated : Auto sync와 Manual sync로 선택할 수 있는 설정

 

prune

동기화 된 상태에서  git에서 리소스 파일 삭제 또는 변경하고 쿠버네티스에서 삭제할지 유지할지 결정하는 옵션이다.

 

예를들어 Auto sync상태에서 deployment파일을 깃에서 지웠을때 확인하면 다음과 같다.

 

아래처럼 health status는 계속 healthy로 application에 문제는 없고 sync status는 out of sync로 동기화에 문제가 있다라는 상태로 변환된다

또한 아래 삭제한 디플로이먼트는 x로 변환된것을 확인 가능하다

git에서 삭제한 디플로이먼트를 클러스터에서 확인하면 다음과 같이 지속적으로 운영되는것을 확인 할 수 있다. 

 

self heal

반대로 self heal은 git이 아닌 쿠버네티스에서 리소스를 변경 해도 결과 값은 git에 있는 파일로 유지되는것이다.

 

edit 명령어로 replica 수를 3에서 1로 줄였지만 edit 명령어로 1로 줄어들었다가 바로 git 파일에 명시되어있는 replica가 3으로 변환된다. 

 

그 외 동기화 설정 2가지를 더 설명하면 아래와 같다

 

Ignore Difference

특정 리소스를 sync 대상에서 제외시키는 기능으로 만약 hpa를 통해 파드가 증가할때 git에 따라 자동 동기화 되기 때문에 파드는 지속적으로 증가하지 못하는데 이러한 상황에서 Ignore Difference를 사용한다

 

현재 WEB UI에서는 제공하지 않으며 생성한 applicationd의 CRD 또는 argocd configmap에서 설정할 수 있다.

 

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: external-secrets-operator
  ...
spec:
  project: default
  source:
    ...
  destination:
    ...
  syncPolicy:
    ...
  ignoreDifferences: # 해당부분에 명시
    ...

 

Non Cascade

보통 application을 삭제할 시 쿠버네티스 모든 리소스는 삭제 되어진다 하지만 Non Cascade 설정하면

생성했던 application을 삭제할 때, 쿠버네티스 리소스는 그대로 두고 application만 삭제되어진다.

위에 사진처럼 쿠버네티스 리소스들은 삭제 안되고 남아있는것을 확인 가능

 

마지막으로 sync과정 순서라 불리는 phase를 설명한다

 

phase

sync과정은 총 3단계(pre sync, sync, post sync)로 나눌 수 있으며 pre-sync와 post sync는 annotations필드의 argocd hook필드를 사용하여 설정할 수 있다.

 

 

argocd github에서 phase예제로 argocd application을 생성할 수 있는데 다음과 같다

 

git repo  https://github.com/argoproj/argocd-example-apps

branch: master

path: pre-post-sync

로 application을 생성하면 되고 pre-post-sync의 야믈 파일은 아래와 같고 kustomization이 포함되어 다른 deployment와 service 파일을 base로 두어졌다

apiVersion: batch/v1
kind: Job
metadata:
  name: after
  annotations:
    argocd.argoproj.io/hook: PostSync # postsync 지정
    argocd.argoproj.io/hook-delete-policy: HookSucceeded # 삭제정책
spec:
  template:
    spec:
      containers:
      - name: sleep
        image: alpine:latest
        command: ["sleep", "10"]
      restartPolicy: Never
  backoffLimit: 0
  
---
apiVersion: batch/v1
kind: Job
metadata:
  name: before
  annotations:
    argocd.argoproj.io/hook: PreSync # presync 지정
    argocd.argoproj.io/hook-delete-policy: HookSucceeded # 삭제정책
spec:
  template:
    spec:
      containers:
      - name: sleep
        image: alpine:latest
        command: ["sleep", "10"]
      restartPolicy: Never
  backoffLimit: 0

그대로 application을 생성하면 아래 그림 처럼 잘 동기화 된것을 확인 가능하다

여기서 job은 삭제정책을  설정하여 argocd에서는 보이지 않지만 sync status를 클릭하면 아래처럼 pre sync, post sync가 생성된것을 확인 가능 하면 제일 아래 그림 처럼 생성된것을 확인 가능하다.

이런 phase는 보통 slack 같이 알림 기능을 argocd와 연동하고 싶을 때 특정 업데이트 전 알림을 받을 때 등 사용한다. 

 

 

참조

https://argo-cd.readthedocs.io/en/stable/user-guide/resource_hooks/

https://sungwook-choi.gitbook.io/argocd/sync-lifecycle/phases

'CICD' 카테고리의 다른 글

[CICD] Kustomzie  (0) 2022.12.14
[CI/CD] ArgoCD 사용하여 간단한 POD 배포  (1) 2022.11.24
Comments