DNSベースのエンドポイントを使用してGKEのコントロールプレーンに接続する

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では、GKE のコントロールプレーンにアクセスするための新しい方法として、DNS ベースのエンドポイント(DNS エンドポイント)を紹介します。

はじめに

Google Cloud(旧称 GCP)のフルマネージドなコンテナオーケストレーションサービスである Google Kubernetes Engine(GKE)では、Kubernetes クラスタのコントロールプレーンへのアクセス方法を複数種類から選択できます。

従来から存在する IP ベースのエンドポイント(IP-based endpoints)方式(パブリッククラスタとプライベートクラスタ)に加えて、2024年11月11日、DNS ベースのエンドポイント(DNS-based endpoint)が利用可能になりました。

当記事では、DNS ベースのエンドポイント(DNS エンドポイント) の機能と使い方を紹介します。

GKE におけるコントロールプレーンへのアクセス方法

従来の方法

パブリックエンドポイント

GKE クラスタでパブリックエンドポイントを有効化する場合、コントロールプレーンにはパブリック IP アドレスが割り当てられます。

この状態ではインターネット上のどこからでもコントロールプレーンにアクセスできてしまうため、承認済みネットワーク を使用してアクセス元 IP アドレスを制限するのが一般的です。

パブリックエンドポイントでコントロールプレーンに接続する

プライベートエンドポイント

パブリックエンドポイントよりも推奨される方法として、GKE クラスタでパブリックエンドポイントを無効化し、プライベート IP アドレスのみをコントロールプレーンに割り当てることもできます(プライベートエンドポイント)。

プライベートエンドポイントを使用する場合、「"コントロールプレーンがある Google 管理の VPC とピアリングされている"ユーザー 管理の VPC」を経由してコントロールプレーンにアクセスする必要があります。そのため、GKE クラスタがある VPC の外からコントロールプレーンに接続したい場合、ユーザー VPC に踏み台 VM(Bastion host)を起動するか、VPN を経由してアクセスする必要がありました。

プライベートエンドポイントでコントロールプレーンに接続する

DNS エンドポイント

GKE クラスタで DNS エンドポイントを有効化すると、Google Cloud API にアクセスできる任意の環境から、パブリック IP アドレスが割り当てられてないコントロールプレーンにアクセスすることができます。

DNSエンドポイントでコントロールプレーンに接続する

コントロールプレーンへのアクセス可否はその他の Google Cloud API を利用するときと同様に、IAM ポリシーによって判断されます。GKE クラスタに対して container.clusters.connect ポリシーを持つ以下のようなロールが付与されているプリンシパルであれば、コントロールプレーンにアクセスすることができます。

  • Kubernetes Engine 開発者(roles/container.developer)
  • Kubernetes Engine 閲覧者(roles/container.viewer) ※読み取り専用

DNS エンドポイントを使用することで、コントロールプレーンへの接続に踏み台 VM を使用する必要がなくなるほか、推移的なルーティングによってコントロールプレーンに到達できないといった、ネットワーク構成上の制限を考慮しなくてもよくなります。

たとえば、以下のような構成でプライベートエンドポイントを使用する場合、推移的ルーティングによりコントロールプレーンにアクセスすることはできません。

推移的ルーティングによりコントロールプレーンに接続できないケース

DNS エンドポイントを使用すると、アクセス元の VPC 内サブネットで限定公開の Google アクセスが有効化されていれば(Google Cloud API にアクセスできれば)、コントロールプレーンに接続することができます。

DNSエンドポイントでは推移的ルーティングに制限されずに接続できる

また、VPC Service Control を使用することで、IAM 以外の条件(アクセス元が存在するプロジェクトなど)でも DNS エンドポイントに対するアクセス元を制限することができます。

IP ベースと DNS ベースの比較

IP ベースのエンドポイントと、DNS ベースのエンドポイントがどのように異なるのかを比較します。

DNS ベースのエンドポイントでは、Google Cloud API がインターネットに露出しているという点では、IP ベースのエンドポイントのパブリッククラスタと類似しているものの、以下のように異なっています。

比較点 IP ベース(パブリックエンドポイント) DNS ベース
Kubernetes API エンドポイントの露出 パブリック IP を持っている(万が一 Kubernetes に脆弱性がある場合は脅威にさらされる) パブリック IP を持たない設定が可能
kubectl の接続情報取得に必要な IAM 権限 container.clusters.get container.clusters.connect
VPC Service Controls での保護 なし(クラスタ情報取得に対しては保護可能) 可能

特にセキュリティ面に関しては、従来の IP ベースのアクセスであれば、プライベートクラスタを構成したうえで踏み台ホストや VPN を用いて Kubernetes API へ接続することが推奨されていましたが、今後は DNS ベースのエンドポイントを構成し、IAM 権限を適切に管理したうえで VPC Service Controls を使って多層防御を構成することが推奨されます。

VPC Service Controls については、以下の記事も参照してください。

blog.g-gen.co.jp

使用方法

DNS エンドポイントの有効化

DNS エンドポイントはいつでも有効化することができます。CLI で有効化する場合は、--enable-dns-access フラグを使用してクラスタを更新します。

# クラスタ作成時に DNS エンドポイントを有効化する
$ gcloud container clusters create ${GKEクラスタ名} -–enable-dns-access
  
# 既存のクラスタで DNS エンドポイントを有効化する
$ gcloud container clusters update ${GKEクラスタ名} --enable-dns-access

Google Cloud コンソールの場合、「DNS エンドポイント」の項目から有効化することができます。

DNSエンドポイントの設定箇所(コンソール)

コントロールプレーンへのアクセス

DNS エンドポイントでコントロールプレーンに接続するには、gcloud container clusters get-credentials コマンドで --dns-endpoint フラグを使用します。

# DNS エンドポイントでコントロールプレーンに接続する
$ gcloud container clusters get-credentials ${GKEクラスタ名} --dns-endpoint

IP アドレスを使用した接続の無効化

--no-enable-ip-access フラグを使用することで、従来の IP アドレスベースの接続方法を無効化することができます。

# IP アドレスベースのコントロールプレーンへの接続を無効化する
$ gcloud container clusters update ${GKEクラスタ名} --no-enable-ip-access

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。