사용 방법 : Flux를 사용하여 OCI artifact 배포하기

Tier: 무료, Premium, Ultimate Offering: GitLab.com, 온프레미스, GitLab Dedicated

이 자습서에서는 Kubernetes manifest를 OCI artifact로 패키징하고 Flux를 사용하여 클러스터에 배포하는 방법을 가르칩니다. 샘플 manifest 프로젝트를 설정하여 manifest를 프로젝트의 컨테이너 레지스트리에 artifact로 저장하고 Flux를 구성하여 artifact를 동기화합니다. 이 설정으로 인해 OCI 이미지에서 변경 사항을 수집하기 전에 GitLab 파이프라인에서 추가 단계를 실행할 수 있습니다.

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

Flux를 사용하여 OCI artifact를 배포하려면 다음 단계를 수행합니다.

  1. Kubernetes manifest 리포지터리 생성
  2. manifest 리포지터리를 OCI artifact 생성하도록 구성
  3. Flux를 구성하여 artifact 동기화
  4. 구성 확인

필수 조건:

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

Kubernetes manifest 리포지터리 생성

먼저 Kubernetes manifest를 위한 리포지터리를 만듭니다.

  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
    

manifest 리포지터리를 OCI artifact 생성하도록 구성

다음으로, GitLab CI/CD를 구성하여 manifest를 OCI artifact로 패키징하고, GitLab 컨테이너 레지스트리에 artifact를 푸시합니다.

  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_REPOSITORY_URL" \
            --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 manifest를 렌더링합니다.
    • manifest를 OCI artifact로 패키징합니다.
    • OCI artifact를 컨테이너 레지스트리에 푸시합니다.

    파이프라인이 완료되면 컨테이너 레지스트리 UI에서 OCI artifact를 확인할 수 있습니다.

Flux를 구성하여 artifact 동기화

다음으로, web-app-manifests 리포지터리에서 생성된 artifact를 동기화하기 위해 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
    

    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: ./
      prune: true
      sourceRef:
        kind: OCIRepository
        name: web-app-manifests
      targetNamespace: default
    

    이 파일은 Flux가 레지스트리에서 가져온 artifact의 manifest를 동기화하도록 하는 Kustomization 리소스를 추가합니다.

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

구성 확인

클러스터에 새로 생성된 nginx pod을 확인할 수 있어야 합니다.

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

축하합니다! 프로젝트를 배포하고 변경 사항을 동기화하는 데 성공적으로 구성했습니다!