このページでは、Artifact Registry から OCI アーティファクトを同期する方法について説明します。
Artifact Registry を使用して OCI イメージから同期するように Config Sync を構成できます。この機能を使用するには、RootSync API と RepoSync API を有効にする必要があります。
Artifact Registry は、コンテナ イメージとコンテナ以外のアーティファクトの両方をサポートするフルマネージド サービスであるため、Google Cloud でのコンテナ イメージのストレージと管理に使用することをおすすめします。Artifact Registry にアーティファクトを push するには、いくつかのツールを使用できます。たとえば、Docker イメージを push したり、Helm チャートを push できます。また、go-containerregistry ライブラリをコンテナ レジストリと一緒に使用することもできます。最適なツールを選択してください。このページでは、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 の Workload Identity Federation for GKE を使用している場合は、PROJECT_ID
と同じです。フリートの Workload Identity Federation for GKE を使用している場合は、クラスタが登録されているフリートのプロジェクト ID です。GSA_NAME
: Artifact Registry への接続に使用するカスタム Google サービス アカウントの名前。KSA_NAME
: Reconciler の 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
の文字数です。
- ルート リポジトリで、
読み取り権限を付与する
クラスタで Config Sync バージョンが 1.17.2 以降の場合、Kubernetes サービス アカウントを使用して Artifact Registry に認証できます。それ以外の場合は、認証に Google サービス アカウントを使用します。
Kubernetes サービス アカウントの使用
Workload Identity Federation for GKE プールを使用して、Artifact Registry 読み取り(roles/artifactregistry.reader
)IAM ロールを Kubernetes サービス アカウントに付与します。
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 サービス アカウントを使用する
Google サービス アカウントに Artifact Registry 読み取り(
roles/artifactregistry.reader
)IAM ロールを付与します。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 リポジトリに push する
このセクションでは、OCI イメージを作成して Artifact Registry に push します。
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 に push します。
crane
このセクションのコマンドは、
crane
を使用してリモート イメージとレジストリを操作します。ファイルをパッケージ化します。
tar -cf test-namespace.tar test-namespace.yaml
crane
ツールをインストールします。イメージを Artifact Registry に push します。
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 に push します。
oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
イメージから同期するように Config Sync を構成する
このセクションでは、RootSync
オブジェクトを作成し、OCI イメージから同期するように Config Sync を構成します。
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
Config Sync がイメージから同期していることを確認します。
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
これで、イメージがクラスタに正常に同期されました。
次のステップ
- Config Sync のインストールについて学習する。