[ GCP ] メガネと学ぶ GCP (7) KubernetesEngine でhelloWorldしてみる

[ GCP ] メガネと学ぶ GCP (7) KubernetesEngine でhelloWorldしてみる

こんばんは、七色メガネです。

今回は、Google Cloud Platform の KubernetesEngine を使用して、簡単なWebアプリを公開し、HelloWorld してみたいと思います。

Kubernetes ってなに?

次の記事でコンテナやKubernetesなどについてまとめていますので、よければご覧ください。

Kubernetesと関連用語について調べてみた。

実装

今回は次のような手順でアプリの実装を行います。

  1. サーバプログラム(webserver.go)およびHTMLファイル(index.html)の作成
  2. Dockerファイル(Dockerfile)の作成
  3. Dockerイメージの作成
  4. ローカル環境でのテスト
  5. Dockerイメージの公開
  6. Kubernetesクラスタの作成(GCP)
  7. イメージのデプロイ
  8. サービスの定義
  9. 動作確認

 

長い…。

1. サーバプログラム(webserver.go)およびHTMLファイル(index.html)の作成

まずはサーバープログラムのHTMLファイルを用意します。

HTMLファイルの中身は適当で良いです。サーバープログラムは前回記事などで使用したものの流用ですが、一応確認しておきます。

AppEngine でデプロイした時には専用のライブラリを使用して http.ListenAndServe の代替としていましたが、今回は使用していません。

2. Dockerファイル(Dockerfile)の作成

次にDockerファイルの作成です。Dockerファイルは、Dockerイメージをビルドするのに必要な情報です。これがなければイメージをビルドすることができません。

今回は次のような構成で作成しています。

実行命令は次の通りです。

「alpine というイメージをベースに対して処理を行う。ポートは8080番をlisten、コンテナに webserver.go と index.html をコピーし、ビルドしつつ webserver.go を起動する。ユーザは指定しない。以後コンテナが起動されるたび、 webserver.go が実行されるようにする。」

各用語の意味は次の通りです。

  • FROM
    ベースイメージを指定します。
  • EXPOSE
    コンテナ実行時にListenするポートを指定します。
  • COPY
    指定ファイルをコンテナにコピーします。
  • RUN
    コンテナ内でコマンドを実行します。
  • USER
    コマンドの実行ユーザを指定します。
  • ENTRYPOINT
    コンテナ起動時に実行するコマンドの引数を指定します。

3. Dockerイメージの作成

次にDockerイメージを作成します。この処理はビルドと言います。
イメージのビルドは次のコマンドで実行できます。

イメージに名前やタグをつけたい場合は、 -t オプションを付与します。

今回は名前とタグをつけて実行してみました。
作成されたイメージを次のコマンドで確認してみます。

test という名前でタグに 0.1 とつけられたイメージが作成できました。

4. ローカル環境でのテスト

では作成したイメージを使ってローカルでコンテナを起動してみましょう。
起動のコマンドは次の通りです。

今回はオプションをつけ、次のように実行します。

オプションの意味は次の通りです。

  • -d
    コンテナをバックグラウンドで起動する。
  • -p
    コンテナのポートをホスト側のポートにバインド(割り当て)します。
    “ホスト側のポート” : “コンテナのポート” という風に記述することで、ホストとコンテナのポートを紐付ける事ができます。今回はDockerファイルを通してコンテナの8080番を開きましたが、ホストの8080番を指定した時にコンテナの8080番に流れるように指定しています。

コンテナを起動させたら、localhost:8080 にアクセスしてみましょう。

コンテナが正常に機能している事がわかりました。

起動しているコンテナの確認と停止は次のコマンドで行います。

 

注意点としては、コンテナを停止させる時に渡す引数はイメージの名称ではなくコンテナの名称であるという点です。コンテナの名称は、指定指定なければ自動で作成されています。docker ps で付与されたコンテナ名称を確認しましょう。

5. Dockerイメージの公開

ここまででDockerイメージの作成が終了したので、作成したイメージをGCPに移動させて行きます。ここでは、GCPの ContainerRegistry というレジストリに配置します。

まずはイメージの名前とタグを、GCP用に付け替えます。

付け替えたら、そのイメージを ContainerRegistry に 移動します。

これで ContainerRegistry にイメージを移動させる事ができました。

6. Kubernetesクラスタの作成(GCP)

次にコンテナを受け入れるクラスタを作成します。

GCPコンソールの KubernetesEngine メニューから、クラスタを作成 を選択します。

クラスタに用いるインスタンスの性能に関する設定を行います。
ComputeEngine から VMインスタンスを作成するときと同じような感じです。
今回はテストなので、基本的にデフォルトのまま進めるものとして詳細は割愛します。
設定後、ページ下部の作成ボタンを押下する事でクラスタが作成されます。

7. イメージのデプロイ

クラスタが作成できたらいよいよイメージをデプロイします。

まずはGCPコンソールのKubernetesEngineメニューからクラスタを選択し、表示される接続ボタンから、CloudShell で作成したクラスタに接続します。

ここでデプロイを行いますが、デプロイに当たってデプロイ設定用のyamlファイルが必要となります。githubに用意しているので、それをここにクローンしましょう。

デプロイ用のyamlファイルは deployment.yaml という名称にしてあります。

内容は次の通りです。

  • Kind
    yamlファイルの種類を明示します。今回の目的はデプロイなので、Deploymentを指定します。
  • image
    使用するイメージを指定します。
  • name
    コンテナにつけるラベルです。
  • containerPort
    コンテナがlistenするポート番号です。

このファイルを使用し、以下のコマンドでデプロイを実行します。
実行後、created のメッセージが出ていれば成功です。

起動したコンテナ(を内包するポッド)のステータスは次のコマンドで確認できます。

 まだ一つ起動中でしたが、デプロイしたコンテナを内包するポッドが正常起動している事がわかります。

8. サービスの定義

これでポッドは起動しましたが、kubernetes ではポッドが起動しただけでは外部からのアクセスができませんので、各ポッドへルーティングを行うサービスを定義する必要があります。

サービス用のyamlファイルは次の通りです。これは先ほどの設定ファイルと同じ場所に格納してあります。

  • Kind
    デプロイの時は Deployment を指定しましたが、今回はポッドではなくサービスの定義なので Service を指定します。
  • port
    サービスがlistenするポート番号です。
  • containerPort
    サービスがルーティングする先のコンテナがlistenしているポート番号です。
  • selector
    ルーティング先のコンテナにつけられたラベル名です。
  • type
    今回サービスのタイプにLoadBalancer を指定します。この機能はルーティングに加え負荷分散も行う事ができます。

デプロイを行ったときと同じ要領で、サービスを起動します。

起動したサービスは次のコマンドで確認する事ができます。

サービスに対して外部IPアドレスが割り振られている事がわかります。

このIPにアクセスする事で、サービスがロードバランサの役割を果たし、先ほど作成したポッド内部のコンテナへ接続を誘導してくれます。

9. 動作確認

これでコンテナのデプロイと、デプロイしたコンテナをもつポッドへのアクセスラインも確定できました。

サービスが提供するIPアドレスにアクセスしてみましょう。

無事、デプロイしたコンテナにアクセスする事ができました。

 

まとめ

  • Dockerイメージを利用することで、KubernetesEngine でアプリを公開できる。
  • 最初のデプロイまでにしなければいけないことは、ちょっと多め。

 

以上です。ここまでご覧いただき、ありがとうございました!

 

参考

Kubernetes 完全ガイド

プログラマのためのGoogleCloudPlatform

GoogleCloudPlatformカテゴリの最新記事