자습서: Flux를 사용하여 Git 저장소 배포하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

이 자습서에서는 Flux를 사용하여 Kubernetes 클러스터에 애플리케이션을 빌드하고 배포하는 GitLab 프로젝트를 생성합니다. 샘플 매니페스트 프로젝트를 설정하고, 매니페스트를 배포 브랜치로 푸시하도록 구성하며, Flux가 배포 브랜치를 동기화하도록 설정합니다. 이 설정을 통해 Flux가 저장소에서 변경 사항을 가져오기 전에 GitLab 파이프라인에서 추가 단계를 실행할 수 있습니다.

이 자습서는 공개 프로젝트에서 애플리케이션을 배포합니다. 비공식 프로젝트를 추가하려면 프로젝트 배포 토큰을 생성해야 합니다.

GitOps 배포를 위한 저장소를 설정하려면:

  1. Kubernetes 매니페스트 저장소 만들기
  2. 배포 브랜치 만들기
  3. GitLab CI/CD를 구성하여 브랜치에 푸시하기
  4. Flux를 구성하여 매니페스트 동기화하기
  5. 구성 확인하기

사전 요구 사항:

Kubernetes 매니페스트 저장소 만들기

먼저, Kubernetes 매니페스트를 위한 저장소를 생성합니다:

  1. GitLab에서 web-app-manifests라는 새 저장소를 생성합니다.

  2. web-app-manifests에 다음 내용을 가진 src/nginx-deployment.yaml이라는 이름의 파일을 추가합니다:

    apiVersion: apps/v1  
    kind: Deployment  
    metadata:  
      name: nginx  
    spec:  
      replicas: 1  
      template:  
        spec:  
          containers:  
          - name: nginx  
            image: nginx:1.14.2  
            ports:  
            - containerPort: 80  
    
  3. web-app-manifests에 다음 내용을 가진 src/kustomization.yaml이라는 이름의 파일을 추가합니다:

    apiVersion: kustomize.config.k8s.io/v1beta1  
    kind: Kustomization  
    resources:  
      - nginx-deployment.yaml  
    commonLabels:  
      app: flux-branches-tutorial  
    

배포 브랜치 만들기

다음으로 클러스터의 현재 상태를 반영하는 브랜치를 만듭니다.

이 워크플로우에서 기본 브랜치는 애플리케이션의 진실한 단일 소스입니다.
Kubernetes 클러스터에 반영되려면 코드나 구성 변경 사항이 기본 브랜치에 존재해야 합니다.
나중 단계에서 CI/CD를 구성하여 기본 브랜치에서 배포 브랜치로 변경 사항을 병합합니다.

배포 브랜치를 만들려면:

  1. web-app-manifests에서 기본 브랜치에서 _gitlab/deploy/example이라는 이름의 브랜치를 생성합니다. 이 예에서는 배포 브랜치를 기능 브랜치와 구분하기 위해 브랜치 이름을 선택했지만, 이는 필수가 아닙니다. 원하는 대로 배포 브랜치 이름을 지정할 수 있습니다.

  2. write_repository 범위가 있는 프로젝트,
    그룹 또는
    개인 접근 토큰을 생성합니다.

  3. 토큰 값이 DEPLOYMENT_TOKEN이라는 이름을 가진 CI/CD 변수를 생성합니다.
    값이 작업 로그에 표시되지 않도록 마스킹하는 것을 잊지 마세요.

  4. 다음 값으로 보호된 배포 브랜치에 대한 규칙을 추가합니다:

    • 병합 허용: 없음.
    • 푸시 및 병합 허용: 이전 단계에서 생성한 토큰 또는 개인 접근 토큰을 생성한 경우 사용자 선택.
    • 강제 푸시 허용: 토글을 끕니다.
    • 코드 소유자로부터 승인 요구: 토글을 끕니다.

이 구성은 해당 토큰만 브랜치에 푸시할 수 있도록 보장합니다.

보호된 배포 브랜치가 있는 저장소를 성공적으로 생성했습니다!

GitLab CI/CD를 구성하여 브랜치에 푸시하기

다음으로, CI/CD를 구성하여 기본 브랜치의 변경 사항을 배포 브랜치로 병합합니다.

web-app-manifests의 루트에서 다음 내용을 가진 .gitlab-ci.yml 파일을 생성하고 푸시합니다:

   deploy:
     stage: deploy
     environment: production
     variables:
       DEPLOYMENT_BRANCH: _gitlab/deploy/example
     script:
       - |
         git config user.name "Deploy Example Bot"
         git config user.email "test@example.com"
         git fetch origin $DEPLOYMENT_BRANCH
         git checkout $DEPLOYMENT_BRANCH
         git merge $CI_COMMIT_SHA --ff-only
         git push https://deploy:$DEPLOYMENT_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:$DEPLOYMENT_BRANCH
     resource_group: $CI_ENVIRONMENT_SLUG

이렇게 하면 단일 deploy 작업을 가진 CI/CD 파이프라인이 생성됩니다:

  1. 배포 브랜치를 체크아웃합니다.

  2. 기본 브랜치의 새로운 변경 사항을 배포 브랜치에 병합합니다.

  3. 구성된 토큰으로 변경 사항을 리포지토리에 푸시합니다.

Flux를 구성하여 매니페스트 동기화하기

다음으로, web-app-manifests 리포지토리에서 배포 브랜치를 동기화하도록 Flux 리포지토리를 구성합니다.

구성을 위해 GitRepository 리소스를 생성합니다:

  1. Flux 리포지토리의 로컬 클론에서 clusters/my-cluster/web-app-manifests-source.yaml이라는 이름의 파일을 추가하고 다음 내용을 작성합니다:

    apiVersion: source.toolkit.fluxcd.io/v1
    kind: GitRepository
    metadata:
      name: web-app-manifests
      namespace: flux-system
    spec:
      interval: 5m0s
      url: https://gitlab.com/gitlab-org/configure/examples/flux/web-app-manifests-branches
      ref:
        branch: _gitlab/deploy/example
    

    urlweb-app-manifests 프로젝트의 URL로 대체해야 합니다.

  2. Flux 리포지토리의 로컬 클론에서 clusters/my-cluster/web-app-manifests-kustomization.yaml이라는 이름의 파일을 추가하고 다음 내용을 작성합니다:

    apiVersion: kustomize.toolkit.fluxcd.io/v1
    kind: Kustomization
    metadata:
      name: nginx-source-kustomization
      namespace: flux-system
    spec:
      interval: 1m0s
      path: ./src
      prune: true
      sourceRef:
        kind: GitRepository
        name: web-app-manifests
      targetNamespace: default
    

    이 파일은 Flux에 레지스트리에서 가져온 아티팩트의 매니페스트를 동기화하라고 지시하는 Kustomization 리소스를 추가합니다.

  3. 새 파일을 커밋하고 푸시합니다.

구성 확인하기

파이프라인이 완료되면 클러스터에서 새로 생성된 nginx 파드를 볼 수 있어야 합니다.

배포 동기화를 다시 보고 싶다면, src/nginx-deployment.yaml 파일에서 복제본 수를 업데이트하고 기본 브랜치에 푸시해 보세요. 모든 것이 잘 작동하면, 변경 사항이 파이프라인이 완료될 때 클러스터에 동기화됩니다.

축하합니다! 애플리케이션을 배포하고 변경 사항을 동기화하도록 프로젝트를 성공적으로 구성했습니다!