티스토리 뷰

카테고리 없음

ArgoCD란?

덕쑤 2020. 6. 18. 17:29

출처 : https://coffeewhale.com/kubernetes/gitops/argocd/2020/02/10/gitops-argocd/

 

GitOps와 ArgoCD

오늘은 GitOps가 무엇인가에 대해서 알아보고 그 구현체인 ArgoCD에 대해서 살펴보는 시간을 가져보겠습니다.

coffeewhale.com

GitOps의 구현체 ArgoCD

GitOps는 특정 소프트웨어나 프로덕트가 아닌 철학 혹은 방법론에 더 가깝습니다. GitOps에서 요구하는 원칙들은 다음과 같습니다.

1. 선언형 배포 작업 정의서

배포 방법이 명령형 방식으로 정의된 것이 아니라 배포된 상태가 어떤 모양을 가져야 할지 선언되어 있는 방식으로 정의가 되어 있어야 합니다. 이것은 사용자가 배포의 원하는 상태 (desired state)를 선언적으로 정의하였다는 것을 의미합니다. 이를 통해 Git 저장소에 단일 진실의 원천 조건을 만족할 수 있습니다. 배포 작업 정의서가 선언형으로 되어 있으면 더 쉽게 배포할 수 있으며 문제 발생시, 롤백하기도 쉽습니다. 또한 장애 등으로 인해 손상된 배포 환경을 자가 치유하기 유리합니다.

2. Git을 이용한 배포 버전 관리

Git에 모든 배포에 관련된 정보가 정의되어 있어야 하며, 각 버전이 Git 저장소에 기록이 되어 있어야 합니다. 이를 통해 사용자는 쉽게 예전 버전으로 롤백을 하거나 새로운 버전으로 업그레이드를 할 수 있게 됩니다.

3. 변경 사항 운영 반영 자동화

사용자는 Git 저장소에 선언형 정의서를 저장하게 되면 실제 배포가 일어나는 작업은 자동으로 이루어져야 합니다. 이것을 책임지는 주체가 ArgoCD와 같은 배포 주체(deploy operator)가 됩니다. 이를 통해 human error를 줄이고 지속적 빌드/배포를 가능하게 만듭니다.

4. 자가 치유 및 이상 탐지

사용자가 원하는 배포 상태 (desired state)를 작성하게 되면 실제 배포 환경이 그에 맞게 유지되고 있는지 책임지는 것 또한 배포 주체(deploy operator)가 됩니다. 배포를 관장하는 소프트웨어가 주체가 되어 현재 배포 상태를 확인하고 Git 저장소의 변경 사항 등이 없는지를 체크하여 운영 환경에 반영하는 역할을 합니다.

이러한 원칙들을 가지고 소프트웨어를 배포하는 모든 Agent를 우리는 GitOps의 구현체 (Deploy Operator)라 부를 수 있습니다. 현재 GitOps의 구현체로 ArgoCD 뿐만 아니라 Weaveworks flux, Codefresh, Jenkins X 등 다양한 소프트웨어들이 존재합니다.

이번 포스트에서는 ArgoCD에 대해서 설명 드립니다.

ArgoCD 설치하기

kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Ingress 설정 및 비밀번호 설정 등은 공식 홈페이지에서 참고 하시기 바랍니다.

https://argoproj.github.io/argo-cd/getting_started/

ArgoCD 둘러보기

ArgoCD를 설치하여 로그인하면 가장 먼저 볼 수 있는 화면은 아래와 같습니다. 지금까지 생성한 배포 App의 리스트를 보여주는 화면입니다. 새로운 배포를 관장하는 App을 생성해 보기 위해 New App 버튼을 눌러보겠습니다.

새로운 배포을 책임지는 App을 생성하는 화면입니다.

  • Application Name: App의 이름을 적습니다.
  • Project: 프로젝트를 선택하는 필드입니다. 쿠버네티스의 namespace와 비슷한 개념으로 여러 App을 논리적인 project로 구분하여 관리할 수 있습니다.
  • Sync Policy: Git 저장소의 변경 사항을 어떻게 sync할지 결정합니다. Auto는 자동으로 Git 저장소의 변경사항을 운영에 반영하고 Manual은 사용자가 버튼 클릭을 통해 직접 운영 반영을 해줘야 합니다.
  • Repository URL: ArgoCD가 바라볼 Git 저장소를 의미합니다.
  • Revision: Git의 어떤 revision (HEAD, master branch 등)을 바라 볼지 결정합니다.
  • Path: Git 저장소에서 어떤 디렉토리를 바라 볼지 결정합니다. (dot(.)인 경우 root path를, 디렉토리 이름을 적으면 해당 디렉토리의 배포 정의서만 tracking 합니다.)
  • Cluster: 쿠버네티스의 어느 클러스터에 배포할지를 결정합니다.
  • Namespace: 쿠버네티스 클러스터의 어느 네임스페이스에 배포할지를 결정합니다.
  • Directory Recurse: path아래의 디렉토리를 재귀적으로 모니터링하여 변경 사항을 반영합니다.

ArgoCD를 통한 운영 배포해보기

아래의 깃헙 레포지토리를 예시로 배포해 보겠습니다. 간단하게 nginx 컨테이너를 생성하고 서비스를 붙여주는 앱입니다.

GitOps repository 예시: https://github.com/hongkunyoo/gitops-argocd.git

apiVersion: apps/v1 kind: Deployment metadata: name: mynginx spec: replicas: 1 selector: matchLabels: run: mynginx template: metadata: labels: run: mynginx spec: containers: - image: nginx name: mynginx ports: - containerPort: 80

apiVersion: v1 kind: Service metadata: name: mynginx spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: run: mynginx

위와 같이 값을 설정해주고 Create 버튼을 클릭합니다.

SYNC 버튼을 눌러 ArgoCD가 변경 사항을 확인하여 단일원천의 진실에 따라 운영 환경을 그에 맞게 변경하도록 하겠습니다. 아래와 같이 Service 리소스와 nginx pod가 생성된 것을 UI로 확인하실 수 있습니다.

App Details 버튼을 누르거나 각 리소스UI를 클릭하시면 더 자세한 내용들을 직접 확인할 수 있습니다.

앞써 App을 설정할때 sync-policy를 manual 설정하였습니다. 아래에 Auto-Sync 버튼을 활성화하게 되면 Automatic이 되어 매번 사람이 직접 변경사항을 ArgoCD에게 알릴 필요 없이 ArgoCD가 주기적으로 Git 레포지터리의 변경사항을 확인하여 변경된 부분을 적용하게 됩니다. 이때 두가지 옵션을 추가적으로 줄 수 있습니다.

  • Prune Resources: 변경 사항에 따라 리소스를 업데이터할 때, 기존의 리소스를 삭제하고 새로운 리소스를 생성합니다. Job 리소스처럼 매번 새로운 작업을 실행해야 하는 경우 이 옵션을 사용합니다.
  • Self Heal: 해당 옵션을 활성화 시키면 ArgoCD가 지속적으로 git repository의 설정값과 운영 환경의 값의 싱크를 맞출려고 합니다. 기본적으로 5초마다 계속해서 sync를 시도하게 됩니다. (default timeout)

해당 예시에서는 Auto-sync만 활성화 시켜보겠습니다. 그런 다음, 이제 git repository의 deployment replica 값을 2로 고쳐서 push하게 되면 ArgoCD가 자동으로 변경한 값을 운영 환경에 반영하는지 확인해 보겠습니다.

apiVersion: apps/v1 kind: Deployment metadata: name: mynginx spec: replicas: 2 # <-- 기존 1에서 2로 수정 selector: matchLabels: run: mynginx template: metadata: labels: run: mynginx spec: containers: - image: nginx name: mynginx ports: - containerPort: 80

git commit -am "Change deployment replica to 2" git push origin master

아래 그래프와 같이 기존 1개 pod에서 2개로 늘어난 것을 확인할 수 있습니다.

 

 

 

 

CLI ArgoCD 설치 과정

kubernetes 클러스터에 설치

kubectl create namespace argocd

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml


argocd cli 설치

brew tap argoproj/tap 

brew install argoproj/tap/argocd


외부에서 접근하게 포트포워딩 설정(테스트 용으로 도메인 할당 필요)

kubectl port-forward svc/argocd-server -n argocd 8080:443

 

로그인

argocd login localhost:8080

username : admin

# 초기 password 는 pod 이름이기 때문에 다음 명령으로 확인할수 있다.

kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

# 비밀번호 변경

argocd account update-password


ingress 도메인 설정을 위한
https 용 인증서 설정하기

kubectl -n argocd create secret tls dev-9rum-cc --key key.pem --cert crt.pem


ingress 설정

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: argocd-server-ingress

  namespace: argocd

  annotations:

    kubernetes.io/ingress.class: nginx

    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

    nginx.ingress.kubernetes.io/ssl-passthrough: "true"

spec:

  tls:

  - hosts:

    - asdasd.com

    secretName: com

  rules:

  - host: asdasd.com

    http:

      paths:

      - backend:

          serviceName: argocd-server

          servicePort: https

위의 ingress 설정을 추가

kubectl apply -f argocd-ingress.yaml

인증서 설정하면 too many redirect 에러가 난다.

argocd에서 직접 인증서 처리하다가 발생하는 거라서 argocd-server의 실행 옵션에 —insecure를 추가해 주면 된다고 한다.
https://github.com/argoproj/argo-cd/issues/2953#issuecomment-602898868


아래 명령으로 argocd-server의 옵션을 변경한다.

kubectl -n argocd edit deploy argocd-server

 

ingress 노드가 여러개일때 접근할 수 있게 vip 생성하기

kind: Service

apiVersion: v1

metadata:

  name: ingress-node-vip

  namespace: ingress-nginx

  annotations:

    service.beta.kubernetes.io/load-balancer: "true"

spec:

  externalTrafficPolicy: Local

  selector:

    app.kubernetes.io/name: ingress-nginx

  type: LoadBalancer

  ports:

  - name: http

    port: 80

    targetPort: 80

  - name: https

    port: 443

    targetPort: 443

 

다음 명령으로 EXTERNAL-IP를 확인해서 도메인에 이 IP를 입력하면 됨.

kubectl get svc -n ingress-nginx

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE

ingress-node-vip   LoadBalancer   111.111.111.111   111.111.111.111    80:32496/TCP,443:30241/TCP   96m

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함