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 エンドポイント) の機能と使い方を紹介します。
- 参考 : A new flexible DNS-based approach for accessing the GKE control plane(Google Cloud 公式ブログ)
- 参考 : About network isolation in GKE(Google Cloud 公式ドキュメント)
GKE におけるコントロールプレーンへのアクセス方法
従来の方法
パブリックエンドポイント
GKE クラスタでパブリックエンドポイントを有効化する場合、コントロールプレーンにはパブリック IP アドレスが割り当てられます。
この状態ではインターネット上のどこからでもコントロールプレーンにアクセスできてしまうため、承認済みネットワーク を使用してアクセス元 IP アドレスを制限するのが一般的です。
プライベートエンドポイント
パブリックエンドポイントよりも推奨される方法として、GKE クラスタでパブリックエンドポイントを無効化し、プライベート IP アドレスのみをコントロールプレーンに割り当てることもできます(プライベートエンドポイント)。
プライベートエンドポイントを使用する場合、「"コントロールプレーンがある Google 管理の VPC とピアリングされている"ユーザー 管理の VPC」を経由してコントロールプレーンにアクセスする必要があります。そのため、GKE クラスタがある VPC の外からコントロールプレーンに接続したい場合、ユーザー VPC に踏み台 VM(Bastion host)を起動するか、VPN を経由してアクセスする必要がありました。
DNS エンドポイント
GKE クラスタで DNS エンドポイントを有効化すると、Google Cloud API にアクセスできる任意の環境から、パブリック IP アドレスが割り当てられてないコントロールプレーンにアクセスすることができます。
コントロールプレーンへのアクセス可否はその他の 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 にアクセスできれば)、コントロールプレーンに接続することができます。
また、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 については、以下の記事も参照してください。
使用方法
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 エンドポイントでコントロールプレーンに接続するには、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、ミステリ)、カラオケなど。
Follow @sasashun0805