GKE 限定公開クラスタの Container Registry または Artifact Registry の設定

このページでは、Google Kubernetes Engine の限定公開クラスタと VPC Service Controls で Container Registry または Artifact Registry を使用するための DNS エントリを構成する方法について説明します。この手順は、GKE 限定公開クラスタでコンテナ ストレージにこれらのサービスを使用する場合にのみ必要です。

始める前に

サービス境界を作成する前に、新しい限定公開クラスタを設定するか、既存の限定公開クラスタの中から保護するクラスタを選択します。

また、ポート 443 で 199.36.153.4/30 への外向き(下り)を許可する必要があります。通常、VPC ネットワークには、任意の宛先へのすべての外向き(下り)トラフィックを許可する暗黙ルールがあります。ただし、このようなトラフィックを拒否するルールがある場合は、ポート 443 で 199.36.153.4/30 への TCP トラフィックを許可する外向き(下り)ファイアウォール ルールを作成する必要があります。

DNS の構成

サービス境界内で Container Registry または Artifact Registry を使用する GKE 限定公開クラスタをサポートするには、レジストリ アドレスに対するリクエストが、制限付き VIP の restricted.googleapis.com に解決されるように DNS サーバーを構成する必要があります。これを行うには、Cloud DNS の非公開 DNS ゾーンを使用します。

  1. 非公開のマネージド ゾーンを作成します。

    gcloud beta dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=REGISTRY_DOMAIN \
        --project=PROJECT_ID
    

    ここで

    • ZONE_NAME は、作成するゾーンの名前です。例: registryこの名前は、以降のステップでも使用します。

    • PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。

    • NETWORK は、リクエストをリダイレクトするクラスタ ネットワークの名前です。デフォルトのネットワークは default です。

    • DESCRIPTION は、人間が読める形式の説明です。これは指定しなくても構いません。

    • REGISTRY_DOMAIN は、レジストリのドメインです。

      • pkg.dev(Artifact Registry の場合)
      • gcr.io(Container Registry の場合)
  2. トランザクションを開始します。

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    ここで

    • ZONE_NAME は、最初の手順で作成したゾーンの名前です。

    • PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。

  3. レジストリの CNAME レコードを追加します。

    gcloud dns record-sets transaction add \
      --name=*.REGISTRY_DOMAIN. \
      --type=CNAME REGISTRY_DOMAIN. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    ここで

    • ZONE_NAME は、最初の手順で作成したゾーンの名前です。

    • PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。

    • REGISTRY_DOMAIN は、レジストリのドメインです。

      • pkg.dev(Artifact Registry の場合)
      • gcr.io(Container Registry の場合)
  4. 制限付き VIP の A レコードを追加します。

    gcloud dns record-sets transaction add \
      --name=REGISTRY_DOMAIN. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    ここで

    • ZONE_NAME は、最初の手順で作成したゾーンの名前です。

    • PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。

    • REGISTRY_DOMAIN は、レジストリのドメインです。

      • pkg.dev(Artifact Registry の場合)
      • gcr.io(Container Registry の場合)
  5. トランザクションを実行します。

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    ここで

    • ZONE_NAME は、最初の手順で作成したゾーンの名前です。

    • PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。

サービス境界を構成する

DNS レコードを構成した後、新しいサービス境界を作成するか、既存の境界を更新して、サービス境界で保護するサービスのリストに Container Registry または Artifact Registry サービスを追加します。

境界の動作を確認する

サービス境界を構成したら、サンプル コンテナをデプロイして構成を確認します。

次のコマンドを使用して限定公開クラスタに Deployment を作成します。

Artifact Registry

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Container Registry

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

次のコマンドで Pod のステータスを確認します。

kubectl get pods

このコマンドは、次の例のようなテーブルを返します。イメージが正常に pull され、正常にデプロイされると、Pod のステータスは RUNNING になります。

NAME                            READY   STATUS    RESTARTS   AGE
hello-server-dbd86c8c4-h5wsf   1/1     Running   0          45s

kubectl describe pod コマンドを使用すると、Deployment の詳細が表示されます。前の例の Pod の場合、コマンドは次のようになります。

kubectl describe pod hello-server-dbd86c8c4-h5wsf