この記事は DENSOアドベントカレンダー2020 の 6日目の記事です。
約1年前に GKE を使い始めたのですが、専門用語や設定項目が難解且つ多く苦労しました。
勿論、デフォルト設定で手軽に始めることも出来ますが
セキュリティや課金の面で大丈夫とは思えませんでした・・・。
そこで、初めて GKE を触る時に少しでも意識すると、セキュリティや金額の面が安心・安全になると思う部分をまとめてみました。
はじめに
この記事では GCP や Kubernetes そのものについては書きませんので、他の素晴らしい記事を参照ください。
また、本番サービス提供には不適切な部分もありますので、最初の取っ掛かりとして見てもらえると助かります。
構築する環境
意識するポイントは以下です。
- VPC Network
- default を使わない
- 限定公開の Google アクセスを ON
- Firewall を設定
- クラスタ操作用 GCE インスタンス (踏み台)
- 無料枠の条件で作成する
- 外部 IP を付けない
- ブラウザ上から SSH 接続する
- GKE
- ゾーンクラスタにする
- 踏み台と同じ VPC Network に作成する
- 限定公開クラスタにする
- Worker ノードはプリエンプティブル VM にする
- Master ノードにはプライベートエンドポイントのみ付与する
- おまけ
- 踏み台、ノードをインターネットに接続する
- DB 接続
コンセプトは**「無料枠の活用」「極力インターネットからアクセスさせない」**です。
VPC Network
Kubernetes クラスタと踏み台を作るためには VPC Network が必要です。
default を使わない
GCP でプロジェクトを作成すると、default という VPC Network が自動で作成されますが
22番ポートが全開放など、設定がかなり甘いです。
勿論、変更すれば済む話ですが、それよりも自分で VPN Network を作成した方が
他の設定確認・変更などの手間が無く、安心で早いです。
限界公開の Google アクセスを ON
VPC Network を作成する際、以下のオプションを ON にします。
これで VPC 内のインスタンスがインターネットにアクセス出来なくとも、Google のサービス (GCS など) が利用可能になります。
Firewall を設定
外部 IP を持たない踏み台へアクセスするためには、IAP を利用します。
こちら を参考に Firewall を設定します。
※ 使用中の IAM に IAP 使用権限が無ければ付与します。
クラスタ操作用 GCE インスタンス
クラスタを操作するためには Kubernetes の Masterノードと通信する必要がありますが、セキュリティ面からインターネット経由で通信するのは避けた方が良いと思っています。
そこで、GCP の内部ネットワークで Master ノードと通信をする踏み台を作成します。
無料枠の条件で作成する
外部 IP を付けない
インスタンス作成のネットワークインターフェース設定で、外部 IP を「なし」にしてインターネットからアクセス出来なくします。
ブラウザ上から SSH する
インスタンスが出来上がると、ブラウザの GCE インスタンス一覧画面から SSH できると思います。
また、外部 IP が「なし」になっていることを確認します。
GKE
ゾーンクラスタにする
1 つの請求先アカウントにつき、1 つのゾーンクラスタ管理料金が無料なので初めて GKE を使う場合はゾーンクラスタにするのが良いと思います。
また、1 つ目のクラスタでなかったとしてもゾーンクラスタの方が安いのでおススメです。
踏み台と同じ VPC に作成する
GKE の Master ノードと Worker ノードは VPC peering で接続されているので、踏み台がクラスタを操作するために、クラスタは踏み台と同じ VPC Network に作成します。(VPC Native クラスタにする)
限定公開クラスタにする
worker ノードにも外部 IP を付けないようにして、インターネットからアクセス出来ないようにします。GKE では限定公開クラスタを ON にすることで可能です。
Worker ノードはプリエンプティブル VM にする
踏み台で無料枠を使うので、Worker ノードは課金対象となります。
節約のためにスペックを下げるのは勿論ですが、更に節約するならプリエンプティブル VM にします。
24 時間以内に 必ず 1 回シャットダウンされますが、GKE の場合は Reconciliation によって自動復旧されるので、開発用などでは大きな問題にならないと思います。
Master ノードにはプライベートエンドポイントのみ付与する
クラスタ作成にて「限定公開クラスタを選択」且つ「外部 IP アドレスを使用したマスターへのアクセス」のチェックを外すと、Master ノードがインターネットからアクセス出来なくなります。
以上の設定で、安心・安全な GKE ライフを送れると思います。
もし、不適切な点などありましたら、ご指摘ください!
おまけ
これ以降は必須ではないものの、個人的に実施している項目です。
踏み台、ノードをインターネットに接続する
インターネットからアクセスはさせたくないものの、パッケージのアップデートなどでインターネットにアクセスしたいことがあるので、Cloud NAT を利用しています。
DB 接続
VPC Native クラスタであれば、Cloud SQL などの DB 系サービスと内部 IP で接続できますので Proxy は使っていません。
また、Kubernetes の secret はデフォルトで Base64 エンコードしかされないので、DB の接続情報はリポジトリに上げないように注意しています。