Artifact Registry에서 OCI 아티팩트 동기화

이 페이지에서는 Artifact Registry에서 OCI 아티팩트를 동기화하는 방법을 설명합니다.

Artifact Registry를 사용하여 OCI 이미지에서 동기화하도록 구성 동기화를 구성할 수 있습니다. 이 기능을 사용하려면 RootSync 및 RepoSync API를 사용 설정해야 합니다.

Artifact Registry는 컨테이너 이미지 및 비컨테이너 아티팩트를 모두 지원하는 완전 관리형 서비스이므로 Google Cloud의 컨테이너 이미지 스토리지 및 관리에 사용하는 것이 좋습니다. Artifact Registry로 아티팩트를 푸시하는 데 사용할 수 있는 여러 도구가 있습니다. 예를 들어 Docker 이미지를 푸시하거나 Helm 차트를 푸시하거나 go-containerregistry 라이브러리를 사용하여 Container Registry에서 작업할 수 있습니다. 자신에게 가장 적합한 도구를 선택하세요. 이 페이지에서는 craneoras을 사용하여 이미지를 만들고 Artifact Registry의 저장소에 게시하는 방법을 보여줍니다.

Artifact Registry 저장소 만들기

이 섹션에서는 Artifact Registry 저장소를 만듭니다. Artifact Registry 저장소 만들기에 대한 자세한 내용은 저장소 만들기를 참조하세요.

  1. Artifact Registry API를 사용 설정합니다.

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Artifact Registry 저장소를 만듭니다.

    gcloud artifacts repositories create AR_REPO_NAME \
       --repository-format=docker \
       --location=AR_REGION \
       --description="Config Sync Helm repo" \
       --project=PROJECT_ID
    

다음을 바꿉니다.

  • PROJECT_ID: 조직의 프로젝트 ID입니다.
  • AR_REPO_NAME: 저장소 ID입니다.
  • AR_REGION: 저장소의 리전 또는 멀티 리전 위치입니다.

다음 섹션에서 사용되는 변수:

  • FLEET_HOST_PROJECT_ID: GKE 워크로드 아이덴티티를 사용하는 경우 PROJECT_ID와 동일합니다. Fleet 워크로드 아이덴티티를 사용하는 경우 클러스터가 등록된 Fleet의 프로젝트 ID입니다.
  • GSA_NAME: Artifact Registry에 연결하는 데 사용할 커스텀 Google 서비스 계정의 이름입니다.
  • KSA_NAME: 조정자의 Kubernetes 서비스 계정입니다.
    • 루트 저장소의 경우 RootSync 이름이 root-sync이면 root-reconciler를 추가합니다. 그렇지 않으면 root-reconciler-ROOT_SYNC_NAME을 추가합니다.
    • 네임스페이스 저장소의 경우 RepoSync 이름이 repo-sync이면 ns-reconciler-NAMESPACE를 추가합니다. 그렇지 않으면 ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH를 추가합니다. 여기서 REPO_SYNC_NAME_LENGTHREPO_SYNC_NAME의 문자 수입니다.

읽기 권한 부여

클러스터의 구성 동기화 버전이 1.17.2 이상인 경우 Kubernetes 서비스 계정을 사용하여 Artifact Registry에 인증할 수 있습니다. 그렇지 않으면 인증에 Google 서비스 계정을 사용합니다.

Kubernetes 서비스 계정 사용

워크로드 아이덴티티 풀이 있는 Kubernetes 서비스 계정에 Artifact Registry 리더(roles/artifactregistry.reader) IAM 역할을 부여합니다.

gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
   --location=AR_REGION \
   --member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
   --role=roles/artifactregistry.reader \
   --project=PROJECT_ID

Google 서비스 계정 사용

  1. Artifact Registry 리더(roles/artifactregistry.reader) IAM 역할을 Google 서비스 계정에 부여합니다.

    gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
       --location=AR_REGION \
       --member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/artifactregistry.reader \
       --project=PROJECT_ID
    
  2. Kubernetes 서비스 계정과 Google 서비스 계정 간에 IAM 정책 바인딩을 만듭니다.

    gcloud iam service-accounts add-iam-policy-binding \
       --role roles/iam.workloadIdentityUser \
       --member "serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --project=PROJECT_ID
    

Artifact Registry 저장소로 이미지 푸시하기

이 섹션에서는 OCI 이미지를 만들고 Artifact Registry로 푸시합니다.

  1. Namespace 매니페스트 파일을 만듭니다.

    cat <<EOF> test-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    EOF
    
  2. Artifact Registry에 로그인합니다.

    gcloud auth configure-docker AR_REGION-docker.pkg.dev
    
  3. 이미지를 패키징하고 Artifact Registry에 푸시합니다.

    crane

    이 섹션의 명령어는 crane을 사용하여 원격 이미지 및 레지스트리와 상호작용합니다.

    1. 파일을 패키징합니다.

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. crane 도구를 설치합니다.

    3. 이미지를 Artifact Registry로 내보냅니다.

      crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
      

    oras

    이 섹션의 명령어는 oras을 사용하여 원격 이미지 및 레지스트리와 상호작용합니다.

    1. 파일을 패키징합니다.

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. oras 도구를 설치합니다.

    3. 이미지를 Artifact Registry로 내보냅니다.

      oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
      

이미지에서 동기화하도록 구성 동기화 구성

이 섹션에서는 RootSync 객체를 만들고 OCI 이미지에서 동기화하도록 구성 동기화를 구성합니다.

  1. 고유한 이름으로 RootSync 객체를 만듭니다.

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: oci
      oci:
        image: AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
        dir: .
        # The k8sserviceaccount auth type is available in version 1.17.2 and
        # later. Use `gcpserviceaccount` if using an older version.
        # auth: gcpserviceaccount
        # gcpServiceAccountEmail: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
        auth: k8sserviceaccount
    EOF
    

    ROOT_SYNC_NAMERootSync 객체의 이름으로 바꿉니다. 이름은 클러스터에서 고유해야 하며 26자(영문 기준) 이하여야 합니다. RootSync 객체를 구성할 때 사용할 수 있는 전체 옵션 목록은 RootSyncRepoSync 필드를 참조하세요.

  2. RootSync 객체를 적용합니다.

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. 구성 동기화가 이미지에서 동기화되는지 확인합니다.

    nomos status --contexts=$(kubectl config current-context)
    

    다음과 비슷한 출력이 표시됩니다.

    Connecting to clusters...
    
    *publish-config-registry
       --------------------
       <root>:root-sync-test   AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1   
       SYNCED                  05e6a6b77de7a62286387cfea833d45290105fe84383224938d7b3ab151a55a1                        
       Managed resources:
          NAMESPACE   NAME             STATUS    SOURCEHASH
                      namespace/test   Current   05e6a6b
    

    이제 이미지가 클러스터에 성공적으로 동기화되었습니다.

다음 단계