튜토리얼: Flux를 사용하여 OCI 아티팩트 배포하기

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

이 튜토리얼에서는 Kubernetes 매니페스트를 OCI 아티팩트로 패키징하고, Flux를 사용하여 클러스터에 배포하는 방법을 배웁니다. 샘플 매니페스트 프로젝트를 설정하고, 프로젝트의 컨테이너 레지스트리에 아티팩트를 저장하도록 구성하며, Flux가 아티팩트를 동기화하도록 구성합니다. 이 설정에서 Flux가 OCI 이미지에서 변경 사항을 가져오기 전에 GitLab 파이프라인에서 추가 단계를 실행할 수 있습니다.

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

Flux를 사용하여 OCI 아티팩트를 배포하려면:

  1. Kubernetes 매니페스트 리포지토리 만들기
  2. OCI 아티팩트를 생성하도록 매니페스트 리포지토리 구성하기
  3. 아티팩트를 동기화하도록 Flux 구성하기
  4. 구성 확인하기

사전 요구 사항:

  • 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-oci-tutorial
    

OCI 아티팩트를 생성하도록 매니페스트 리포지토리 구성하기

다음으로, GitLab CI/CD를 구성하여 매니페스트를 OCI 아티팩트로 패키징하고, 아티팩트를 GitLab 컨테이너 레지스트리에 푸시합니다:

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

    package:
      stage: deploy
      image:
        name: fluxcd/flux-cli:v2.0.0-rc.1
        entrypoint: [""]
      script:
        - mkdir -p manifests
        - kubectl kustomize ./src --output ./manifests
        - |
          flux push artifact oci://$CI_REGISTRY_IMAGE:latest \
            --path="./manifests" \
            --source="${CI_PROJECT_URL}.git" \
            --revision="$CI_COMMIT_SHORT_SHA" \
            --creds="$CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD" \
            --annotations="org.opencontainers.image.url=$CI_PROJECT_URL" \
            --annotations="org.opencontainers.image.title=$CI_PROJECT_NAME" \
            --annotations="com.gitlab.job.id=$CI_JOB_ID" \
            --annotations="com.gitlab.job.url=$CI_JOB_URL"
    

    파일이 GitLab에 푸시되면 단일 package 작업이 있는 CI/CD 파이프라인이 생성됩니다. 이 작업은:

    • kustomization.yaml을 사용하여 최종 Kubernetes 매니페스트를 렌더링합니다.
    • 매니페스트를 OCI 아티팩트로 패키징합니다.
    • OCI 아티팩트를 컨테이너 레지스트리에 푸시합니다.

    파이프라인이 완료된 후, 컨테이너 레지스트리 UI에서 OCI 아티팩트를 확인할 수 있습니다.

Flux를 구성하여 아티팩트를 동기화하세요

다음으로, web-app-manifests 리포지토리에서 생성된 아티팩트를 동기화하도록 Flux 리포지토리를 구성하세요.

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

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

    apiVersion: source.toolkit.fluxcd.io/v1beta2
    kind: OCIRepository
    metadata:
      name: web-app-manifests
      namespace: flux-system
    spec:
      interval: 1m0s
      url: oci://registry.gitlab.com/gitlab-org/configure/examples/flux/web-app-manifests-oci
      ref:
        tag: latest
    

    url을 여러분의 web-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: ./
      prune: true
      sourceRef:
        kind: OCIRepository
        name: web-app-manifests
      targetNamespace: default
    

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

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

구성을 확인하세요

클러스터에서 새로 생성된 nginx 포드를 볼 수 있어야 합니다.

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

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