Repository 관리 방법
repository 분리의 장점은 접근 유저별로 권한 관리가 가능하고, 불필요한 코드 다운을 방지한다는 점이다.
- App 소스 전용: App의 기능을 위한 코드의 저장소.1명 이상의 개발자가 공유하며 CI/CD 서버에서 해당 코드를 다운받아 배포한다.
- App 배포 전용: App을 배포하기 위한 release 파일들의 저장소. 관리 주체는 DevOps 엔지니어이지만 개발자도 자신의 코드를 배포할 수 있다.
- Addon 설치 전용: Argo나 Prometheus 같이 서비스를 운영하는데 필요한 소스들의 저장소. 운영자가 관리.
ArgoCD 설치
Argo Project는 Helm repo를 추가하여 간편하게 각 제품별로 설치할 수 있다.
자신의 배포 전용서버에서 편한 위치에 argo 디렉토리를 생성하고 helm pull으로 필요한 제품의 차트를 가져온다
# helm 차트 가져오기
helm repo add argo https://argoproj.github.io/argo-helm
sudo mkdir argo
helm pull argo/argo-cd --version 5.52.1 --untar --untardir ./argo/
helm pull argo/argocd-image-updater --version 0.9.2 --untar --untardir ./argo/
helm pull argo/argo-rollouts --version 2.34.1 --untar --untardir ./argo/
이후 ArgoCD의 서비스를 nodePort로 설정하기 위해 values-dev.yaml 파일을 생성하여 아래 내용을 작성한다.
server:
service:
type: NodePort
nodePortHttps: 30002
이후 아래 명령어로 설치를 진행한다.
본인은 jenkins에서 kubeconfig credential을 사용하여 배포했기 때문에 --kubeconfig 옵션을 사용했다.
만약 자신이 k8s가 깔려있는 노드에서 설치한다면 해당 옵션은 제외하기.
또한 chart가 위치한 경로를 자신의 환경에 맞게 수정하여 배포하면 된다.
helm upgrade argo-cd argo/argo-cd -f argo/argo-cd/values-dev.yaml \
-n argo --create-namespace --install --kubeconfig ${KUBECONFIG} \
--wait --timeout=10m
설치가 잘 됐는지 확인. 각 파드가 어떤 기능을 하는지 궁금하다면 이전 포스팅을 참고.
k get pod -n argo
---
NAME READY STATUS RESTARTS AGE
argo-cd-argocd-application-controller-0 1/1 Running 0 4d20h
argo-cd-argocd-applicationset-controller-849d9dd89-4sd6p 1/1 Running 0 4d20h
argo-cd-argocd-dex-server-5688cb76f-rc7lv 1/1 Running 0 4d20h
argo-cd-argocd-notifications-controller-6bcf7cd485-grtzx 1/1 Running 0 4d20h
argo-cd-argocd-redis-767848b788-5wwx5 1/1 Running 0 4d20h
argo-cd-argocd-repo-server-c665c46b7-ngfhb 1/1 Running 0 4d20h
argo-cd-argocd-server-5f9789bc46-6pk8g 1/1 Running 0 20h
ArgoCD 접속
설치와 배포가 정상적으로 완료 되었다면 아래 주소를 통해 대시보드에 접속할 수 있다.
https://<SERVER_IP>:30002/login
로그인 창이 뜨는데 아이디는 admin 이고 비밀번호는 랜덤값 생성되는데 초기 비밀번호를 확인하는 명령어는 다음과 같다.
kubectl get -n argo secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d
---
L5DwRCgwiHD7CXDb
해당 초기 비밀번호를 입력해 로그인한 뒤 User Info > UPDATE PASSWORD로 비밀번호를 변경해준다.
ArgoCD 사용하여 App 배포하기
ArgoCD의 최종 목표는 Git에서 release 파일을 다운받아 쿠버네티스 클러스터에 배포하는 것이다.
ArgoCD에서는 Application 단위로 배포를 진행하는데, jenkins의 project job 단위와 동일하며 하나의 App을 이루고있는 모든 리소스를 배포하는것을 의미한다.
먼저 새로운 App을 배포하기 위해 Applications > [+ NEW APP] 클릭한다.
그러면 배포를 위해 작성해야할 항목들이 나타난다.
General
General은 App의 기본 정보 및 배포 옵션을 정의하는 항목이다.
- Application Name: 배포 APP 이름
- Project Name: 그룹 이름. 네임스페이스처럼 App을 grouping 하는 역할을 한다.
- Sync Policy: 리소스의 변경이 감지 됐을 때 자동/수동 배포 옵션을 선택. 변경 감지는 3분 주기로 수행한다.
- Sync Option: 배포 상세 옵션
- SKIP SCHEMA VALIDATION: 매니페스트에 대한 yaml 스키마 유효성 검사를 건너뒤고 배포한다. (kubectl apply --validate=false)
- PRUNE LAST: 동기화 작업이 끝난 이후에 Prune(git에 없는 리소스를 제거하는 작업)을 수행한다.
- RESPECT IGNORE DIFFERNECES: 동기화 상태에서 특정 상태의 필드를 무시하도록 한다.
- AUTO-CREATE NAMESPACE: 클러스터에 네임스페이스가 없을 시 argocd에 입력한 이름으로 자동 생성
- APPLY OUT OF SYNC ONLY: 현재 sync 상태가 아닌 리소스만 배포
- SERVER-SIDE APPLY: 쿠버네티스 서버에서 제공하는 Server-side Apply API 기능 활성화.
- Prune Propagation Policy: 리소스 삭제시의 정책
- foreground: 부모(소유자, ex. deployment) 자원을 먼저 삭제한다.
- background: 자식(종속자, ex. pod) 자원을 먼저 삭제한다.
- orphan: 고아(소유자는 삭제됐지만 종속자가 삭제되지 않은 경우) 자원을 삭제한다
Source
Source는 배포할 Git repository에 대한 항목이다. 이 때 release 파일의 저장소를 의미한다.
- Repository URL: release 파일 git repository 주소. helm도 가능하다
- Revision: 배포할 tag나 branch
- Path: git 저장소에서 release 파일이 위치한 경로
Destination
Destination은 배포할 쿠버네티스 클러스터 정보를 말한다.
- Cluster URL: App을 배포할 target Kubernetes 클러스터
- Namespace: App을 배포할 target Kubernetes namespace
* 맨 아래에는 어떤 방식으로 배포할지 선택할 수 있는데, argoCD는 Directory, Helm, Kustomize 방식의 배포를 지원한다.
Directory 방식은 일반적인 kubernetes yaml 파일을 의미한다. 해당 옵션을 우리가 선택할 필요는 없고 Source에 작성한 git repository에서 파일을 알아서 인식하게 된다.
모든 내용을 작성하고 상단의 [CREATE] 버튼을 누르면 아래와 같이 git 저장소에 저장된 release 파일 기준으로 배포될 리소스 형태가 만들어진다.
여기서 App Health가 Missing 상태이고, Sync Status 또한 OutOfSync 상태인것을 볼 수 있다.
App Health는 현재 배포된 app의 작동상태를 나타내는 것이고, Sync status는 내 git 저장소와 배포된 app의 버전이 동일한지 알려준다. 현재 우리는 리소스만 생성하고 아직 배포를 수행하지 않았기 때문에 저런 상태가 된다.
여기서 맨 위의 sync 버튼을 누르면 배포할 리소스들을 선택할 수 있고 옵션도 변경할 수 있다.
모두 선택한 후 Synchronize 버튼을 누르게 되면 sync status가 synced로 변경되고 App health 또한 progressing으로 변경 되었다. 아직 pod가 기동 중이기 때문에 progressing 상태이며
모든 pod의 초기화 작업이 끝나 Ready 상태가 되면 App health가 Healthy로 바뀐다.
각 리소스를 클릭해보면 kubectl describe 명령어 처럼 현재 배포된 리소스의 정보와 상태를 볼 수 있다.
또한 로그 확인도 가능하며 아래 live manifest를 수정하여 kubectl edit과 같은 효과를 누릴 수 있다.
'DevOps' 카테고리의 다른 글
[ArgoCD] Argo Rollouts를 이용한 고급 배포 전략 (4) | 2024.10.20 |
---|---|
[ArgoCD] ArgoCD Image Updater를 이용해 쿠버네티스에서 App 버전 업그레이드 자동화하기 (4) | 2024.10.20 |
[ArgoCD] ArgoCD 아키텍처에 대한 이해 (0) | 2024.10.17 |
[Helm] Helm 패키지 생성하고 배포하기 (2) | 2024.10.07 |
[Jenkins] Jenkins Pipeline 구축 (기초부터 Blue/Green 배포까지) (0) | 2024.05.31 |