こんにちは。
キャスレーコンサルティング LS(リーディング・サービス)部の平井です。

今回は、Google Cloud PlatformのKubernetes Engineを使用し、Kubernetesについて解説いたします。

この記事では、Kubernetesの概念の基礎的な部分と、
Kubernetes上で、アプリケーションをデプロイするまでの初歩的な部分を解説します。

皆様がKubernetesに入門するための手助けになれば、幸いです。

目次

  • 概要
  • 用語解説
  • デプロイのための準備
  • デプロイ
  • 終わりに

概要

Kubernetesの公式ページをみてみると、このように説明されています。
"Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications."

ざっくりとまとめますと、コンテナ運用を助けてくれるシステムがKuberntesなのです!!

コンテナ技術自体についての説明は、本稿の目的と異なるので割愛させて頂きます。

用語解説

Kubernetesには、専門の概念・用語があります。

全てを説明することは出来ないので、
今回は、Deployment、Replicaset、Podの3つを説明したいと思います。

Deployment
    ローリングアップデートやロールバックといった、デプロイ管理の仕組みを提供するもの。
    replicasetを生成・管理する。
ReplicaSet
    指定したテンプレートに従った、正しい数のPodが
    常に動いているようにするPodを管理するオブジェクト。
Pod
    同じ実行環境上で動く、アプリケーションコンテナとストレージボリュームの集まりで
    Kubernetesに置ける最小単位。

実際にサンプルを動かしてみて、
これら3つの概念が実際には、どのように動いているかを確認してみましょう。

デプロイのための準備

今回は、GoogleCloudPlatformが提供しているサンプルの中から、
アクセスすると、Hello world!を返すアプリケーションをデプロイしてみましょう。

サンプルを動かす前に、いくつか準備することがあります。
以下の作業は全て、CloudShell上で行います。

CloudShellは、GoogleCloudPlatform Consoleの赤枠の部分をクリックすると起動します。

まずは、サンプルコードを取得しましょう。
$ git clone -b master https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git

続いて、アプリケーションで使用するdocker imageを作成します。
以下のディレクトリに移動して、コマンドを実行します。
$ cd kubernetes-engine-samples/hello-app/
$ docker build -t us.gcr.io/{project-id}/hello-app:1.0 .
{project-id}には、GoogleCloudPlatformのプロジェクトIDを入れて実行してください。

先ほど作成したdocker imageを、Container Registryに登録します。
Container Registryは、GoogleCloudPlatform上にDockerコンテナイメージを
プライベートに保存しておけるサービスになります。
$ gcloud docker -- push us.gcr.io/{project-id}/hello-app:1.0

アプリケーションをデプロイするための設定を行います。
使用するゾーンを設定します。
$ gcloud config set compute/zone us-central1-a

続いて、使用するクラスタを設定します。
$ gcloud config set container/cluster clluster-1

最後に、Kubernetes Engineを使用するための情報を設定します。
$ gcloud container clusters get-credentials cluster-1

最後に、manifestのコンテナイメージを指定する箇所を修正しましょう
赤枠で囲まれている部分を、プロジェクトIDに書き換えましょう。

ここまでで、デプロイする準備が整いました。

デプロイ

ようやくデプロイです。
次のコマンドを実行しましょう。
$ kubectl create -f manifests/helloweb-deployment.yaml

デプロイしたアプリケーションに、IP Adrressを付与します。
$ kubectl expose deployment helloweb --type "LoadBalancer"

アプリケーションがちゃんと動いているかを、確認してみましょう。
$ kubectl get service helloweb
上記のコマンドで確認したEXTERNAL-IPにアクセスすると、以下の結果が得られました!

アプリケーションが無事動いていますね。一安心です。

続いて、用語で解説したDeployment、ReplicaSet、Podが
実際にデプロイされているか確認してみましょう。
$ kubectl get deployment
$ kubectl get replicaset
$ kubectl get pods

全てデプロイされていることが確認できました。

ここで、podを削除してみましょう。
$ kubectl delete pod -l app=hello

本当に削除されたか、確認してみましょう。
$ kubectl get pods

あれ、podはまだ動いていますね?しかし、赤枠の部分が異なっています。
これは用語での説明にもありました通り、
常に設定通りのPod数をキープする、ReplicaSetの働きによって、Podが復活したためです。

最後に、Deployment、ReplicaSet、Podをまとめて削除します。
$ kubectl delete -f manifests/helloweb-deployment.yaml

これで、Kubernetes Engine上にあった、Deployment,ReplicaSet,Podが全て削除されました。
以下のコマンドを実行して、削除されているかを確認してみてください。
$ kubectl get deployment
$ kubectl get replicaset
$ kubectl get pods

終わりに

以上で、Kubernetesの初歩的な説明とチュートリアルを終了致します。

今回触れた部分は、とても初歩的な部分なので
「Kubernetesにどのようなメリットがあるか」を実感するまでは行かなかったと思います。
より深い部分に触れたい方は、公式のドキュメントや書籍を参考にして、色々実験してみてください!
私もコツコツと勉強していこうと思いますので、一緒に学んでくれる同志を募集しています!

以上です。
最後まで読んでいただき、ありがとうございました。

平井 拓海
CSVIT事業部 LS(リーディングサービス)部 平井 拓海
GoogleCloudPlatformを活用した開発・運用・保守に携わっています。