본문 바로가기

인프런 복습 - 쿠버네티스 어나더 클래스

[Sprint2] ArgoCD 설치과정 총정리

 

원래 이전 포스팅으로 수업이 완전히 끝났지만, ArgoCD로 배포 시 에러가 생겼다. 이를 해결해야 하는데 개념이 혼재된 느낌이라 해결 방법을 찾기가 어려웠다. 그래서 마지막으로 ArgoCD 설치 과정에 대한 정리를 해보았다. 

 

 

1. 사전 작업

미리 강사님께서 Artifact Hub에서 argo-cd, argocd-image-updater, argo-rollouts package를 Github에 업로드 해놓으셨다. 

https://cafe.naver.com/f-e/cafes/30725715/articles/118?boardtype=L&menuid=13&referrerAllArticles=false

여기에 상세 과정이 나와있다. 

생각해둘 것은 

k8s-1pro/install/tree/main/ground/cicd-server/argo/helm/ 여기에 helm chart들이 업로드 되어있다는 것! 

 

 

 

2. ArgoCD 설치하기 

여기서 Jenkins 파일을 볼 필요가 있다. 

    parameters {
        choice(choices: ['option', 'namespace_create', 'namespace_delete', 'helm_upgrade', 'helm_uninstall'], name: 'DEPLOY_TYPE', description: '배포 타입 선택')
        choice(choices: ['option', 'argo-cd', 'argocd-image-updater', 'argo-rollouts'], name: 'TARGET_ARGO', description: 'Argo 대상 선택')
    }

이 parameters를 가지고 if/else 문을 구성해 다음과 같은 순서로 진행한다. 

이제 Jenkins에 namespace_install > helm_upgrade 순서로 빌드해주면 된다. 

(Jenkins로 ArgoCD pod를 빌드, 배포까지 해주는 것)

 

 

 

3. ArgoCD 접속 및 배포

https://192.168.56.30:30002/login

kubectl get -n argo secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d

▲ Jenkins 초기 비밀번호 확인 (관리자 비밀번호)

 

 

 

 

 

4. App 배포하기 

ArgoCD는 Application 단위로 App을 관리하기 때문에, Application을 만들면 된다. 

 

4-1. kubectl로 배포하기 

참고로 build 과정은 생략한다. (강사님의 1pro/api-tester:1.0.0 이미지를 대신 사용함)

# GENERAL
Application Name: api-tester-2231
Project Name: default
SYNC POLICY : Manual
AUTO-CREATE-NAMESPACE

# SOURCE
Repository URL : https://github.com/leesunmi99/kubernetes-anotherclass-sprint2.git
Revision : main
Path : 2231/deploy/k8s

# DESTINATION
Cluster URL : https://kubernetes.default.svc
Namespace : anotherclass-223
[선택] Directory

▲ 2231/deploy/k8s 에는 리소스들을 정의하는 yaml 파일들만 존재한다. (그래서 강사님의 image를 씀)

 

 

4-2. helm으로 배포하기 

# GENERAL
Application Name: api-tester-2232
Project Name: default
SYNC POLICY : Manual
AUTO-CREATE-NAMESPACE

# SOURCE
Repository URL : https://github.com/leesunmi99/kubernetes-anotherclass-sprint2.git
Revision : main
Path : 2232/deploy/helm/api-tester

# DESTINATION
Cluster URL : https://kubernetes.default.svc
Namespace : anotherclass-223

[선택] Helm
VALUES FILES : values-dev.yaml [입력 후 엔터]

▲ ArgoCD가 자동으로 helm 파일임을 인식함 

 

 

 

 


 

 

5. ArcoCD Image Updater

- helm과 Kustomize를 사용할 때만 동작한다. ( 내부적으로 --set image.tag=1.0.0-202506.031850 이런 옵션을 사용하기 때문)

- Docker hub를 모니터링 하고, 이미지가 업데이트 되면 ArgoCD에 배포 명령을 보낸다 

 

values-dev.yaml 파일

config:
  argocd:
    serverAddress: "https://argo-cd-argocd-server"

  registries:
    - name: Docker Hub
      api_url: https://registry-1.docker.io
      #credentials: env:DOCKER_HUB_CREDS=username:passowrd

▲ ArgoCD의 API 주소 : https://argo-cd-argocd-server

▲ Docker Hub의 이미지 저장소 API 주소: https://registry-1.docker.io

 

 

 

 

 

자동 배포 설정 방법 

(App 버전 업그레이드로 컨테이너 이미지를 변경해야 할 때

helm_upgrade (argocd-image-updater 선택) 

# GENERAL
Application Name: api-tester-2232
Project Name: default
SYNC POLICY : Manual
AUTO-CREATE-NAMESPACE

# SOURCE
Repository URL : https://github.com/leesunmi99/kubernetes-anotherclass-sprint2.git
Revision : main
Path : 2232/deploy/helm/api-tester

# DESTINATION
Cluster URL : https://kubernetes.default.svc
Namespace : anotherclass-223

[선택] Helm
VALUES FILES : values-dev.yaml [입력 후 엔터]

이전에 helm으로 배포한 App의 Application

여기에 추가로 Annotation을 입력한다. 

 

// 도커 허브에서 이미지 대상 지정
# argocd-image-updater.argoproj.io/image-list=<alias>=<Dockerhub-Username>/api-tester
argocd-image-updater.argoproj.io/image-list=lsm0-api-tester=lsm0/api-tester
//lsm0/api-tester : 레퍼지토리 이름 

// 업데이트 전략 선택
# argocd-image-updater.argoproj.io/<alias>.update-strategy=name
argocd-image-updater.argoproj.io/lsm0-api-tester.update-strategy=name

// 태그 정규식 설정 (1.1.1-231220.175735) 
# argocd-image-updater.argoproj.io/<alias>.allow-tags=regexp:^1.1.1-[0-9]{6}.[0-9]{6}$
argocd-image-updater.argoproj.io/lsm0-api-tester.allow-tags=regexp:^1.1.1-[0-9]{6}.[0-9]{6}$

▲ alias: ArgoCD에서 내부에 붙이는 별칭 

다른 App 이여도 같은 image를 사용할 수 있기 때문에 alias(별칭)를 달아주는 것!

 

이미지 업데이트 옵션: 

https://argocd-image-updater.readthedocs.io/en/stable/basics/update-strategies/

 

 

SYNC POLICY > ENABLE AUTO-SYNC

 

 

Docker build Job 생성 (Jenkins에서) 

[새보기]
223
Type: List View

[item]
Enter an item name : 2232-build-docker-for-image-updater
[Pipeline] 선택


Project url : https://github.com/leesunmi99/kubernetes-anotherclass-sprint2/
Pipeline script from SCM
SCM : Git
Repository URL : https://github.com/leesunmi99/kubernetes-anotherclass-sprint2.git
Branch Specifier : */main
Path : 2232
Script Path : 2232/Jenkinsfile

 

 

 

 

이후 수업을 위해 api-tester-2232 Application삭제한다

 

 


6. Argo Rollouts 

6-1. Argo Rollouts로 Blue/Green 배포하기 

실습 과정

Argo Rollouts 설치 -> App 생성 -> 배포 -> Git 수정 후 Refresh -> Sync -> Promote 

 

Argo Rollouts 설치 방법 

Jenkins > deploy-argo ( helm_upgrade / argocd-rollouts) 빌드

 

App 생성하기 [EDIT AS YAML]

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: api-tester-2233
spec:
  destination:
    name: ''
    namespace: anotherclass-223
    server: 'https://kubernetes.default.svc'
  source:
    path: 2233/deploy/argo-rollouts
    repoURL: 'https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2.git'
    targetRevision: main
  sources: []
  project: default

 

배포하기

SYNC 버튼 클릭 

 

트래픽 보내기

# Actie Service
while true; do curl http://192.168.56.30:32233/version; sleep 2; echo '';  done;

# Preview Service
while true; do curl http://192.168.56.30:32243/version; sleep 2; echo '';  done;

 

 

Git 수정하기 

image: '1pro/api-tester:1.0.0' => image: '1pro/api-tester:2.0.0'

 

 

Argo Rollouts 대시보드 확인 

http://192.168.56.30:30003/rollouts/anotherclass-223

 

 

+ Argo Rollouts CLI 설치

// root 계정
curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.4/kubectl-argo-rollouts-linux-amd64
chmod +x ./kubectl-argo-rollouts-linux-amd64
mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts



// 설치 확인
kubectl argo rollouts version


// 조회 
kubectl argo rollouts get rollout api-tester-2233 -n anotherclass-223 -w

 

 

 

 

 

 

 

6-2. Argo Rollouts로 Canary 배포하기 

# kubectl로 Rollouts 배포 
kubectl apply -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/rollout.yaml -n anotherclass-223
kubectl apply -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/configmap.yaml -n anotherclass-223
kubectl apply -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/secret.yaml -n anotherclass-223
kubectl apply -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/service.yaml -n anotherclass-223


//조회
kubectl argo rollouts get rollout api-tester-2234 -n anotherclass-223 -w

 

트래픽 보내기

while true; do curl http://192.168.56.30:32234/version; sleep 2; echo '';  done;

 

 

배포 시작

// 방법1) 직접 edit 로 수정하기
// kubectl argo rollouts edit <ROLLOUT_NAME> -n <NAMESPACE_NAME>
kubectl argo rollouts edit api-tester-2234 -n anotherclass-223

// 방법2) image 수정하기 
// kubectl argo rollouts set image <ROLLOUT_NAME> <CONTAINER_NAME>=<IMAGE>:<TAG> -n <NAMESPACE_NAME>
kubectl argo rollouts set image api-tester-2234 api-tester-2234=1pro/api-tester:2.0.0 -n anotherclass-223

 

 

리소스 정리

kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/rollout.yaml -n anotherclass-223
kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/configmap.yaml -n anotherclass-223
kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/secret.yaml -n anotherclass-223
kubectl delete -f https://raw.githubusercontent.com/k8s-1pro/kubernetes-anotherclass-sprint2/main/2234/deploy/argo-rollouts/service.yaml -n anotherclass-223