Ssoon

[3주차] CHAPTER-15 ArgoCD 를 활용한 GitOps 본문

Production Kubernetes Online Study

[3주차] CHAPTER-15 ArgoCD 를 활용한 GitOps

구구달스 2023. 3. 23. 02:52

 

이정훈님이 집필하신 "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으로 변경된것을 확인할 수 있습니다.

Comments