본문 바로가기
kubernetes

kubernetes 에서 argocd 자동 배포 환경 구성

by misankim 2023. 3. 13.

쿠버네티스 관련 학습을 하다 유용한 CD(지속적인 배포)도구를 알게 되어 공유하고자합니다.

1. argocd 란

argocd 는 쿠버네티스용 CD 도구로 GitOps 방법론의 특성을 가지고 있습니다. GitOps 란 배포와 관련된 모든 구성 요소를 Git을 통해 코드로 관리한다는 의미를 가지고 있습니다. 이러한 GitOps 는 크게 1) 선언형 모델과 2) SSOT(single source of truth, 단일 진실 공급원)의 특징을 가집니다.

1) 선언형 모델

모든 구성 요소가 명령형 모델이 아닌 선언형 모델을 따릅니다. 여기서 명령형 모델이란 어떤 행위를 정의하는 것이라면, 선언형 모델은 어떤 상태를 정의하는 것입니다. 예를 들어 명령형 모델이 "웹 서버 컨테이너 2개를 생성해라"라면, 선언형 모델은 "웹 서버 컨테이너 2개를 유지해라"입니다. 이러한 선언형 모델은 쿠버네티스의 yaml 파일에서도 쉽게 찾아볼 수 있습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: web
  name: apache
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: apache
  replicas: 3 # -> 3개의 복제본을 유지해라
  template:
... 중략

2) SSOT(single source of truth, 단일 진실 공급원)

위와 같이 쿠버네티스에서의 모든 배포는 yaml 파일을 통해 이뤄집니다. 하지만 배포를 수행하는 개발자마다 각자의 PC에서 yaml 파일을 만들고, 수정하고, 배포를 수행한다면 문제가 발생했을 때, 어떤 yaml 파일의 어떤 부분이 문제인지 확인하는 데에 더 많은 시간과 노력이 필요합니다. 때문에 GitOps 방법론에서는 배포와 관련된 모든 코드를 Git 을 통해 관리하도록 하는 것입니다.

(참고) argocd 아키텍쳐
https://argoproj.github.io/argo-cd/

어려운 말로 설명했지만 쉽게 설명하면 git 저장소로 yaml 파일을 관리하고 설정에 따라 새로운 commit 발생하면 자동으로 배포하는 도구입니다.(자동/수동 배포 방식은 선택 사항)

2. argocd 배포

배포 방법은 굉장히 심플합니다. argocd 를 위한 네임스페이스를 별도로 생성하고 yaml 파일을 통해 배포합니다. 테스트 환경은 단일 EC2 인스턴스에 minikube로 구성된 쿠버네티스입니다.

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

모든 구성 요소들이 정상적으로 배포되어 사용 가능한 상태가 되었는지 확인합니다.

kubectl get all -n argocd

여기서 argocd-server 서비스의 경우 기본으로 ClusterIP 타입으로 생성됩니다. 때문에 클러스터 외부에서 웹을 통해 접속하려면 argocd-server 서비스의 타입을 외부에서 접속 가능한 타입인 NodePort 혹은 LoadBalancer 등으로 설정해줍니다. 공식 사이트에서는 argocd-server 서비스를 LoadBalancer 타입으로 설정하거나, 포트포워딩을 사용하거나, ingress를 설정하는 방식으로 설정하도록 안내하고 있습니다.

테스트 환경에서는 위의 여러 방법 중 ingress 를 생성하여 ingress-nginx 를 통해 접속하도록 설정했습니다.

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"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: 웹_접속에_사용할_도메인
    http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: https

설정한 도메인을 통해 접속 시 아래와 같이 로그인 페이지가 보여지면 됩니다.

3. argocd CLI 다운로드

또한 argocd 는 CLI 도구를 지원하기 때문에 바이너리 파일을 다운로드합니다.
초기 비밀번호 설정 등에 사용됩니다.

curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd

4. 초기 비밀번호 설정

argocd 를 사용하기 위한 기본 계정은 admin 이며, 비밀번호는 랜덤으로 부여됩니다. 웹 접속을 위해 초기 비밀번호를 확인하고 새로운 비밀번호를 설정합니다. 초기 비밀번호를 확인하고 변경하는 작업은 argocd CLI를 통해 진행합니다.

# 비밀번호 확인
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

# 로그인
argocd login 웹_접속에_사용할_도메인
-> 아이디와 비밀번호 입력

# 비밀번호 변경
argocd account update-password
-> 기존 비밀번호와 새 비밀번호 입력

admin 사용자와 CLI를 통해 변경한 비밀번호로 웹 콘솔에 로그인 해봅니다. 로그인이 완료되면 아래와 같이 페이지가 보여집니다.

5. github 레포지토리 생성

위에서 GitOps 방법론에 대해 소개하면서 배포와 관련된 모든 코드는 git을 통해 관리된다고 말씀드렸습니다. 때문에 테스트 앱에 사용할 쿠버네티스 yaml 파일을 업로드할 github 레포지토리를 생성하도록 하겠습니다. 자신의 레포지토리 목록으로 이동하여 New 버튼을 눌러 새 레포지토리를 생성합니다.

레포지토리의 이름은 생성할 쿠버네티스 앱의 이름으로 임의로 설정하고, 레포지토리를 공개할지 비공개로 할지 선택합니다. 설정이 완료되면 Create Repository 버튼을 눌러 레포지토리 생성을 완료합니다.

생성이 완료되면 아래와 같이 빈 레포지토리 페이지가 보입니다.

6. github 레포지토리에 yaml 파일 푸쉬

github 레포지토리를 클론합니다.

git clone https://github.com/premisan/bootcamp-app.git

아래와 같이 yaml 파일을 작성합니다.

# bootcamp-ns.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: bootcamp  
# bootcamp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: bootcamp
  name: deployment-bootcamp
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: bootcamp
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: bootcamp
    spec:
      containers:
      - image: gcr.io/google-samples/kubernetes-bootcamp:v1
        imagePullPolicy: Always
        name: bootcamp
        ports:
        - containerPort: 8080
# bootcamp-svc.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: bootcamp
  name: service-bootcamp
spec:
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: bootcamp
# bootcamp-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: bootcamp-ingress
  namespace: bootcamp
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: 
    http:
      paths:
        - path: /
          backend:
            serviceName: service-bootcamp
            servicePort: 8080

아래와 같이 4개 파일 모두 작성 후

git 명령어를 통해 커밋 후 레포지토리로 푸쉬합니다.

git add .
git commit -m '원하는_코멘트_입력'
git push -u origin master

정상적으로 yaml 파일이 푸쉬되면 아래와 같이 파일들이 보여집니다.

7. argocd 에 github 레포지토리 등록

공개 레포지토리라면 argocd 에서 별도로 레포지토리를 등록해주지 않더라도 바로 앱 생성이 가능하지만, 비공개 레포지토리의 경우 github 계정으로 로그인이 필요하기 때문에 argocd 에서 해당 레포지토리를 풀링하기 위해서는 먼저 argocd 에 인증 정보와 함께 레포지토리를 등록하는 작업을 선행합니다. 좌측 메뉴 바에서 톱늬바퀴 모양 설정 메뉴를 클릭하여 Repositories 메뉴를 선택합니다.

Connect Repo Using HTTPS 버튼을 클릭합니다.

github 레포 주소와 사용자 계정(이메일 형태)과 비밀번호를 입력합니다.

Connect 버튼을 눌러 마무리하면 아래와 같이 github 레포가 추가됩니다.

8. 앱 생성

이제 소스 코드와 github 레포 구성까지 완료되었으니 앱을 생성해봅니다. 먼저 좌측 메뉴 최상단의 Appications 메뉴로 이동하여 New App 버튼을 눌러 새 앱을 생성합니다.

Application name 과 Project 는 argocd 에서 앱을 구분하기 위해서 설정하는 값입니다. 적당한 이름으로 지정하고 프로젝트는 default로 지정해줍니다.

Sync Policy는 github 에서 소스 코드를 자동으로 풀링할 것인지 설정하는 것으로 수동으로 싱크하기 위해서는 Manual 로 선택합니다.(앱 생성 후 나중에 자동으로 변경도 가능합니다.)

Repository URL은 입력란을 클릭하면 전 단계에서 추가한 github 레포 주소가 보이기 때문에 선택해줍니다.

Revision은 해당 github 레포에서 어떤 브랜치를 풀링할지를 설정하는 값으로 현재 github 브랜치는 master 브랜치만 있기 때문에 master 를 입력해줍니다.

Path는 github의 해당 브랜치에서 어떤 경로를 풀링할지 설정하는 값으로 브랜치 최상위 경로를 풀링하려면 .(점)을 입력합니다.

Cluster URL은 해당 앱을 배포할 쿠버네티스 클러스터를 선택하는 값으로, 해당 입력란을 선택하면 "https://kubernetes.default.svc" URL이 입력되어 있는데 해당 주소는 argocd 가 배포된 쿠버네티스 클러스터를 의미합니다.

마지막으로 namespace는 앱을 배포할 쿠버네티스의 네임스페이스를 설정하는 값으로 bootcamp 로 입력해주겠습니다.

 

앱 생성이 완료되면 아래와 같이 생성한 앱이 보여집니다.

현재는 앱은 생성했지만 실제로 배포가 되지는 않은 상태입니다. 배포를 수행하기 위해서는 앱의 sync 버튼 -> synchronize 버튼을 눌러 배포를 수행합니다.

sync 가 완료되면 아래와 같이 상태가 보여지며,

앱을 클릭하여 상세 내용을 확인하면 아래와 같이 yaml 파일에 작성한 모든 구성 요소가 아래와 같이 보여집니다.

yaml 소스 코드가 수정된 뒤에 새 커밋으로 github에 푸쉬된 경우 다시 sync 버튼을 눌러 배포를 진행합니다.

9. 자동 sync 설정

이전 앱 생성 단계에서 자동 싱크를 설정해도 되지만 위에서는 수동으로 배포하는 방법을 보여드리기 위해 수동 sync로 생성해봤습니다. 이제 앱의 자동 sync 관련 설정을 활성화해주도록 하겠습니다. 자동 sync를 활성화하는 경우 3분마다 github 소스 코드를 풀링하여 변경사항이 있는 경우 자동으로 배포합니다.

App Details 버튼을 눌러 앱의 상세 설정을 확인하는 페이지가 나타나면 아래로 스크롤하여 Sync Policy 부분으로 이동합니다. Enable Auto-Sync 버튼을 눌러 자동 sync 를 활성화해주고, 활성화 후 나타나는 추가 옵션인 PRUNE RESOURCES(이전 배포로 생성된 리소스가 배포에는 없는 경우 자동으로 정리할지 설정하는 옵션), SELF HEAL(클러스터의 상태가 yaml 파일과 달라졌을 때 자동으로 yaml 파일의 구성 정보로 변경하도록 설정하는 옵션) 옵션을 필요에 따라 활성화합니다.

 

자동 sync를 활성화했으니 이제 yaml 소스 코드의 변경 사항을 발생시켜봅니다.

# bootcamp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: bootcamp
  name: deployment-bootcamp
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: bootcamp
  replicas: 3 # 포드 복제본의 수를 변경
  template:
    metadata:
      labels:
        app.kubernetes.io/name: bootcamp
    spec:
      containers:
      - image: gcr.io/google-samples/kubernetes-bootcamp:v1
        imagePullPolicy: Always
        name: bootcamp
        ports:
        - containerPort: 8080

수정을 완료한 뒤, 코드를 커밋하고 github 레포에 푸쉬합니다. 잠시 후 github 레포의 변경 사항을 풀링하여 yaml 파일에 설정한 replicas 값에 따라 포드의 수가 3개로 증가한 것을 확인할 수 있습니다.

이렇게 앱 자동 sync 까지 마무리했습니다.

10. 마치며

위에서 소개한 것 외에도 github 푸쉬 발생 시 좀 더 빠르게 배포를 진행할 수 있도록 github 설정을 통해 웹훅을 구성하는 등의 방법도 있습니다. 구체적인 내용은 공식 가이드를 참고 부탁드립니다.

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

jenkins 와 같은 빌드 기능이 통합된 CI 도구와 argocd 를 함께 사용한다면 효과적으로 쿠버네티스에서 CI/CD 환경을 구성할 수 있을 것으로 생각됩니다.

'kubernetes' 카테고리의 다른 글

kops k8s 클러스터 관리도구  (0) 2023.04.10
k3s  (0) 2023.04.10
k8s HA 구성과 kubespray를 통한 클러스터 배포  (1) 2023.03.12
istio traffic management  (0) 2023.03.10
k8s network policy  (0) 2023.03.10