튜토리얼: Flux를 사용하여 Git 저장소 배포하기

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

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

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

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

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

전제 조건:

  • Kubernetes 클러스터에 연결된 Flux 저장소가 있어야 합니다. 처음부터 시작하는 경우 GitOps를 위한 Flux 설정을 참조하십시오.

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를 구성하여 Manifest를 동기화합니다

다음으로, 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가 레지스트리에서 가져온 artifact에 있는 Manifest를 동기화하도록 하는 Kustomization 리소스를 추가합니다.

  3. 새 파일을 커밋하고 푸시하세요.

구성 확인하기

파이프라인이 완료된 후에는 클러스터에 새로 생성된 nginx 파드가 보여야 합니다.

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

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