GKE を安心・安全に始める

この記事は [DENSOアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/denso) の 6日目の記事です。

約1年前に GKE を使い始めたのですが、専門用語や設定項目が難解且つ多く苦労しました。
勿論、デフォルト設定で手軽に始めることも出来ますが
セキュリティや課金の面で大丈夫とは思えませんでした・・・。

そこで、初めて GKE を触る時に少しでも意識すると、セキュリティや金額の面が安心・安全になると思う部分をまとめてみました。

# はじめに
この記事では GCP や Kubernetes そのものについては書きませんので、他の素晴らしい記事を参照ください。
また、本番サービス提供には不適切な部分もありますので、最初の取っ掛かりとして見てもらえると助かります。

# 構築する環境
最終的に以下のような環境を構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/fe97ba8a-9c37-77a8-cf7a-a5149f54ab31.png)

意識するポイントは以下です。

* 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 など) が利用可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/8622eafb-9662-b067-4946-ccb463c781b8.png)

#### Firewall を設定
外部 IP を持たない踏み台へアクセスするためには、IAP を利用します。
[こちら](https://qiita.com/advent-calendar/2020/denso) を参考に Firewall を設定します。
※ 使用中の IAM に IAP 使用権限が無ければ付与します。

# クラスタ操作用 GCE インスタンス
クラスタを操作するためには Kubernetes の Masterノードと通信する必要がありますが、セキュリティ面からインターネット経由で通信するのは避けた方が良いと思っています。
そこで、GCP の内部ネットワークで Master ノードと通信をする踏み台を作成します。

#### 無料枠の条件で作成する
以下の条件でインスタンスを作成し、課金額を抑えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/a9991d80-e8a8-87e3-ff38-27204ebc1953.png)

#### 外部 IP を付けない
インスタンス作成のネットワークインターフェース設定で、外部 IP を「なし」にしてインターネットからアクセス出来なくします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/01377397-5bbd-35dd-5461-07f6a8fbd44b.png)

#### ブラウザ上から SSH する
インスタンスが出来上がると、ブラウザの GCE インスタンス一覧画面から SSH できると思います。
また、外部 IP が「なし」になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/b1a0db52-c8df-8988-cac2-9a2d24b000a9.png)


# GKE
#### ゾーンクラスタにする
1 つの請求先アカウントにつき、1 つのゾーンクラスタ管理料金が無料なので初めて GKE を使う場合はゾーンクラスタにするのが良いと思います。
また、1 つ目のクラスタでなかったとしてもゾーンクラスタの方が安いのでおススメです。

#### 踏み台と同じ VPC に作成する
GKE の Master ノードと Worker ノードは VPC peering で接続されているので、踏み台がクラスタを操作するために、クラスタは踏み台と同じ VPC Network に作成します。(VPC Native クラスタにする)

#### 限定公開クラスタにする
worker ノードにも外部 IP を付けないようにして、インターネットからアクセス出来ないようにします。GKE では限定公開クラスタを ON にすることで可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/cd5e17d9-f25a-ec52-bd79-51149db2b775.png)

#### Worker ノードはプリエンプティブル VM にする
踏み台で無料枠を使うので、Worker ノードは課金対象となります。
節約のためにスペックを下げるのは勿論ですが、更に節約するならプリエンプティブル VM にします。
24 時間以内に 必ず 1 回シャットダウンされますが、GKE の場合は Reconciliation によって自動復旧されるので、開発用などでは大きな問題にならないと思います。

#### Master ノードにはプライベートエンドポイントのみ付与する
クラスタ作成にて「限定公開クラスタを選択」且つ「外部 IP アドレスを使用したマスターへのアクセス」のチェックを外すと、Master ノードがインターネットからアクセス出来なくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/f5921f5e-ebb5-4c20-2d56-3eec3a544646.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927896/b8d6f9cd-5a3f-4436-dffc-69a7a50aa34b.png)

以上の設定で、安心・安全な GKE ライフを送れると思います。
もし、不適切な点などありましたら、ご指摘ください！

# おまけ
これ以降は必須ではないものの、個人的に実施している項目です。

#### 踏み台、ノードをインターネットに接続する
インターネットからアクセスはさせたくないものの、パッケージのアップデートなどでインターネットにアクセスしたいことがあるので、Cloud NAT を利用しています。

#### DB 接続
VPC Native クラスタであれば、Cloud SQL などの DB 系サービスと内部 IP で接続できますので Proxy は使っていません。
また、Kubernetes の secret はデフォルトで Base64 エンコードしかされないので、DB の接続情報はリポジトリに上げないように注意しています。