このページでは、Google Kubernetes Engine の限定公開クラスタと VPC Service Controls で Container Registry または Artifact Registry を使用するための DNS エントリを構成する方法について説明します。
この手順は、GKE 限定公開クラスタでコンテナ ストレージに Artifact Registry または Container Registry を使用し、pkg.dev
または gcr.io
レジストリ ドメインの restricted.googleapis.com
へのルーティングをまだ構成していない場合にのみ必要です。
サービス境界内のプライベート クラスタは制限付き VIP がなくても Container Registry または Artifact Registry を使用できますが、このような使い方はしないでください。制限付き VIP を使用しない場合、サポートされたサービスからサポートされていないサービスにデータが抽出される可能性があります。
始める前に
サービス境界を作成する前に、新しい限定公開クラスタを設定するか、既存の限定公開クラスタの中から保護するクラスタを選択します。
また、ポート 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 ゾーンを使用します。
非公開のマネージド ゾーンを作成します。
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 は、リクエストのリダイレクト元のクラスタ ネットワークの名前のリストです(省略可)。
DESCRIPTION は、人間が読める形式のマネージド ゾーンの説明です。
REGISTRY_DOMAIN は、レジストリのドメインです。
pkg.dev
(Artifact Registry の場合)gcr.io
(Container Registry の場合)
トランザクションを開始します。
gcloud dns record-sets transaction start \ --zone=ZONE_NAME \ --project=PROJECT_ID
ここで
ZONE_NAME は、最初の手順で作成したゾーンの名前です。
PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。
レジストリの 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 の場合)
制限付き 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 の場合)
トランザクションを実行します。
gcloud dns record-sets transaction execute \ --zone=ZONE_NAME \ --project=PROJECT_ID
ここで
ZONE_NAME は、最初の手順で作成したゾーンの名前です。
PROJECT_ID は、GKE 限定公開クラスタをホストするプロジェクトの ID です。
サービス境界を構成する
DNS レコードを構成した後、新しいサービス境界を作成するか、既存の境界を更新して、サービス境界で保護するサービスのリストに Container Registry または Artifact Registry サービスを追加します。
その他の注意点:
- レジストリで使用するほかのサポート対象のサービスを Cloud Build、Container Analysis、Binary Authorization などのサービス境界に追加します。
- Container Registry の場合は、Cloud Storage もサービス境界に追加する必要があります。
境界の動作を確認する
サービス境界を構成したら、サンプル コンテナをデプロイして構成を確認します。
次のコマンドを使用して限定公開クラスタに 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