[3주차] CHAPTER-15 ArgoCD 를 활용한 GitOps
이정훈님이 집필하신 "24단계 실습으로 정복하는 쿠버네티스" 로 진행하는 CloudNet@ 팀의 PKOS 3주차 정리입니다.
✔ Continuous Delivery ? 소스코드를 변경하고 저장소에 push하면 변경 사항이 운영환경에도 자동 반영
✔ GitOps ? 실제 운영 중인 클러스터 상태를 아무런 기록을 남기지 않고 클러스터에서 임의로 수정하지 않고 공용으로 관리하는 저장소에서만 변경을 허용
✔ ArgoCD ? 쿠버네티스 manifest 소스 파일을 중앙의 통합 저장소에 업로드하고 동기화하여 정책 관리
✅ Helm 차트를 이용한 ArgoCD 설치
https://artifacthub.io/packages/helm/argo/argo-cd
argo-cd 5.27.1 · argoproj/argo
A Helm chart for Argo CD, a declarative, GitOps continuous delivery tool for Kubernetes.
artifacthub.io
✔ GitLab 저장소와 연동하기 위해 GitLab 저장소의 도메인과 IP를 ArgoCD 설치 전 Helm 차트 변수 파일에 포함
✔ 설치 완료되면 쿠버네티스 클러스터 와 저장소를 ArgoCD 설정 파일에 등록
🧿 ArgoCD Helm 리포를 추가하고 차트를 다운받아 압축을 풀어줍니다.
🧿 Helm 템플릿 변수 파일을 편집합니다.
# -- Mapping between IP and hostnames that will be injected as entries in the pod's hosts files
hostAliases:
- ip: 192.168.219.74
hostnames:
- gitlab.gitlab.io
## Server service configuration
service:
# -- Server service annotations
annotations: {}
# -- Server service labels
labels: {}
# -- Server service type
type: LoadBalancer
✔ hostAliases : - ip: 192.168.219.74
◾ GitLab 저장소의 LoadBalancer External IP 와 도메인 등록
✔ type: LoadBalancer
◾ ArgoCD 서비스 타입을 LoadBalancer로 외부에 노출
🧿 ArgoCD 네임스페이스를 생성하고 설치합니다.
✔ argocd-application-controller
◾ 실행중인 쿠버네티스 애플리케이션의 설정과 GitLab 저장소의 소스 파일에 선언된 상태를 비교
◾ 현재 운영중인 상태가 저장소의 소스에 선언된 상태와 다르면 'OutOfSync' 에러 발생
✔ argocd-dex-server
◾ 외부 사용자의 LDAP 인증에 Dex 서버 사용 가능
✔ argocd-repo-server
◾ 원격 저장소의 소스코드를 ArgoCD 의 내부 Cache 서버에 저장
🧿 외부 접속용 External IP 확인 후 웹 접속합니다.
🧿 ArgoCD 최초 접속용 패스워드를 Secret 형식으로 무작위 생성하고 확인합니다.
kubectl -n argocd get secrets argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
🧿 argocd 커맨드라인 도구를 설치합니다.
https://argo-cd.readthedocs.io/en/stable/cli_installation/
Installation - Argo CD - Declarative GitOps CD for Kubernetes
Installation You can download the latest Argo CD version from the latest release page of this repository, which will include the argocd CLI. Linux and WSL ArchLinux Homebrew Download With Curl Download latest version curl -sSL -o argocd-linux-amd64 https:/
argo-cd.readthedocs.io
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
✔ argocd app
◾ 쿠버네티스 애플리케이션 동기화 상태 확인
✔ argocd context
◾ 복수의 클러스터 등록, 선택
✔ argocd login
◾ ArgoCD 서버에 로그인
✔ argocd repo
◾ 원격 깃 저장소 등록, 현황 파악
🧿 원격 깃 저장소 등록을 위해 ArgoCD 서버에 로그인 합니다.
🧿 GitLab 의 프로젝트 URL을 ArgoCD 의 깃 리포지토리로 등록합니다.
🧿 전테 클러스터 현황을 확인합니다.
✔ 기본적으로 ArgoCD는 설치된 쿠버네티스 클러스터가 타깃 클러스터로 등록됩니다.
✅ ArgoCD 를 이용한 RabbitMQ Helm 배포
✔ Helm 차트를 이용하면 Helm 차트를 깃 저장소에 업로드하고 해당 디렉터리의 경로 정보를 ArgoCD의 application CRD에 등록해서 애플리케이션을 배포할 수 있습니다.
🧿 로컬 GitLab 저장소와 동기화한 디렉터리로 이동한 후 원격 오리진 서버정보를 확인합니다.
🧿 RabbitMQ Helm 차트를 다운받고 압축을 푼 후 설치를 진행합니다.
https://artifacthub.io/packages/helm/bitnami/rabbitmq
rabbitmq 11.12.0 · bitnami/bitnami
RabbitMQ is an open source general-purpose message broker that is designed for consistent, highly-available messaging scenarios (both synchronous and asynchronous).
artifacthub.io
✔ ArgoCD 는 Application CRD 매니페스트를 이용해 쿠버네티스 애플리케이션을 배포합니다.
✔ application CRD의 YAML 파일 형식에 맞게 애플리케이션 등록 => YAML 파일 실행 => ArgoCD에 애플리케이션 배포
🧿 CRD 목록을 확인합니다.
🧿 ArgoCD의 appication YAML 파일을 작성합니다.
✔ rabbitmq-helm-argo-application.yml
https://raw.githubusercontent.com/wikibook/kubepractice/main/ch15/rabbitmq-helm-argo-application.yml
✔ metadata: namespace: argocd
◾ 단일 네임스페이스에서 ArgoCD 로 설치된 전체 application 목록을 관리
✔ destination: namespace: rabbitmq
◾ application 이 설치되는 namespace
✔ server: https://kubernets.default.svc
◾ application 이 배포될 쿠버네티스 클러스터 정보
◾ ArgoCD가 설치되어 있는 클러스터는 별도의 추가 없이 기본설정으로 지정 가능
◾ 외부 클러스터를 추가 => 쿠버네티스 컨피그파일 ( {HOME}/.kube/config )에 외부 클러스터 설정을 추가
✔ project: default
◾ ArgoCD 프로젝트로 Application CRD 를 관리, 프로젝트는 Application 목록을 포함
✔ repoURL: https://gitlab.gitlab.io/ssoon/test-stg.git
◾ 깃 저장소의 URL 입력
✔ path: rabbitmq-10.1.8
◾ ArgoCD 를 이용해서 배포할 애플리케이션 의 깃 리포지토리 경로.
◾ 해당 경로에 위치한 쿠버네티스 manifest 파일을 이용 appication 을 설치합니다.
✔ valueFiles: - my-values.yaml
◾ 기본Helm 템플릿(values.yaml)이 아닌 사용자 지정 템플릿을 사용할 경우 해당 파일명을 명시
✔ syncOptions: -CreateNamespace=true
◾ 애플리케이션을 배포할 네임스페이스가 없는 경우 배포시 함께 생성
🧿 YAML 파일을 적용하여 ArgoCD application CRD 를 생성합니다.
🧿 ArgoCD 웹페이지에서 rabbitmq-helm 애플리케이션을 확인할 수 있습니다.
🧿 "SYNC" 를 클릭하여 동기화 작업을 실행합니다.
✅ 클러스터 설정 내역 변경, 깃 저장소 자동 반영
✔ 아파치 웹서버를 설치하는 Deployment YAML
https://raw.githubusercontent.com/wikibook/kubepractice/main/ch15/httpd-deploy.yml
✔ 아파치 웹서버와 연결하는 NodePort 서비스 YAML
https://raw.githubusercontent.com/wikibook/kubepractice/main/ch15/httpd-nodeport-svc.yml
🧿 YAML 파일을 GitLab 저장소에 업로드합니다.
🧿 두 파일을 ArgoCD의 Application CRD를 이용해 쿠버네티스 클러스터와 동기화 합니다.
✔ path: 03.httpd
◾ 아파치 웹서버 YAML 파일이 저장된 GitLab 저장소의 디렉터리 위치
✔ directory: recurse: true
◾ 일반 deployment 및 서비스 YAML 파일이므로 ArgoCD 에 directory로 지정,
◾ recurse 옵션은 하위 디렉터리까지 배포한다는 의미
✔ automated: prune: true
◾ 깃 저장소에 업로드되면 자공으로 애플리케이션 설치 작업 시작
◾ 오브젝트를 삭제하면 클러스터에서도 함께 삭제
🧿 ArgoCD Application CRD 을 적용하여 쿠버네티스 오브젝트를 생성합니다.
🧿 실행중인 deployment 상태를 "k edit" 명령어로 httpd 이미지 버전을 htppd => httpd:alpine으로 변경합니다.
🧿 이전 버전 httpd 을 사용하던 Pod는 삭제되고 변경된 버전의 httpd:alpine 의 Pod가 생성됩니다.
🧿 깃 소스와 실행 중인 deployment 의 이미지 버전이 달라 OutOfSync 상태입니다.
🧿 메뉴에서 "APP DIFF" 을 선택하면 차이점을 확인할 수 있습니다.
🧿 httpd-svc 오브젝트를 삭제합니다.
📢 임의로 현재 클러스터 상태를 변경하면 ArgoCD의 argocd-application-controller 파드가 webhook 방식으로 차이를 감지하여 자동으로 변경사항을 알려줍니다.
🧿 "SYNC" 선택하여 동기화 합니다.
📢 SYNC 를 실행하면 ArgoCD가 자동으로 깃 저장소의 YAML 파일 기준으로 쿠버네티스 오브젝트를 동기화 합니다.
🧿 SYNC 후 GitLab 저장소 기준으로 삭제했던 httpd-svc 오브젝트가 다시 생성되고, image 버전도 기존의 httpd로 변경되었습니다.
📢 현재 클러스터 상태와 깃 저장소의 상태를 확인해 변경이 발생한 경우 해당 변경 내역를 확인해 필요한 경우 기존 깃 저장소의 상태로 편리하게 원복할 수 있습니다.
🧿 nodePort 를 30180 => 30200 으로 변경후 GitLab 저장소에 push 합니다.
🧿 REFRESH 를 선택하면 GitLab 저장소의 소스코드의 변경을 인식하여 OutOfSync 를 확인할 수 있으며 SYNC 를 클릭하면 동기화 되어 GitLab 저장소의 소스코드의 변경사항을 적용합니다.
🧿 httpd-svc 의 nodeport가 30200으로 변경된것을 확인할 수 있습니다.