튜토리얼: Flux를 사용하여 Git 리포지터리 배포
이 튜토리얼에서는 Flux를 사용하여 Kubernetes 클러스터에 응용 프로그램을 빌드하고 배포하는 GitLab 프로젝트를 생성합니다. 샘플 manifest 프로젝트를 설정하고 manifest를 배포 브랜치로 푸시하도록 구성하고, Flux를 구성하여 배포 브랜치를 동기화합니다. 이 설정으로 GitLab 파이프라인에서 Flux가 변경 사항을 반영하기 전에 GitLab 파이프라인에서 추가 단계를 실행할 수 있습니다.
이 튜토리얼은 공개 프로젝트에서 응용 프로그램을 배포합니다. 비공개 프로젝트를 추가하려면 프로젝트 배포 토큰을 생성해야 합니다.
GitOps 배포용 리포지터리를 설정하려면:
필수 조건:
- Kubernetes 클러스터에 연결된 Flux 리포지터리가 있어야 합니다. 처음부터 시작하는 경우 GitOps를 위한 Flux 설정을 참조하십시오.
Kubernetes manifest 리포지터리 생성
먼저 Kubernetes manifest용 리포지터리를 생성합니다.
- GitLab에서
web-app-manifests
라는 새 리포지터리를 생성합니다. -
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
-
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를 구성하여 기본 브랜치에서 배포 브랜치로 변경을 Merge합니다.
배포 브랜치를 생성하려면:
-
web-app-manifests
에서 기본 브랜치에서_gitlab/deploy/example
이라는 브랜치를 생성합니다. 이 예제에서 사용된 브랜치 이름은 배포 브랜치를 기능 브랜치와 구분하기 위한 것이지만 필수는 아닙니다. 배포 브랜치의 이름은 원하는 대로 지정할 수 있습니다. -
write_repository
범위를 가진 프로젝트, 그룹 또는 개인 액세스 토큰을 생성합니다. -
DEPLOYMENT_TOKEN
이라는 토큰 값을 가진 CI/CD 변수를 생성합니다. 이 값을 job 로그에 표시되지 않도록 마스킹하는 것을 잊지 마십시오. -
다음 값으로 보호 정책을 설정합니다:
- 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 파이프라인이 생성되며 해당 작업은 다음을 수행합니다:
- 배포 브랜치를 체크아웃합니다.
- 기본 브랜치에서의 새로운 변경을 배포 브랜치로 Merge합니다.
- 변경 사항을 구성된 토큰을 사용하여 리포지터리에 푸시합니다.
Flux를 구성하여 manifest를 동기화
이제 Flux 리포지터리를 구성하여 web-app-manifests
리포지터리의 배포 브랜치를 동기화합니다.
구성하려면 GitRepository
리소스를 생성합니다:
-
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
url
을web-app-manifests
프로젝트의 URL로 대체해야 합니다. -
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 리소스를 추가합니다.
-
새 파일을 커밋하고 푸시합니다.
구성 확인
파이프라인이 완료되면 클러스터에 새로 생성된 nginx
파드가 표시됩니다.
배포를 다시 동기화하려면 src/nginx-deployment.yaml
파일의 레플리카 수를 업데이트하고 기본 브랜치에 푸시해 보세요. 모든 것이 잘 작동한다면, 변경 사항은 파이프라인이 완료될 때 클러스터에 동기화될 것입니다.
축하합니다! 애플리케이션을 배포하고 변경 사항을 동기화하기 위한 프로젝트 구성을 성공적으로 완료하셨습니다!