이 페이지에서는 Artifact Registry에서 OCI 아티팩트를 동기화하는 방법을 설명합니다.
Artifact Registry를 사용하여 OCI 이미지에서 동기화하도록 구성 동기화를 구성할 수 있습니다. 이 기능을 사용하려면 RootSync 및 RepoSync API를 사용 설정해야 합니다.
Artifact Registry는 컨테이너 이미지 및 비컨테이너 아티팩트를 모두 지원하는 완전 관리형 서비스이므로 Google Cloud의 컨테이너 이미지 스토리지 및 관리에 사용하는 것이 좋습니다. Artifact Registry로 아티팩트를 푸시하는 데 사용할 수 있는 여러 도구가 있습니다. 예를 들어 Docker 이미지를 푸시하거나 Helm 차트를 푸시하거나 go-containerregistry 라이브러리를 사용하여 Container Registry에서 작업할 수 있습니다. 자신에게 가장 적합한 도구를 선택하세요.
이 페이지에서는 crane
및 oras
을 사용하여 이미지를 만들고 Artifact Registry의 저장소에 게시하는 방법을 보여줍니다.
Artifact Registry 저장소 만들기
이 섹션에서는 Artifact Registry 저장소를 만듭니다. Artifact Registry 저장소 만들기에 대한 자세한 내용은 저장소 만들기를 참조하세요.
Artifact Registry API를 사용 설정합니다.
gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
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용 GKE 워크로드 아이덴티티 제휴를 사용하는 경우PROJECT_ID
와 동일합니다. GKE용 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_LENGTH
는REPO_SYNC_NAME
의 문자 수입니다.
- 루트 저장소의 경우
읽기 권한 부여
클러스터의 구성 동기화 버전이 1.17.2 이상인 경우 Kubernetes 서비스 계정을 사용하여 Artifact Registry에 인증할 수 있습니다. 그렇지 않으면 인증에 Google 서비스 계정을 사용합니다.
Kubernetes 서비스 계정 사용
GKE용 워크로드 아이덴티티 제휴 풀이 있는 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 서비스 계정 사용
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
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로 푸시합니다.
Namespace
매니페스트 파일을 만듭니다.cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOF
Artifact Registry에 로그인합니다.
gcloud auth configure-docker AR_REGION-docker.pkg.dev
이미지를 패키징하고 Artifact Registry에 푸시합니다.
crane
이 섹션의 명령어는
crane
을 사용하여 원격 이미지 및 레지스트리와 상호작용합니다.파일을 패키징합니다.
tar -cf test-namespace.tar test-namespace.yaml
crane
도구를 설치합니다.이미지를 Artifact Registry로 내보냅니다.
crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
oras
이 섹션의 명령어는
oras
을 사용하여 원격 이미지 및 레지스트리와 상호작용합니다.파일을 패키징합니다.
tar -czf test-namespace.tar.gz test-namespace.yaml
oras
도구를 설치합니다.이미지를 Artifact Registry로 내보냅니다.
oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
이미지에서 동기화하도록 구성 동기화 구성
이 섹션에서는 RootSync
객체를 만들고 OCI 이미지에서 동기화하도록 구성 동기화를 구성합니다.
고유한 이름으로
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_NAME
을RootSync
객체의 이름으로 바꿉니다. 이름은 클러스터에서 고유해야 하며 26자(영문 기준) 이하여야 합니다.RootSync
객체를 구성할 때 사용할 수 있는 전체 옵션 목록은RootSync
및RepoSync
필드를 참조하세요.RootSync
객체를 적용합니다.kubectl apply -f ROOT_SYNC_NAME.yaml
구성 동기화가 이미지에서 동기화되는지 확인합니다.
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
이제 이미지가 클러스터에 성공적으로 동기화되었습니다.
다음 단계
- 구성 동기화 설치 자세히 알아보기