1. 概要
DNS キャッシュは、Pod の DNS リクエストをまず同じノードのローカル キャッシュに送信することで、DNS ルックアップのレイテンシを改善します。これにより、DNS ルックアップ時間がより整合性を持つようになり、kube-dns または Cloud DNS に対する DNS クエリの数が削減されます。
このラボでは、**NodeLocal DNSCache** が GKE クラスタで DNS トラフィックを処理する方法をテストします。バージョン 1.34.1-gke.3720000 以降を実行している GKE Standard クラスタを検証して、デフォルトで有効になっていることを確認します。次に、無効にして、この機能をオフにしたときに構成がどのように変化するかを確認します。
目標
このラボでは、次のタスクの実行方法について学びます。
- カスタム VPC、サブネット、ファイアウォール ルールを作成する
- ラピッド リリース チャネルを使用して Standard GKE Standard クラスタをデプロイする
- テストを実行して、LocalNode DNS キャッシュが有効になっていることを確認する
- キャッシュを無効にして、キャッシュがない状態を確認する
2. ラボの設定
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名 は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell を起動する
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud コンソール で、右上のツールバーにある Cloud Shell アイコンをクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。
3. 環境を設定する
ファイアウォール ルールを使用してカスタム VPC を作成します。すでに VPC とプロジェクトがある場合は、この部分をスキップできます。
コンソールの右上の Cloud Shell を開きます。次のように構成します。 
- このラボで使用する API の一部を有効にします。
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable container.googleapis.com
- 変数を設定します。これらの変数は、プロジェクト ID と VPC 名 o です(VPC はステップ 3 で作成します)。
export projectid=$(gcloud config get-value project)
export vpc_name=gke-cache-vpc
export subnet_name=mainsubnet
export region=us-east1
export zone=us-east1-b
export cluster_name=cache-gke-cluster
export channel=rapid
export machine_type=e2-standard-4
echo $projectid
echo $vpc_name
gke-cache-vpcというカスタム VPC を作成します。
gcloud compute networks create $vpc_name --subnet-mode=custom --project=$projectid \
--subnet-mode=custom \
--mtu=1460 \
--bgp-routing-mode=global
- 新しい VPC にサブネットを作成します。
gcloud compute networks subnets create $subnet_name \
--network=$vpc_name \
--range=10.0.88.0/24 \
--region=$region \
--enable-private-ip-google-access \
--project=$projectid
- VPC にファイアウォール ルールを追加します。
gcloud compute firewall-rules create $vpc_name-allow-internal \
--network=$vpc_name --allow=tcp,udp,icmp --source-ranges=10.0.88.0/24
gcloud compute firewall-rules create $vpc_name-allow-ssh \
--network=$vpc_name --allow=tcp:22 --source-ranges=35.235.240.0/20
4. インターネット通信用の NAT ゲートウェイを作成する
インターネットへの送信外部アクセスを許可する必要があるため、Cloud NAT ゲートウェイを作成して接続します。
Cloud Shell で次のコマンドを使用します。
- Cloud NAT と NAT ゲートウェイを作成します。
gcloud compute routers create gke-nat-router --network=$vpc_name --region=$region
gcloud compute routers nats create gke-nat-gw \
--router=gke-nat-router --region=$region \
--auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges
5. GKE クラスタをデプロイして確認する
- Google Cloud Shell で、
cache-gke-clusterというクラスタを作成します。バージョン1.34.1-gke.3720000以降を実行している GKE Standard クラスタでは、NodeLocal DNSCache はデフォルトで有効になっています。(クラスタのプロビジョニングには 4 ~ 10 分かかります )
gcloud container clusters create $cluster_name \
--zone=$zone --network=$vpc_name --subnetwork=$subnet_name \
--release-channel=$channel --machine-type=$machine_type \
--enable-ip-alias
- クラスタが作成されたら、接続します。
gcloud container clusters get-credentials $cluster_name --zone $zone
- NodeLocal DNSCache が有効になっていることを確認します。
これらのコマンドは、バージョンが 1.34.1-gke.3720000 以降であることを確認し、ローカル エージェントが実行されていてサービスが実行されていることを確認します。
kubectl version | grep "Server Version"
kubectl get pods -n kube-system -o wide | grep node-local-dns -w
kubectl get svc,endpoints -n kube-system -l k8s-app=kube-dns
- 次に、次のコマンドを実行します(これにより、ホスト ネットワークに特権 Pod が作成され、ノードの iptables ルールが DNS トラフィックをローカル キャッシュに積極的にインターセプトしてルーティングしていることを確認します)。
export KUBEDNS_IP=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}')
kubectl run node-inspector --quiet --rm -it --image=alpine --privileged --restart=Never \
--overrides='{"spec": {"hostNetwork": true}}' -- \
sh -c "apk add --no-cache iptables && iptables-save | grep -E '169.254.20.10|$KUBEDNS_IP'"
確認する内容: -j NOTRACK. を探します。これにより、DNS トラフィックが接続トラッキング テーブルをバイパスしていることが確認されます。

6. NodeLocal DNSCache を無効にして確認する
最適化を削除して、最適化なしでどのように動作するかを確認します。
- Cloud Shell に移動して、次のコマンドを実行します。注: これによりノードの再作成がトリガーされます。GKE がインスタンスをローテーションするため、通常はノードプールごとに 3 ~ 5 分 かかります。
gcloud container clusters update $cluster_name --zone=$zone --update-addons=NodeLocalDNS=DISABLED --quiet
kubectl get pods -n kube-system -o wide | grep node-local-dns -w
これらの Pod は削除されているため、デーモンセットには表示されません。
- テストを再実行 します。
kubectl run node-inspector --quiet --rm -it --image=alpine --privileged --restart=Never \
--overrides='{"spec": {"hostNetwork": true}}' -- \
sh -c "apk add --no-cache iptables && iptables-save | grep -E '169.254.20.10|$KUBEDNS_IP'"
アドオンを無効にすると、出力に-j NOTRACKルールや 169.254.20.10 IP アドレスに関する記述は含まれなくなります。つまり、ローカル キャッシュのメリットは得られなくなります。

7. クリーンアップ
# 1. Delete the GKE Cluster
# This will remove the node and all system pods (including kube-dns)
gcloud container clusters delete $cluster_name --zone=$zone --quiet
# 2. Delete the Cloud NAT and Router
# It is best practice to remove these before the VPC
gcloud compute routers nats delete gke-nat-gw --router=gke-nat-router --region=$region --quiet
gcloud compute routers delete gke-nat-router --region=$region --quiet
# 3. Delete the Firewall Rules
gcloud compute firewall-rules delete $vpc_name-allow-internal $vpc_name-allow-ssh --quiet
# 4. Delete the Subnet and VPC
gcloud compute networks subnets delete $subnet_name --region=$region --quiet
gcloud compute networks delete $vpc_name --quiet
8. 次のステップと詳細情報
GKE ネットワーキングのドキュメントとユースケースの詳細をご覧ください。
Codelab: Private Service Connect エンドポイント経由で Python SDK を使用して Gemini 3 Pro チャットにアクセスする
Codelab: ADK を使用した AI エージェントの構築:基礎
次のラボを受講する
Google Cloud のクエストを続けるか、その他の Google Cloud Skills Boost ラボをご確認ください。