GitLab CI, Argo CD를 이용한 쿠버네티스 CI/CD 구축 개념

GitLab CI를 이용한 CI 자동화

GitLab에 소스 코드를 Push하면 GitLab CI 파이프라인을 실행하여 애플리케이션 빌드 및 테스트를 수행하고 Docker 이미지를 자동 생성합니다.

생성된 Docker 이미지는 AWS ECR에 Push하여 저장하도록 합니다.

GitLab CI를 이용해서 새로운 Docker 이미지가 생성되면,
Deployment 매니페스트의 이미지 태그를 새로운 버전으로 변경하고
해당 변경사항을 Git 저장소에 반영하도록 구성할 수 있습니다.


쿠버네티스 배포 환경 구성

GitLab CI 파이프라인에서 Git Push를 트리거로 Docker 이미지를 빌드해 AWS ECR에 Push하면,
쿠버네티스 Deployment가 ECR 이미지를 사용하는 Pod를 배포할 수 있도록 환경을 구성해 보겠습니다.

로컬 Docker AWS ECR 로그인

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin AWS계정ID.dkr.ecr.ap-northeast-2.amazonaws.com

로컬 PC 도커가 AWS ECR Private 레지스트리에 접근할 수 있도록 인증합니다.

미니큐브 ECR 인증 정보 설정

minikube addons configure registry-creds

미니큐브 내부 쿠버네티스가 AWS ECR의 Private 이미지를 가져올 수 있도록 인증 정보를 설정합니다.

Do you want to enable AWS Elastic Container Registry? [y/n]:

위와 같이 AWS ECR 인증 기능을 사용할 것인지 묻는 질문이 나오면 y를 입력하고,
AWS API에 접근할 때 사용하는 Access Key ID, AWS Secret Access Key를 차례로 입력합니다.

(Optional) Enter AWS Session Token:

일반적인 IAM Access Key를 사용하는 경우 엔터를 눌러 넘어갑니다.
임시 자격 증명 사용 시에는 Session Token을 입력합니다.

Enter AWS Region:

ap-northeast-2 (서울 리전) 을 입력합니다.

Enter 12 digit AWS Account ID (Comma separated list):

AWS 계정 ID 12자리를 입력합니다.

(Optional) Enter ARN of AWS role to assume:

AWS Role을 별도로 Assume하지 않는 경우, 엔터를 눌러 넘어갑니다.

Do you want to enable Google Container Registry? [y/n]:
Do you want to enable Docker Registry? [y/n]:
Do you want to enable Azure Container Registry? [y/n]:

AWS ECR만 사용하는 경우, 다른 Registry 항목에는 모두 n을 입력합니다.

애드온 활성화

minikube addons enable registry-creds

인증 정보를 설정한 registry-creds 애드온을 활성화합니다.

쿠버네티스 deployment 매니페스트 파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: 애플리케이션명 # Deployment 이름 (생성되는 pod 이름 프리픽스)
  labels:
    app: 애플리케이션명 # Deployment 자체 라벨

spec:
  replicas: 3 # 유지할 pod 개수 (파드가 삭제되면 Deployment가 자동 생성하여 지정한 개수를 유지)
  selector:
    matchLabels:
      app: 애플리케이션명 # Deployment가 관리할 Pod 라벨

  template:
    metadata:
      labels:
        app: 애플리케이션명 # 생성되는 Pod에 붙이는 라벨 (Deployment/Service selector와 매칭 필요)

    spec:
      containers:
        - name: 애플리케이션명
          image: 이미지명 (ECR URI 주소)
          ports:
            - containerPort: 3000

          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"

            limits:
              cpu: "200m"
              memory: "256Mi"

프로젝트폴더경로에 k8s 폴더를 만들고, deployment.yaml 파일을 생성합니다.
Deployment가 생성하는 Pod에서 사용할 컨테이너 이미지로 AWS ECR의 이미지 URI를 지정합니다.

Pod가 생성될 때 쿠버네티스 큐블렛이 컨테이너 런타임에 컨테이너 실행을 요청하고,
필요한 경우 컨테이너 런타임이 이미지를 Pull하여 컨테이너를 실행합니다.

쿠버네티스에 애플리케이션 배포 테스트

kubectl apply -f /프로젝트폴더경로/k8s/deployment.yaml

deployment.yaml에 정의한 Deployment 설정을 Kubernetes 클러스터에 적용합니다.

Deployment가 지정한 수의 Pod를 생성하고 지속적으로 관리하며,
Deployment에 지정한 이미지를 기반으로 Pod 내부에서 컨테이너가 실행됩니다.


Argo CD를 이용한 GitOps CD 자동화

GitLab 등 Git 저장소에 Kubernetes Deployment 매니페스트 파일을 저장하여 관리합니다.

Argo CD를 연동하고 Auto-Sync 기능을 활성화하면,
Git 저장소의 Deployment 매니페스트 변경사항을 감지하여
Kubernetes 클러스터에 자동으로 배포할 수 있습니다.