Edited at

GKEで限定公開クラスタ構築時のtimeoutエラー問題と解決策


はじめに

GKE(Google Kubernetes Engine)の限定公開クラスタを構築する際に、以下のような接続エラーが起こりkubectlコマンドが使えずハマったのでメモ。

$ kubectl version

Unable to connect to the server: dial tcp <Your Cluster IP>:443: i/o timeout


やりたかったこと

GKEと連携しているAPIの制約上、外部への通信のIPを固定する必要がありました。Cloud NATと限定公開クラスタ(Nodeに外部IPが付与されない)の構築してオートスケールしてもIPを固定にすることが目的でした。

そのために限定公開クラスタをを構築する必要がありました。現在では限定公開クラスタの作成はコンソール上で可能です。ただし、IngressのLet's Encrypt連携といったkubernetesの詳細な設定はkubectlを使わないと出来ません。(←違ってたらすみません)


通常のクラスタじゃだめなの?

通常のクラスタはオートスケール時にデフォルトで自動的に新規の外部IPが付与され、クラスタが格納されているネットワークにCloud NATを構築していてもその外部IPで通信してしまいます。ノードのテンプレートを設定、適用することで新規作成ノードに外部IPを付与させないことが可能ですが、私の環境では数ヶ月に一度、適用しているテンプレートが勝手に更新される現象が発生しました。そのため、GKEでノードに外部IPが付与できないよう限定公開クラスタを構築しました。


やったこと

以下の公式ドキュメントに従って限定公開クラスタを作成した。


原因

ドキュメントのサンプルコマンドに含まれている--enable-master-authorized-networksオプションが原因でした。これのオプションは許可されたIP以外からのクラスタへの通信を防ぐオプションです。実行するコマンドのオプションぐらいは最低限把握しとけって話ですね。ちなみに--master-authorized-networks [CIDR]オプションで許可するIPを指定します。


解決策

限定公開クラスタ作成コマンドから--enable-master-authorized-networksオプションを除く。


example

$ gcloud container clusters create private-cluster-0 \

--create-subnetwork name=my-subnet-0 \
--enable-ip-alias \
--enable-private-nodes \
--master-ipv4-cidr 172.16.0.0/28 \
--no-enable-basic-auth \
--no-issue-client-certificate