GKE 限定公開クラスタの Container Registry の設定

このページでは、Google Kubernetes Engine のプライベート クラスタと VPC Service Controls で Container Registry を使用するための DNS エントリの構成方法を説明します。この手順は、GKE 限定公開クラスタが Container Registry を使用している場合にのみ必要になります。

準備

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

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

DNS の構成

サービス境界内で Container Registry を使用する GKE 限定公開クラスタをサポートするには、Container Registry のアドレスに対するリクエストが restricted.googleapis.com(制限付き VIP)に解決されるように 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=gcr.io \
        --project=PROJECT_ID
    

    ここで

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

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

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

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

  2. トランザクションを開始します。

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

    ここで

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

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

  3. CNAME レコードを *.gcr.io へ追加

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

    ここで

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

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

  4. 制限付き VIP の A レコードを追加します。

    gcloud dns record-sets transaction add \
      --name=gcr.io. \
      --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 です。

  5. トランザクションを実行します。

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

    ここで

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

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

サービス境界を構成する

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

境界の動作を確認する

サービス境界を構成したら、PHP ゲストブックのチュートリアルに従って、境界が期待どおりに機能していることを確認します。

構成が正しく機能している場合、ゲストブック アプリケーションのウェブ フロントエンドのポッドは起動できません。

境界が正しく構成されている場合、次のようなエラー メッセージが返されます。

Events:
  Type     Reason                 Age               From                                               Message
  ----     ------                 ----              ----                                               -------
  Normal   Scheduled              8m                default-scheduler                                  Successfully assigned sample-67f11b22f-t7ltj to gke-netpolicy-default-pool-02ad111e-06tk
  Normal   SuccessfulMountVolume  8m                kubelet, gke-netpolicy-default-pool-02ad111e-06tk  MountVolume.SetUp succeeded for volume "default-token-lhx2s"
  Normal   Pulling                6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  pulling image "gcr.io/google_samples/gb-frontend:v4"
  Warning  Failed                 6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  Failed to pull image "gcr.io/google_samples/gb-frontend:v4": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/google_samples/gb-frontend/manifests/v4: denied: Request is prohibited by organization's policy