Web開発

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

gke-autopilot

自分の中で「コンテナオーケストレーションサービスといえばECS!」という感じになりつつあったので今回はKubernetesに挑戦してみました。

Kubernetesは学習コスト、運用コストともに高いと聞くのであまり手が出せなかったのですが、個人開発ということもあって思い切って挑戦してみました。

更に今回は慣れ親しんだAWSを離れてGCPを選択。

EKSを飛ばしてGKEに挑戦してみました。

そこで今回はその過程について解説していきます!

始めてなのでコンソールでポチポチしながら構築します。

構成

フロントエンドはNuxtで構成されていて、そこからGoで構成されたバックエンドAPIをコールするシステム構成となっています。

よくある構成ですね。

ECSを使って構成するならこんな感じになるかなって思います。

私のようにAWSはわかるけどGCPはわからないって人もいると思うので載せておきます!

AWSインフラ構成図

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

GCPインフラ構成図

若干書き方違いますが、

  • EC2 Instance 1 = Kubernetes Pod 1
  • EC2 Instance 2 = Kubernetes Pod 2
  • ALB = GKE Ingress, Cloud Load Balancing 1, Cloud Load Balancing 2

って感じになります。

ALBのリスナーごとにロードバランサ(Cloud Load Balancing)を作成して、その上にもう1つロードバランサ(GKE Ingress)を作成してそれぞれに振り分けるイメージ?

クラスターの作成

では早速構築してみましょう!

GCPの場合は各サービス(Compute Engine, Kubernetes Engine等)を利用するときにAPIを有効化する必要があります。
始めてページを開くときに有効化する画面に遷移するので必要に応じて有効化してください。

まずはクラスタを作成します。

GCPコンソールの「Kubernetes Engine」の「クラスタ」へ進み、作成をクリックします。

クラスタを作成

GKE StandardとGKE Autopilotが選択できるようになっていますね。

それぞれの特徴は比較から確認できますが、詳しくはこちらを参考にしてみてください。

https://lp.cloudplatformonline.com/rs/808-GJW-314/images/App_Modernization_OnAir_q3_0728_Session1.pdf

今回はタイトルにもある通り、Autopilotでいきます!

クラスタの設定としては主に、名前、リージョン、ネットワーキングを設定します。

  • 名前:任意
  • リージョン:asia-northeast-1
  • ネットワーキング:一般公開クラスタ
  • ネットワーク:作成したVPC
  • ノードのサブネット:作成したサブネット

名前は任意、リージョンはこだわりがなければasia-northeast(東京)で良いと思います。

ネットワーキングは一般公開クラスタを選択。

VPCは自分で作成していればそちらを選択しても良いですし、defaultでも問題ないと思います。

後の項目はデフォルト値にしておきました。

これで作成を押してしばらくするとクラスタが作成されます。

デプロイメントの作成

次にDeploymentを作成します。

ECSだとタスク定義に近いイメージ?

「ワークロード」へ進み、デプロイをクリックします。

ここで実行するコンテナを選択して環境変数を設定します。

イメージパスのところにある「選択」から、Container RegistryやArtifact Registryにあるイメージも選択できます。

あとはアプリケーション名と名前空間を設定して、先ほど作成したクラスタを選択してデプロイします。

最初はエラーが出ますが、しばらくすると正常になります。

しばらく経ってもエラーの場合はコンテナが起動できていない可能性が高いです。

ログを見て調査してみてください。

サービスの作成

次にサービスを作成します。

ECSのサービスとは違って、コンテナで実行されているアプリケーションを外部に公開するためのものってイメージ?

先ほど作成したワークロード(Deployment)を選択し、詳細ページへ行くと「サービスの公開」という項目があります。

ここからサービスを作成します。

作成済みなので画像が用意できないのですが、フロントエンド用とバックエンド用のサービスを作成します。

どちらもロードバランサを選択します。

  • フロントエンド:80ポート→3000ポート
  • バックエンド:80ポート→8080ポート

ポート番号は自分のシステムに合わせて読み替えてください。

これでパブリックなエンドポイントが払い出されます。

それぞれのエンドポイントにアクセスしてみると動作が確認できると思います。

ただ、このままだとエンドポイントが2つになっているので1つにします。

Ingressの作成

「ServiceとIngress」から「INGRESS」を作成します。

ALBのリスナーのようなイメージ?

先ほど作成した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の良さがありそうですね!