GCP初心者がGKE Autopilotを使ってシステムを構築してみる!

自分の中で「コンテナオーケストレーションサービスといえばECS!」という感じになりつつあったので今回はKubernetesに挑戦してみました。
Kubernetesは学習コスト、運用コストともに高いと聞くのであまり手が出せなかったのですが、個人開発ということもあって思い切って挑戦してみました。
更に今回は慣れ親しんだAWSを離れてGCPを選択。
EKSを飛ばしてGKEに挑戦してみました。
そこで今回はその過程について解説していきます!
構成
フロントエンドはNuxtで構成されていて、そこからGoで構成されたバックエンドAPIをコールするシステム構成となっています。
よくある構成ですね。
ECSを使って構成するならこんな感じになるかなって思います。

そして、GKEを使って構成するとこんな感じになります。

若干書き方違いますが、
- EC2 Instance 1 = Kubernetes Pod 1
- EC2 Instance 2 = Kubernetes Pod 2
- ALB = GKE Ingress, Cloud Load Balancing 1, Cloud Load Balancing 2
って感じになります。
クラスターの作成
では早速構築してみましょう!
まずはクラスタを作成します。
GCPコンソールの「Kubernetes Engine」の「クラスタ」へ進み、作成をクリックします。

GKE StandardとGKE Autopilotが選択できるようになっていますね。
それぞれの特徴は比較から確認できますが、詳しくはこちらを参考にしてみてください。
今回はタイトルにもある通り、Autopilotでいきます!
クラスタの設定としては主に、名前、リージョン、ネットワーキングを設定します。
- 名前:任意
- リージョン:asia-northeast-1
- ネットワーキング:一般公開クラスタ
- ネットワーク:作成したVPC
- ノードのサブネット:作成したサブネット
名前は任意、リージョンはこだわりがなければasia-northeast(東京)で良いと思います。
ネットワーキングは一般公開クラスタを選択。
VPCは自分で作成していればそちらを選択しても良いですし、defaultでも問題ないと思います。
後の項目はデフォルト値にしておきました。
これで作成を押してしばらくするとクラスタが作成されます。
デプロイメントの作成
次にDeploymentを作成します。
「ワークロード」へ進み、デプロイをクリックします。
ここで実行するコンテナを選択して環境変数を設定します。

イメージパスのところにある「選択」から、Container RegistryやArtifact Registryにあるイメージも選択できます。
あとはアプリケーション名と名前空間を設定して、先ほど作成したクラスタを選択してデプロイします。
最初はエラーが出ますが、しばらくすると正常になります。
しばらく経ってもエラーの場合はコンテナが起動できていない可能性が高いです。
ログを見て調査してみてください。
サービスの作成
次にサービスを作成します。
先ほど作成したワークロード(Deployment)を選択し、詳細ページへ行くと「サービスの公開」という項目があります。
ここからサービスを作成します。
作成済みなので画像が用意できないのですが、フロントエンド用とバックエンド用のサービスを作成します。
どちらもロードバランサを選択します。
- フロントエンド:80ポート→3000ポート
- バックエンド:80ポート→8080ポート
これでパブリックなエンドポイントが払い出されます。
それぞれのエンドポイントにアクセスしてみると動作が確認できると思います。
ただ、このままだとエンドポイントが2つになっているので1つにします。
Ingressの作成
「ServiceとIngress」から「INGRESS」を作成します。
先ほど作成した2つのサービスがあると思うので、2つを選択して「INGERESSの作成」をクリックします。
Ingressタイプは外部を選択します。
「Host and path rules」でパスルールを設定します。

- 一致しないすべてのURLパス(デフォルト)→フロントエンドのサービス
- /api/v1/* →バックエンドのサービス
へ向くように設定します。
Hostsは特に指定しなくても大丈夫です。
動作確認
「ServiceとIngress」の「INGRESS」タブに作成したIngressが表示されます。
作成したIngressにエンドポイントが表示されているので、そのエンドポイントにアクセスしてみてください。
トップページ、/api/v1/配下にアクセスしてみて、それぞれフロントエンド、バックエンドに接続できればOKです。
あとはドメイン割り当てたり、必要に応じてIP制限をかけたりって感じですね!
あとがき
インフラを触るようになって4年ほど経つのですが、ずっとAWSだったのでGCPを使ったことはありませんでした。
GCPも同じようなものだと思っていましたが、細かい部分で結構違う部分ありますね。
GCPにはGCPの良さがありそうですね!