튜토리얼: Flux를 사용하여 Git 리포지터리 배포하기

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

이 튜토리얼에서는 Flux를 사용하여 쿠버네티스 클러스터에 애플리케이션을 빌드하고 배포하는 GitLab 프로젝트를 생성합니다. 샘플 매니페스트 프로젝트를 설정하고 매니페스트를 배포 브랜치로 푸시하도록 구성하고 Flux를 배포 브랜치와 동기화하도록 구성합니다. 이렇게 설정하면 리포지터리에서 변경 사항을 Flux가 가져가기 전에 GitLab 파이프라인에서 추가 단계를 실행할 수 있습니다.

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

GitOps 배포를 위한 리포지터리 설정:

  1. 쿠버네티스 매니페스트 리포지터리 생성
  2. 배포 브랜치 생성
  3. GitLab CI/CD를 브랜치로 푸시하도록 구성
  4. Flux를 매니페스트와 동기화하도록 구성
  5. 구성 확인

사전 준비 사항:

  • 쿠버네티스 클러스터에 연결된 Flux 리포지터리가 있어야 합니다. 처음부터 시작하는 경우 GitOps를 위한 Flux 설정을 참조하세요.

쿠버네티스 매니페스트 리포지터리 생성

먼저, 쿠버네티스 매니페스트용 리포지터리를 생성합니다:

  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
    

배포 브랜치 생성

다음으로, 현재 클러스터 상태를 반영하는 브랜치를 생성합니다.

이 워크플로우에서는 기본 브랜치가 애플리케이션의 진실된 유일한 원본입니다. 쿠버네티스 클러스터에 반영되기 위해 코드 또는 구성 변경은 기본 브랜치에 존재해야 합니다. 나중에 CI/CD를 통해 기본 브랜치에서 배포 브랜치로 변경을 Merge할 수 있도록 구성할 것입니다.

배포 브랜치 생성 방법은 다음과 같습니다:

  1. web-app-manifests에서 기본 브랜치로부터 _gitlab/deploy/example이라는 배포 브랜치를 생성합니다. 이 예제에서의 브랜치 이름은 배포 브랜치를 기능 브랜치와 구분하기 위해 선택되었지만 필수는 아닙니다. 배포 브랜치의 이름은 마음대로 지을 수 있습니다.
  2. write_repository 스코프를 가진 프로젝트, 그룹, 또는 개인 액세스 토큰을 생성합니다.
  3. DEPLOYMENT_TOKEN이라는 토큰 값으로 CI/CD 변수를 만듭니다. 값이 작업 로그에 표시되지 않도록 mask를 반드시 적용하세요.
  4. 다음과 같은 값을 가진 배포 브랜치를 보호하는 규칙을 추가합니다:

    • Merge 허용: 아무도 아님.
    • 푸시 및 Merge 허용: 이전 단계에서 생성한 토큰을 선택하거나 개인 액세스 토큰을 생성한 경우 사용자를 선택하세요.
    • 강제 푸시 허용: 토글을 끄세요.
    • 코드 소유자의 승인 필요: 토글을 끄세요.

    이 구성을 통해 해당 토큰만 브랜치로 푸시할 수 있도록 보장됩니다.

리포지터리와 보호된 배포 브랜치를 성공적으로 생성했습니다!

GitLab CI/CD를 브랜치로 푸시하도록 구성

다음으로, CI/CD를 사용하여 기본 브랜치에서 배포 브랜치로 변경을 Merge하도록 구성합니다.

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. 기본 브랜치에서의 새 변경 사항을 배포 브랜치로 Merge합니다.
  3. 구성된 토큰으로 변경 사항을 리포지터리에 푸시합니다.

Flux를 매니페스트와 동기화하도록 구성

다음으로, Flux 리포지터리를 구성하여 web-app-manifests 리포지터리의 배포 브랜치를 동기화합니다.

구성을 위해 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 파일에서 레플리카 수를 업데이트하고 기본 브랜치로 푸시해보세요. 모든 것이 잘 작동하면 변경 사항이 파이프라인을 완료하고 나면 클러스터에 동기화됩니다.

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