Artifact Registry から OCI アーティファクトを同期する

このページでは、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 ライブラリをコンテナ レジストリと一緒に使用することもできます。最適なツールを選択してください。このページでは、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 の 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 を追加します。
    • Namespace リポジトリで、RepoSync 名が repo-sync の場合は ns-reconciler-NAMESPACE を追加します。それ以外の場合は、ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH を追加します。ここで、REPO_SYNC_NAME_LENGTHREPO_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 サービス アカウントの使用

  1. 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
    
  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 リポジトリに push する

このセクションでは、OCI イメージを作成して Artifact Registry に push します。

  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 に push します。

    crane

    このセクションのコマンドは、crane を使用してリモート イメージとレジストリを操作します。

    1. ファイルをパッケージ化します。

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. crane ツールをインストールします。

    3. イメージを 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 を使用してリモート イメージとレジストリを操作します。

    1. ファイルをパッケージ化します。

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. oras ツールをインストールします。

    3. イメージを 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 を構成します。

  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_NAME は、実際の RootSync オブジェクトの名前に置き換えます。この名前はクラスタ内で一意で、26 文字以下にする必要があります。RootSync オブジェクトを構成する際のオプションの完全なリストについては、RootSync フィールドと RepoSync フィールドをご覧ください。

  2. RootSync オブジェクトを適用します。

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. 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
    

    これで、イメージがクラスタに正常に同期されました。

次のステップ