사용 방법 : Flux를 사용하여 OCI artifact 배포하기
이 자습서에서는 Kubernetes manifest를 OCI artifact로 패키징하고 Flux를 사용하여 클러스터에 배포하는 방법을 가르칩니다. 샘플 manifest 프로젝트를 설정하여 manifest를 프로젝트의 컨테이너 레지스트리에 artifact로 저장하고 Flux를 구성하여 artifact를 동기화합니다. 이 설정으로 인해 OCI 이미지에서 변경 사항을 수집하기 전에 GitLab 파이프라인에서 추가 단계를 실행할 수 있습니다.
이 자습서는 공개 프로젝트에서 애플리케이션을 배포합니다. 비공개 프로젝트를 추가하려면 프로젝트 배포 토큰을 만들어야 합니다.
Flux를 사용하여 OCI artifact를 배포하려면 다음 단계를 수행합니다.
필수 조건:
- 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-oci-tutorial
manifest 리포지터리를 OCI artifact 생성하도록 구성
다음으로, GitLab CI/CD를 구성하여 manifest를 OCI artifact로 패키징하고, GitLab 컨테이너 레지스트리에 artifact를 푸시합니다.
-
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
리소스를 만듭니다.
-
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로 대체해야 합니다. -
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 리소스를 추가합니다.
-
새 파일을 커밋하고 푸시합니다.
구성 확인
클러스터에 새로 생성된 nginx
pod을 확인할 수 있어야 합니다.
배포를 다시 동기화하려면 src/nginx-deployment.yaml
파일의 레플리카 수를 업데이트하고 기본 브랜치로 푸시해보세요. 모든 것이 잘 작동하면, 변경 사항은 파이프라인이 완료될 때 클러스터에 동기화되어야 합니다.
축하합니다! 프로젝트를 배포하고 변경 사항을 동기화하는 데 성공적으로 구성했습니다!