GKE Autopilot クラスタ構成で簡単にk8s環境を利用してみる
- Google Cloud
- インフラ
- コンテナ
- やってみた
投稿日:
はじめに

Google Cloudでは、コンテナを利用するためのサービスが複数あります。
単純なアプリケーションの利用ではCloud Runで手軽に利用できますが、本格的なコンテナ利用環境としては、今ではコンテナオーケストレーションのデファクトと言えるKubernetesをベースとしたサービスであるGoogle Kubernetes Engine(GKE)があります。
Kubernetes自体、元々Google初のオープンソースソフトウェアでしたが、Googleのサービスとして、このOSSソフトウェアの運用管理をマネージドサービス化してユーザーに提供することで、高度な専門知識が無くともKubernetesのメリットを享受できる環境を提供することができるようになりました。
初期のGKEでは管理ノード(Control Plane)のマネージドサービスによる構築管理負荷低減を実現していましたが、のちに追加されたAutopilotクラスタにおいては、Worker Nodeまで含めた自律的なフルマネージドサービスとしてKubernetesクラスタ環境を提供できるまでになりました。
本記事では、いかに簡単にKubernetesクラスタを構築できるか、構築手順を実際に確認してみたいと思います。
本記事でのゴールは、nginxのWebサイトをKubernetesクラスタで実行するまでの構築手順を見てみたいと思います。
事前準備
Google Cloud のプロジェクトを作成し、課金を有効にしておきます。
ここでは詳細は割愛します。Googleのドキュメントを参照してください。
APIの有効化
初めに、Kubernetes Engine API を有効化します。
プロジェクトで有効にされてないAPIがある場合、暗黙的にそれらの関連APIも有効化されます。
APIの有効化方法はいくつかありますが、ここではKubernetes Engine のページから有効化します。
Google Cloud のコンソールにログインし、左メニューから Kubernetes Engine を選択します。

APIが有効になっていない場合、有効化の画面に遷移します。

「有効にする」を押下します。
これにより必要なAPIが有効化され、Kubernetes Engine の「クラスタ」画面に遷移します。
クラスタ作成
「Kubernetes Engine」→「クラスタ」の画面が表示されています。

クラスタの作成を開始します。
ウィザード形式で進める事が出来ます。
「作成」を押下します。

初めてアクセスする場合は、ガイド画面が表示される場合があります。

青色のメッセージのところの説明を確認して進めてください。
ガイドを完了しますと、Autopilotクラスタ作成のウィザードが始まります。
Autopolotクラスタの作成

クラスタの基本
「クラスタの基本」の画面では、クラスタ名とデプロイ先のリージョンを指定します。
画面に書かれている命名ルールに従って名前を指定し、デプロイ先のリージョンを指定します。クラスタは単一のリージョンにデプロイされます。後から変更はできません。
本記事ではデフォルト値を指定します。
「次へ: フリート登録」を押下します。
フリート登録

フリートはクラスタを登録管理する概念です。
ここで指定しない場合、クラスタ作成するプロジェクトのフリートにこのクラスタが登録されます。この項目をスキップしてあとから別プロジェクトのフリートにクラスタを登録することもできます。

ここではこのプロジェクトのフリートを作成してクラスタを登録することにします。
チェックボックスをチェックして、フリート名を入力します。
デフォルトでプロジェクト名を含む文字列が生成されます。
入力して、「次へ: ネットワーキング」を押下します。
ネットワーキング

クラスタの使用するネットワークを指定します。
利用するVPCとサブネットを指定します。
本記事では Compute Engine を有効にした際に作成されるデフォルトVPCとデフォルトサブネットを使用します。
IPv4ネットワークアクセスでは、GKEクラスタのサービスの公開範囲を選択します。
一般公開クラスタは、インターネット上からのアクセスを許可することを意味します。
限定公開クラスタは、Podやノードに内部IPのみわりあてられるため、GKE単体ではインターネット上からGKEクラスタ上のPodにアクセスすることが出来なくなります。
また、外部IPがワーカーノードに割り当てられないため、そのままではPodからのインターネットアクセスはできず、Cloud NATを経由する必要があります。
実際のシステム運用の観点からは、限定公開クラスタにする方がよりセキュアな構成とすることができます。
本記事では単純なクラスタ構成とするため、一般公開クラスタを選択します。
デフォルトのプラベデフォルトのプラベートエンドポイントサブネットをオーバーライドする
この項目は限定公開クラスタを選択した際に割り当てられるコントロールプレーンのプライベートエンドポイント(VPCネットワークないの内部IP)のアドレス範囲を、デフォルトであるクラスタのサブネットから別のネットワークを指定したい場合に設定します。
- コントロールプレーンのグローバルアクセスを有効にする
- コントロールプレーンの承認済みネットワークを有効にする
これらの設定は、限定公開クラスタにおいて、コントロールプレーンへのアクセスの制限をどうするかについての設定です。適切な制限することで、不正なアクセスを防ぐことができますが、ネットワーク全体のアクセス経路に関わるため、管理者のアクセス経路などを含めて検討が必要です。本記事では詳細は省きますが、オンラインドキュメントを参照して構成について検討してください。本記事では一般公開クラスタとするため、これらの項目は設定しません。
参考ドキュメント
https://cloud.google.com/kubernetes-engine/docs/concepts/private-cluster-concept?hl=ja
「次へ: 詳細設定」を押下します。
詳細設定

リリースチャンネルの設定は、GKEのKubernetesのバージョンアップのタイミングを設定するための機能です。
デフォルトでは、Kubernetesのオープンソースでアップデートがリリースされてから、およそ2~3か月後の時期にバージョンアップが行われます。より早いタイミングでバージョンアップをさせる設定(Rapid)もありますが、この場合GKE SLAから除外されることになるため、安定した運用をするにはデフォルトか、より期間を長くもつStableのチャネルを設定すると良いでしょう。
これ以外の設定については、各項目の右の矢印を押下すると、設定項目が表示されます。
今回の記事では各項目ともデフォルトとします。
「次へ: 確認と作成」を押下します。
確認と作成

この画面では、これまでの設定内容が表示されます。
内容を確認後、「クラスタを作成」を押下すると、クラスタの作成が開始されます。
Kubernetesクラスタの画面に遷移しますが、ステータスが緑のチェックマークに変わるまでは作成作業が進行しているので待ちます。環境によりますが、数分~十数分程度でクラスタ作成が完了します。
コンテナのデプロイ
コンテナ
次に、サンプルのコンテナをデプロイして動作を確認します。
今回は単純にDocker HubにあるnginxのコンテナをデプロイしてWebサーバにブラウザからアクセスしてみます。

Kubernetesクラスタの画面上部の「デプロイ」を押下します。
Deploymentの作成
コンテナ

今回はDocker Hubのnginxの最新版を利用するため、既存のコンテナイメージを選択し、イメージパスに nginx:latest を入力します。
環境変数や初期コマンドは指定せず、「完了」を押下します。

コンテナイメージパスが表示されたのを確認し、「続行」を押下します。
構成

この項目では、デプロイするコンテナのDeployment名やnamespace、Key-Valueによるラベルの追加、DeploymentのYamlファイルなど指定できますが、今回の記事ではデフォルト値で設定します。
「続行」を押下します。
公開(省略可)

この項目を設定すると、コンテナのデプロイと同時にサービスを外部公開します。
今回はすぐにアクセスを試すため、「Deployment を新しいサービスとして公開する」にチェックを入れます。

チェックを入れるとポートマッピングの設定ができるようjになります。
コンテナのポートと、このDeploymentで公開するポートをマッピングします。
今回デプロイするnginxのコンテナは、tcp:80のポートでプロセスがリッスンしますので、これにマッピングすればnginxのプロセスにアクセスできることになります。
デフォルトで表示されている設定は、Deploymentのポート80をマッピングすることを意味しています。
ターゲットポート(コンテナ側のポート)として同じポートをマッピングする場合は、ターゲットポートの記述は省略できます。
プロトコルはコンテナ側の指定ポートでサポートされるプロトコルを指定します。
サービスタイプにロードバランサを選択すると、ロードバランサが構成されるので、デプロイ後のエンドポイントIPアドレスを持つ外部ロードバランサが構成されます。
「デプロイ」を押下するとデプロイが開始されます。

デプロイの詳細画面で進行状況を確認できます。
最終的にデプロイメントの詳細画面に遷移します。

この際、デプロイ完了直後は画面描写のタイミングの関係でエラーのような画面が出ることがありますが、デプロイが完了すれば正常になるので少し時間をおいてリロードしてみてください。

正常な状態になると、そのDeploymentのCPU等のグラフ等が表示されます。
画面を下にスクロールして、エンドポイントの情報を確認します。

エンドポイントのIP:Portにブラウザでアクセスすると、nginxのWelcome画面にアクセスできます。

今回の記事の内容はこれで終了となります。
おまけ【クラスタの削除】
最後に今回動かした環境を削除します。
Kubernetesクラスタの画面に遷移します。

対象のクラスタ名の右端の … を押下するとメニューが表示されるので、「削除」を選択します。

削除の確認画面になるので、テキストボックスにクラスタ名を入力し、「削除」を押下します。

クラスタの削除が開始されるので、削除完了まで待ちます。
クラスタ名が消えれば削除完了です。お疲れさまでした。
次回予告
本記事ではGKEクラスタのデプロイについて触れましたので、次はコンテナの作成についての記事を掲載予定です。
ご期待ください!