GKE NodeLocal DNSCache について

1. 概要

DNS キャッシュは、Pod の DNS リクエストをまず同じノードのローカル キャッシュに送信することで、DNS ルックアップのレイテンシを改善します。これにより、DNS ルックアップ時間がより整合性を持つようになり、kube-dns または Cloud DNS に対する DNS クエリの数を削減できます。

このラボでは、NodeLocal DNSCache が GKE クラスタで DNS トラフィックを処理する方法をテストします。バージョン 1.34.1-gke.3720000 以降を実行している GKE Standard クラスタを検証して、デフォルトで有効になっていることを確認します。次に、無効にして、機能をオフにしたときに構成がどのように変化するかを確認します。

目標

このラボでは、次のタスクの実行方法について学びます。

  • カスタム VPC、サブネット、ファイアウォール ルールを作成する
  • Rapid リリース チャンネルを使用して Standard GKE Standard クラスタをデプロイする
  • テストを実行して、LocalNode DNS キャッシュが有効になっていることを確認する
  • キャッシュを無効にして、キャッシュがない状態を確認する

2. ラボの設定

セルフペース型の環境設定

  1. Google Cloud コンソール にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

295004821bab6a87.png37d264871000675d.png96d86d3d5655cdbe.png

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

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud コンソールで、右上のツールバーにある Cloud Shell アイコンをクリックします。

Cloud Shell をアクティブにする

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

環境が接続されていることを示す Google Cloud Shell ターミナルのスクリーンショット

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

3. 環境を設定する

ファイアウォール ルールを含むカスタム VPC を作成します。VPC とプロジェクトがすでに存在する場合は、この部分をスキップできます。

コンソールの右上にある Cloud Shell を開きます。次のように構成します。b51b80043d3bac90.png

  1. このラボで使用する API の一部を有効にする
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable container.googleapis.com
  1. 変数を設定します。これらの変数は、プロジェクト ID と VPC 名です(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
  1. gke-cache-vpc というカスタム VPC を作成します。
gcloud compute networks create $vpc_name --subnet-mode=custom --project=$projectid \
--subnet-mode=custom \
--mtu=1460 \
--bgp-routing-mode=global
  1. 新しい 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
  1. 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 で次のコマンドを使用します

  1. 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 クラスタをデプロイして確認する

  1. 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
  1. クラスタが作成されたら、接続します。
gcloud container clusters get-credentials $cluster_name --zone $zone
  1. 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
  1. 次に、次のコマンドを実行します(これにより、ホスト ネットワークに特権 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 トラフィックが接続トラッキング テーブルをバイパスしていることが確認されます。

7135447929b7c48f.png

6. NodeLocal DNSCache を無効にして確認する

最適化を削除して、最適化なしで動作する様子を確認します。

  1. 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 は削除されているため、デーモンセットには表示されません。

  1. テストを再実行する
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 アドレスの記述が含まれなくなります。つまり、ローカル キャッシュのメリットを享受できなくなります。

4693ee556701e145.png

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 ラボをご確認ください。