Happy@Cloud 2024. 8. 7. 03:18

Helm chart로 손쉽게 ArgoCD를 설치하는 방법입니다.  

1. Helm chart repository 추가 

helm repo add argo https://argoproj.github.io/argo-helm

2. 사용자 정의 설정 파일 만들기

아래 내용으로 argocd.yaml파일을 만듭니다.

global.domain은 ingress host로 사용됩니다. 적절하게 변경하세요.  

## Globally shared configuration
global:
  # -- Default domain used by all components
  ## Used for ingresses, certificates, SSO, notifications, etc.
  domain: argo.43.200.12.214.nip.io
server:
  ingress:
    enabled: true
    https: true
    annotations:
      kubernetes.io/ingress.class: nginx
    tls:
      - secretName: argocd-tls-secret
  extraArgs:
    - --insecure  # ArgoCD 서버가 TLS 종료를 Ingress에 위임

configs:
  params:
    server.insecure: true  # Ingress에서 TLS를 처리하므로 ArgoCD 서버는 HTTP로 통신
certificate:
  enabled: false  # 자체 서명 인증서 사용 비활성화 (외부 인증서 사용 시)

 

3. namespace 생성

ArgoCD를 배포할 네임스페이스를 만들고 이동합니다.  

kubectl create ns argocd
kubens argocd

 

4. argocd-tls-secret 생성

ArgoCD는 ssl로 통신하므로 SSL키가 있어야 하고, 이 키를 이용하여 Secret을 만들어야 합니다.  

SSL키는 실제 운영시에는 공인인증 기관으로 부터 구매하시면 됩니다. 

여기서는 테스트 키를 만들어 사용합니다. 

아래와 같이 테스트 키를 만들고 Secret까지 작성합니다.  

테스트 키를 만들때 CN에는 위에서 지정한 global.domain과 동일한 값을 지정해야 합니다.  

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=argo.43.200.12.214.nip.io"

kubectl create secret tls argocd-tls-secret \
  --namespace argocd \
  --key tls.key \
  --cert tls.crt

 

5. ArgoCD 설치

helm chart로 설치합니다. 

helm install argocd -f argocd.yaml argo/argo-cd

 

6. 로그인

username은 'admin'이고 최초 비밀번호는 argocd-initial-admin-secret에서 아래와 같이 구합니다.  

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

비밀번호는 로그인 후 'User Info'에서 변경할 수 있습니다. 


 

아래는 ArgoCD Project 생성 시 옵션에 대한 설명입니다.  

## ArgoCD New Application 
- Application name: 동기화할 application 명 
- Project name: ArgoCD의 애플리케이션들을 논리적으로 그룹핑한 개념으로 Project 단위로 소스, 권한, Git과의 Sync방법등을 관리할 수 있음
- Sync Policy:  Manual / Automatic
  - Automatic > prune resources: Git에 정의되어 있지 않은 k8s 오브젝틑는 삭제 
  - Automatic > self heal: Git에 정의된 값으로 k8s 오브젝트의 상태를 강제 동기화 시킴(예: Pod 수 일치)
  - set Deletion Finalizer: k8s 오브젝트 삭제 시 관련된 다른 object들을 먼저 삭제하는 finalizer를 자동으로 추가할 지 여부. 불필요한 오브젝트가 남는 걸 막기 위해 체크하는 것이 좋음

- Sync options
  - Skip Schema Validation: Kubernetes 매니페스트의 스키마 유효성 검사를 건너뜀
  - Prune Last: 마지막 동기화에서 생성되었지만 더 이상 Git 저장소에 없는 오브젝트를 제거
  - Respect Ignore Differences: ArgoCD 애플리케이션 리소스에 지정된 무시할 차이점을 고려. Git 리소스 정의 시 spec.ignoreDifferences 필드에 정의한 필드값의 차이는 무시하는 옵션임
  - Auto-Create Namespace: 애플리케이션 배포 시 지정된 네임스페이스가 없으면 자동으로 생성
  - Apply Out of Sync Only: Git 저장소와 클러스터 간에 차이가 있는 경우에만 변경 사항을 적용
  - Server-Side Apply: 쿠버네티스 서버 사이드 적용 기능을 사용하여 리소스를 적용. 여러 도구로 동일한 리소스를 관리할 때 필드 수준의 병합을 하여 충돌을 방지할 수 있음
- Prune Propagation Policy
  - foreground: 종속 오브젝트부터 먼저 삭제하고 대상 오브젝트 생성. 일반적으로 권고하는 옵션
  - background: 대상 오브젝트 먼저 삭제하고 종속 오브젝트는 백그라운드에서 삭제. 고아 오브젝트가 남을 수 있음
  - orphan: 종속 오브젝트를 삭제하지 않음 

- Replace/Retry: 
  - Replace: 변경된 필드만 부분적으로 변경하는 것이 아닌 기존 오브젝트를 통째로 Git에 정의한대로 바꿈
  - Retry: 동기화 실패 시 재 시도함
    - limit: 재시도 최대 횟수
    - durations: 동기화 실패 시 다음 동기화까지의 대기 시간
    - max duration: 동기화 재 시도의 총 수행시간 최대값
    - factor: 다음 동기화까지의 대기 시간을 늘리는 승수(예: durations가 5초이고 factor가 2이면 첫 재시도는 5초, 2nd 재시도는 10초, 3rd 재시도는 20초후에 수행됨)
- Source(Git)
  - Repository URL: manifest가 있는 Git repository 주소
  - Revision: Branch나 Tag. 'HEAD'는 기본 브랜치에서 가져오는 것을 의미
  - Path: 레포지토리에서 manifest가 있는 디렉토리 경로 
- Source(Helm)
  - Repository URL: HTTP로 접근할 수 있는 helm chart가 있는 주소. 예) https://raw.githubusercontent.com/cna-bootcamp/helm-charts/main/stable
  - Charts: 확장자가 tgz인 helm chart 파일의 이름. 예) subride-front-1.1.0.tgz이면 subride-front
  - Version: 차트 버전. 예) subride-front-1.1.0.tgz이면 1.1.0
- Destination
  - Cluster URL: API Server 파드를 접근할 수 있는 Service object 주소. 예) https://kubernetes.default.svc
  - Namespace: 배포할 namespace명 

- Directory
  - Directory Recurse: 하위 디렉토리 recursive하게 탐색하여 manifest파일을 찾을지 여부
  - Top-level Arguments: 매니페스트 파일 설정을 overriding함. 예) spec.template.spec.containers[0].image=docker.io/hiondal/springboot-gradle:1.0.0
  - External Variables: 매니페스트 파일 설정을 외부 환경변수값으로 replace함
    아래 예와 같이 yaml을 만들고 External Varialbes에 IMAGE_TAG=1.0.0으로 입력 
    ```
	apiVersion: apps/v1
	kind: Deployment
	metadata:
	  name: myapp
	spec:
	  template:
	    spec:
	      containers:
	      - name: myapp
	        image: myapp:{{env.IMAGE_TAG}}
    ```
  - Include: 포함할 특정 파일이나 디렉토리
  - Exclude: 제외할 특정 파일이나 디렉토리