Google CloudのGKEでKubernetesを簡単に使ってみよう

## はじめに
　今回は、近年のモダナイゼーションにおいて広く使われている、Kubernetes について簡単に解説し、後半では Google Cloud の Kubernetes サービスである GKE を使うことで、簡単に構築ができるところをご紹介したいと思います。
 
## モダナイゼーションとコンテナ

　モダナイゼーションは、直訳すると「現代化」といった意味になりますが、コンピュータシステムにおけるモダナイゼーションとは、諸説あるものの、概ねいわゆる「オンプレミス」と呼ばれる古いシステムを最新技術を使って新しいものにしていく、といった意味になるかと思います。（モダナイズに関する記事は、近日別途ご紹介したいと思います）その際に使われるコンテナはモダナイゼーションの手法としては、コンテナ化といって、Docker とか Kubernetes を使うものが有名です。これまでは、VMWare などによりサーバ仮想化を行う方法が多く使われてきましたが、Broadcom による VMWare 社の買収やライセンス変更などにより、今後コンテナへのシフトが進んで行くのではないかと思っています。

## Dockerとは
　コンテナの実行環境（コンテナエンジン）を提供する代表的なソフトウェアが「Docker」です。

サーバ仮想化に比べ、
　・オーバヘッドが小さく軽量
　・コンテナ内に構成した内容をパッケージングして持ち運ぶことができる(ポータビリティ)
といった特徴があります。
ただ、Docker だけだと、基本的には１台のサーバをコンテナにするところまでの技術となります。

## Kubernetes（K8s）とは

　コンテナ（Docker）を商用システムとして活用するうえで生じた課題に対応したものになります。Docker の課題としては、下記のようなものがあります。

・デプロイが手作業で面倒
・複数コンテナの管理、連携、運用が難しい
・コンテナイメージの運用（リビルドなど管理が面倒）
・コンテナ障害発生時の対応が難しい

Kubernetes は、コンテナ(Docker)の課題を解決するための仕組みと言えます。

## Kubernetes の仕組み

 Kubernetes を実現するには、下記のような構成が必要となります。
 コンテナを効率的に管理する仕組みではあるのですが、結構複雑になります。
・クラスター
　Kubernetes のリソースを管理する集合体。ノード、ポッドなどで構成されます。
　実際のシステムにおいては、複数のクラスターによって構成されています。
・ノード
　ノードはマスターノードと通常のノードに分類されます。
　・マスターノード：Kubernetes を管理するために利用するノード。
　・ノード(通常の)：アプリケーションなどを実際に実行するノード。
・ポッド
　通常のノードの中に存在し、最低１つのコンテナを有しています。
　Kubernetes にデプロイする場合は、ポッド単位で行われます。
・コンテナ
　このコンテナは Docker コンテナのことです。
　１つのアプリケーションの立ち上げが可能です。

## Google Cloud の GKE とは
　Kubernetes は、複数のコンテナを構成する際に非常に有用な仕組みですが、Kubernetes 自体が結構複雑な構成となっており、これらを実際にサーバを構成して使うには、難しいものとなります。
　Kubernetes を簡単に構築する仕組みが、パブリッククラウド各社より提供されていますが、その一つがGloogle Cloud から提供されている GKE（Google Kubernetes Enjine）です。

　実は、Kubernetes は Google のエンジニア、Rohit Seth氏がそのコンセプトを2006年のメールで説明したことから始まったもの。ということもあってか、Google Cloud の GKE が機能的にも料金面でも最適な選択肢ではないかと思います。

GKE クラスタのアーキテクチャ
　GKE クラスタを作成すると、
　・コントロールプレーン (マスターノード) 
　・ノード (ワーカーノード) 
　の 2 種類のコンポーネントが自動で構築されます。

※クラスタの運用モードに、Autopilot モードと Standard モード という 2 種類があり、Autopilot モードでは、マスターノード、ワーカーノードの両方とも自動で作成できます。
 
## GKE クラスタをデプロイして公開する
　前置きが長くなりましたが、Google より提供されている、Google Cloud Skills Boost にて、実際にクラスタを作成してみました。予想以上に簡単にできるので、見てみてください。

手順
　①Cloud Shell を使用して GKE クラスタを生成する
　②kubectrl コマンドを使って、イメージのデプロイを行う
　③kubectrl コマンドを使って、公開（expose）を行う

## ①Cloud Shell を使用して GKE クラスタを生成する
　Google Cloud の初期画面より、Cloud Shell を起動（下図赤丸部分）します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/0764a563-6c4d-812d-1833-2286ecabf283.png" width=100%>

デフォルトのコンピューティングゾーンを設定後、GKEのクラスタ生成コマンドを実行します。

```:Cloud Shell（例）
gcloud container clusters create --machine-type=e2-medium --zone=us-central-c test-cluster
```
※上記の例で、
　「e2-medium」部分は、ノードに使用する Compute Engine のマシンタイプ
　「us-central-c」部分は、クラスタを構築するゾーン
　「test-cluster」部分は、クラスタ名（任意）
 　となっており、適宜指定してください。

たったこれだけのコマンドで、指定したゾーンにクラスタ（マスターノード、ワーカーノード）を簡単に構築できてしまいます。
（以下は GKE のコンソールより test-cluster の「NODES」を表示した画面です。１つのポッドと3つのノードが作成されていることがわかります）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/dd93afe4-f4ec-6dad-b3e3-dc0bde9335c6.png" width=80%>

## ②kubectrl コマンドを使って、イメージのデプロイを行う
　続いて、クラスタにアプリケーションイメージのデプロイを行います。まず、
```:Cloud Shell（例）
gcloud container clusters get-credentials test-cluster
```
を実行して、クラスタとやり取りするために認証を行っておき、


```:Cloud Shell（例）
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0
```
で kubectl コマンドを使って、test-cluster 上に hello-server というアプリケーションを作成しています。

※上記の例で、
　「hello-server」部分は、アプリケーション名
　「gcr.io/google-samples/hello-app:1.0」部分は、アプリケーションが格納されている場所（リポジトリ）
 　となっています。（Google のサンプルを使用しています）

## ③kubectrl コマンドを使って、公開（expose）を行う
　最後に、デプロイしたアプリケーションを外部に公開します。
```:Cloud Shell（例）
kubectl expose deployment hello-server --type=LoadBalancer --port 8080
```
※上記の例で、
　「hello-server」部分は、アプリケーション名
　「--type=LoadBalancer」部分は、hello-server 用にロードバランサを作成する指示
　「--port 8080」部分は、公開するポート番号を指示
 　となります。

最後に、公開したアプリケーション（hello server）にリクエストしてみます。
 ```:Cloud Shell（例）
kubectl get service
```
を使用すると、下記のようにhello-server用に作成されたパブリックアドレスが表示されます。
 ```:Cloud Shell（出力例）
NAME             TYPE            CLUSTER-IP      EXTERNAL-IP     PORT(S)           AGE
hello-server     loadBalancer    10.xx.244.36    35.xx.234.26   8080:31991/TCP    65s
kubernetes       ClusterIP       10.xx.240.1               433/TCP           5m13s
```
上記の hello-server の EXTERNAL-IP に記載されるアドレス（上記例では 35.xx.234.26 部分）に対して、ブラウザよりアクセスすると、ブラウザに下のように表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/51f1b141-5f70-be12-9941-25927868967f.png" width=100%>

たったこれだけの操作で、Kubernetes にアプリケーションが準備できるというのが驚きです。

## まとめ
　Google Cloud の GKE で Kubernetes を簡単に使ってみようことで、Kubernetes と GKE についてのご紹介と、簡単な実践について行ってみました。
　引き続きいろいろ試して、より役に立つ情報をお伝えできるように頑張ります。