새소식

CICD

[CI/CD Study 4주차] ArgoCD HA, 모니터링, 백업

  • -

CoudNet@ 팀의 가시다님께서 리딩하시는 CI/CD Study 4주차 스터디 내용 정리

 

이번 주차에서는 '예제로 배우는 ArgoCD 책' 기반으로 ArgoCD 에 대해서 학습했습니다.
이번 글에서는 ArgoCD HA 구성, 모니터링, 백업에 대해서 학습한 내용을 서술하겠습니다.

 

 

1. ArgoCD HA 실습 환경 구성

 

1.1. HA 개요

 

 

ArgoCD HA 핵심 개념

  • Argo CD HA의 핵심은 Controller, Repo-server, Server 3대 구성요소를 다중화 + Redis HA 구성
  • Redis HA는 Sentinel + HAProxy 로 장애 시 자동 failover
  • Controller는 Leader Election으로 1개만 active, 나머지는 standby
  • Repo-server / Server는 수평 확장으로 부하 분산
  • 모든 구성요소는 Argo CD CRD(Application)를 watch하여 자동 GitOps 수행

 

ArgoCD 컴포넌트 상세

 

1. API Server

- 외부 통신 담당 서버

- CLI 혹은 UI 를 사용하거나 클라이언트를 생성하거나 할 때 API 로 통신

- 고가용성 매니페스트에서는 2개의 파드 인스턴스로 설정

 

2. Repository Server

- 클러스터에 적용할 최종 매니페스트 파일 생성

- Helm(v2, v3), Kustomize, Jsonnet 등

- 고가용성 매니페스트에서는 2개의 레플리카를 제공

 

3. Application Controller
- 작업이 시작되고, 컨트롤 루프가 동작하면 애플리케이션 동기화 발생
- 클러스터 샤드(Shard) 당 하나의 인스턴스 가능
- 고가용성 매니페스트에서는 1개의 컨트롤러 인스턴스 사용

 

4. Redis Cache

- 매니페스트 생성은 무거운 작업이기 때문에 ArgoCD 는 인스턴스에 매니페스트를 저장하려고 함
- 캐시가 실패해도 재생성되기 때문에 문제는 없음
- 성능 상 페널티는 생길 수 있음
- 고가용성 매니페스트
- 추가적인 HAProxy 디플로이먼트
- 3개의 Redis 레플리카 (1개 Master + 2개 Slave)

 

5. Dex Server
- 외부 ID 공급자 사용 시, 사용자 인증 담당
- SAML (Security Assertion Markup Language), OIDC (OpenID Connect), LDAP (Lightweight Directory Access Protocol)
- GitHub, Google Account 를 ArgoCD 에 연결하려는 경우 Dex Server 필요

 

1.2. 실습환경 준비 (Kind 구성, ArgoCD 배포)

 

실습은 Kind 클러스터를 통해 ArgoCD HA 요구 조건인 Control Plane 1대 + Worker Node 3대로 구성했습니다.

 

# Kind 클러스터 배포
kind create cluster --name myk8s --image kindest/node:v1.32.8 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
  - containerPort: 30002
    hostPort: 30002
  - containerPort: 30003
    hostPort: 30003
- role: worker
- role: worker
- role: worker
EOF

# ArgoCD 배포 디렉토리 생성
mkdir resources

# Namespace 생성
cat << EOF > resources/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: argocd
EOF
kubectl apply -f resources/namespace.yaml

# ArgoCD 설치 파일 저장
wget https://raw.githubusercontent.com/argoproj/argo-cd/refs/heads/master/manifests/ha/install.yaml
mv install.yaml resources/

# ArgoCD HA 배포
kubectl apply -f resources/install.yaml -n argocd

 

 

1.3. ArgoCD 자체 관리

 

ArgoCD 는 클러스터에서 애플리케이션을 관리하는 것처럼 자기 자신을 애플리케이션으로 관리할 수 있습니다.
이전 글에서 작성한 오토파일럿과 동일한 기능을 합니다.

 

ArgoCD 애플리케이션을 만들고 매니페스트에 특정 폴더를 지정합니다.
그러면, ArgoCD 가 리포지터리와 폴더 변화를 모니터링 하고 해당 폴더에 커밋 발생 시 자동으로 적용합니다.

 

ArgoCD 에 Git 저장소 등록

 

 

 

ArgoCD 에 자체 애플리케이션 등록 (CRD)

 

export ARGO_INSTALL_REPO=<ArgoCD 설치 매니페스트가 저장된 Git 저장소>

cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd
  namespace: argocd
spec:
  project: default
  source:
    path: resources
    repoURL: $ARGO_INSTALL_REPO
    targetRevision: main
  syncPolicy:
    automated: {}
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
EOF

 

 

이제 ArgoCD 도 자체적으로 ArgoCD 가 관리하게 되었습니다.
그렇다면 실제로 ArgoCD 설치파일의 Git 내용을 변경하여 클러스터에 적용되는 지 확인해보겠습니다.

 

ArgoCD 설치 매니페스트 수정

 

Network Policy 부분을 변경하려고 합니다.

 

kubectl get networkpolicies.networking.k8s.io -n argocd

 

 

Network Policy 가 존재하는 것을 확인하였고, ArgoCD 매니페스트에서 Network Policy 부분을 모두 삭제한 후 Git 에 푸시합니다.

 

git add . && git commit -m "Delete Network Policy Resource" && git push -u origin main

 

이후 ArgoCD UI 에서 OutofSync 가 확인되며, 리소스가 제거되었기 때문에 Prune 을 체크한 후 싱크를 실행합니다.

 

 

 

그 후 Synced 상태가 되며 다시 한 번 Network Policy 리소스를 확인했을 때는 삭제된 것을 알 수 있습니다,.

 

kubectl get networkpolicies.networking.k8s.io -n argocd

 




2. ArgoCD 모니터링

 

ArgoCD 리소스에 대한 모니터링은 프로메테우스로 확인이 가능합니다.

 

2.1. Prometheus 설치

 

간단하게 Prometheus Stack 을 통해 배포를 진행했습니다.

 

# Repo 등록
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# Value 편집
cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    scrapeInterval: "15s"
    evaluationInterval: "15s"
  service:
    type: NodePort
    nodePort: 30002

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator
  service:
    type: NodePort
    nodePort: 30003

alertmanager:
  enabled: false
defaultRules:
  create: false
prometheus-windows-exporter:
  prometheus:
    monitor:
      enabled: false
EOT

# 프로메테우스 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 75.15.1 \
  -f monitor-values.yaml --create-namespace --namespace monitoring

# Mac 에서 프로메테우스와 그라파나 접속
open http://127.0.0.1:30002
open http://127.0.0.1:30003

 

2.2. ArgoCD Service Monitor 배포

 

Service Monitor

 

- Prometheus Operator가 Kubernetes 서비스(Service)를 자동으로 감시하도록 정의하는 Custom Resource
- 프로메테우스 자체는 원래 정적으로 리소스 메트릭을 수집하지만,

   Kubernetes 환경에서는 서비스가 동적으로 생성되므로 이를 관리하기 위해 ServiceMonitor 를 통해서 리소스 메트릭을 수집

 

ArgoCD Service 컴포넌트에 대한 서비스 모니터 생성

 

# ServiceMonitor 생성
cat <<EOF | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-metrics
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-metrics
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
EOF

cat <<EOF | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-server-metrics
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-server-metrics
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
EOF



# ServiceMonitor 생성
cat <<EOF | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-repo-server-metrics
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-repo-server
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
EOF

cat <<EOF | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-applicationset-controller-metrics
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-applicationset-controller
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-dex-server
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-dex-server
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-redis-haproxy-metrics
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-redis-ha-haproxy
  endpoints:
    - port: http-exporter-port
  namespaceSelector:
    matchNames:
      - argocd
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-notifications-controller
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-notifications-controller-metrics
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
EOF

 

서비스 모니터 배포 후에는 프로메테우스에서 Target Health 가 성공하는 것을 확인할 수 있습니다.

 

 

2.3. Grafana 대시보드 연동

 

ArgoCD 대시보드 는 ArgoCD 공식 문서에 나와있는 대시보드를 연동하겠습니다.

 

공식 문서 - 대시보드

https://argo-cd.readthedocs.io/en/stable/operator-manual/metrics/#dashboards

 

 

argo-cd/examples/dashboard.json at master · argoproj/argo-cd

Declarative Continuous Deployment for Kubernetes. Contribute to argoproj/argo-cd development by creating an account on GitHub.

github.com

 

 

2.4. ArgoCD 운영 시 주요 메트릭

 

ArgoCD 모니터링의 가장 중요한 컴포넌트는 리포지터리 서버컨트롤러입니다. (동기화 수행)

 

시간이 지남에 따라 해당 컴포넌트는 리소스 사용량에 따른 OOMKilled 종료가 발생할 가능성이 있습니다.
지난 5분 동안 컨테이너가 다시 시작됐거나 마지막으로 종료된 이유가 OOMKilled 인지 여부를 확인하기 위해서 다음과 같은 쿼리가 가능합니다.

 

sum by (pod, container, reason) (kube_pod_container_status_last_terminated_reason{})
* on (pod,container) group_left
sum by (pod, container) (changes(kube_pod_container_status_restarts_total{}[1m]))

 

이런 알람이 하루에도 2번 이상 발생할 경우 즉시 조치를 취하는 게 좋습니다.

 

OOMKilled 조치 방법

  • 디플로이먼트나 스테이트풀셋의 레플리카 숫자 증가
  • 컨테이너의 CPU와 메모리 리소스를 더 높게 할당
  • 리포지터리 서버의 --parallelismlimit 매개변수 값과 컨트롤러의 —-kubectl-parallelism-limit 매개변수 값 감소




3. ArgoCD 백업

 

ArgoCD 의 설정 값을 백업하고 신규 클러스터에 복원해보겠습니다.

 

3.1. ArgoCD 백업

 

ArgoCD 백업은 CLI 를 통해 간단히 진행 가능합니다.

 

# CLI 로그인
ARGOPW=<ArgoCD 비밀번호>
argocd login localhost:8080  --username admin --password $ARGOPW --insecure

# ArgoCD 백업
argocd admin export -n argocd > backup.yaml

# 확인
cat backup.yaml | head

 

 

3.2. ArgoCD 복원

 

신규 클러스터 생성

 

ArgoCD 복원 테스트를 위해 신규 kind 클러스터를 배포합니다.

 

kind create cluster --name myk8s2 --image kindest/node:v1.32.8 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 31000
    hostPort: 31000
  - containerPort: 31001
    hostPort: 31001
  - containerPort: 31002
    hostPort: 31002
  - containerPort: 31003
    hostPort: 31003
- role: worker
- role: worker
- role: worker
EOF

# Context 확인
kubectl config get-contexts

# Context 별칭 생성
alias k8s1='kubectl --context kind-myk8s'
alias k8s2='kubectl --context kind-myk8s2'

 

신규 클러스터에 ArgoCD HA 배포

 

백업된 내용을 복원하기 위해 신규 ArgoCD HA 를 배포합니다.
앞서 ArgoCD HA 를 배포하기 위한 설치 매니페스트를 그대로 사용하겠습니다.

 

# ArgoCD HA 설치
k8s2 apply -f resources/namespace.yaml
k8s2 apply -f resources/install.yaml -n argocd

# 리소스 동작 확인 후 포트포워딩
kubectl port-forward svc/argocd-server -n argocd 8081:80 --context kind-myk8s2

# ArgoCD 초기 암호 확인
k8s2 get secret -n argocd argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d ; echo

# ArgoCD UI 접속
open https://127.0.0.1:8081

 

Git 저장소 접근 정보 등록

 

 

신규 클러스터에 ArgoCD 복원

 

# ArgoCD CLI 로그인
ARGOPW2=<신규클러스터 ArgoCD 암호>
argocd login localhost:8081  --username admin --password $ARGOPW2 --insecure

# 현재 ArgoCD 리소스 조회
argocd cluster list
argocd app list

# ArgoCD 복원
argocd admin import -n argocd - < backup.yaml

 

ArgoCD 복원 시, 암호 설정은 백업된 ArgoCD 암호로 변경되므로 주의

 

 

기존 ArgoCD 암호를 통해서 신규 ArgoCD 로그인 시 백업된 애플리케이션이 배포된 것을 확인할 수 있습니다.

 

Contents

포스팅 주소를 복사했습니다