KubernetesをGKEで動かしてみる

Dockerにおけるコンテナ連携、Docker composeの仕組みや動作を確認できました。
[DockerHubへのアップロード、コンテナ連携(アプリコンテナ→DBコンテナ)](https://qiita.com/tamata78/items/c9483a152c179a4811e7)

続いて名前は聞くけど、仕組みがよくわかっていないKubernetesについて、環境設定と動作確認してみたいと思います。

Kubernetesの概要については異常にわかりやすい記事があったので、こちらをご参照ください。
[Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介](https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)

# 環境
macOS High Sierra
Google Cloud SDK v245.0.0(GCP)
Google Kubernetes Engine v1.14.6(GKE)

GCPの無料枠は、12ヶ月 300$の無料クレジットとAlways Freeがあります。
期間終了後でも無料枠内(Always Freeの使用制限内)ならば、
仮想マシン1台を無料で利用し続けることができます。

GCP Always Free の使用制限
https://cloud.google.com/free/docs/gcp-free-tier?hl=ja#always-free-usage-limits

# GCP、GKEの環境設定

本家サイトに従って設定。
[クイックスタート | Kubernetes Engine のドキュメント](https://cloud.google.com/kubernetes-engine/docs/quickstart?hl=ja)

ローカルに以下をインストール

- Google Clound SDK(gcloud)
- kubectl

## インストール途中でのエラー
```bash
$ ./google-cloud-sdk/install.sh
・
・
httplib2.python2.httplib2.SSLHandshakeError: [SSL: CERaTIFICATE_VERIFY_FAILED] certificate verify failed

$ pip install --upgrade httplib2
$ gcloud -v
Google Cloud SDK 245.0.0 
```
インストール途中で以下のエラー発生、httplib2内のOpenSSLが古いのが原因のようだったので、httplib2をupgradeして、無事インストール。
https://github.com/googleapis/google-api-python-client/issues/478

gcloudの各種ツールが古いと警告が出る場合は、最新バージョンに更新。

```
# bq, gsutil, kubectlなどもろもろ最新化される
$ gcloud components update
```

## gcloud のデフォルト設定

コマンド実行時に都度、設定しなくても良くするために
リソース管理で作成したプロジェクトのIDと、無料枠のリージョン(US)のゾーンをデフォルト設定。

```bash
$ gcloud config set project <プロジェクトID>                                                                      [16:16:40]
Updated property [core/project].
~
$ gcloud config set compute/zone <ゾーン> # ゾーンの指定例：「us-west1-a」                                                                [16:19:01]
Updated property [compute/zone].
```

## GKEで管理するクラスタの作成

使用するGoogleアカウントで、Kubernetes Engine APIが有効になった状態で、クラスタ作成
masterとnode(デフォルトで３つ)が立ち上がります。

```bash
$ gcloud container clusters create 【クラスタ名】 #今回はクラスタ名は、「mygke-cluster」と指定
・
・
kubeconfig entry generated for mygke-cluster.
NAME           LOCATION    MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
mygke-cluster  us-west1-a  1.13.7-gke.8    104.196.236.205  n1-standard-1  1.13.7-gke.8  3          RUNNING
```

クラスタ作成時に、googleアカウント未ログインの場合は、以下コマンドでログインしてから、作成してください。

```bash
$ gcloud auth login
```

# クラスタ上でNginxコンテナを作成

ここからは、以下ハンズオン記事の内容を試してみます。  
[kubernetes初心者のための入門ハンズオン](https://qiita.com/mihirat/items/ebb0833d50c882398b0f#1%E3%82%A4%E3%83%B3%E3%83%88%E3%83%AD%E3%83%80%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)

## Nginxコンテナをnodeのpod内に作成
Docker HubからNginxのイメージを取得。nodeにpodを作成して、その中にNgnxコンテナが作成されます。  

```bash
$ kubectl run nginx --image=nginx:1.11.3

# podを確認
$kubectl get pods                                                                                           [17:08:23]
NAME                     READY   STATUS    RESTARTS   AGE
nginx-694b4b8479-v5xwr   1/1     Running   0          5m2s
```

## Nginxコンテナを外部からアクセス可能にする

```bash
$ kubectl expose deployment nginx --port 80 --type LoadBalancer
```

外部からアクセス可能とすると、Serviceが作成される。
Serviceは、clusterIPのルーティングとロードバランシング機能のkube-proxy
を持っていて、podへの橋渡し役。

作成されたServiceを確認する。
nginxコンテナを内包するpodに対応するServiceがnginxという名称で作成される。もう一つのkubernetesは、マスタ用のServiceらしい。

```bash
$ kubectl get services                                                                                       [20:05:10]
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.51.240.1     <none>          443/TCP        3h21m
nginx        LoadBalancer   10.51.245.164   35.230.64.204   80:31112/TCP   136m
```

作成したロードバランサーを通して、Service → nginxコンテナとアクセスできる。
ロードバランサーIP(EXTERNAL-IP)にアクセスして「Welcome to nginx!」と画面に表示されればOK

# 使い終わったpod, service, クラスタを削除する
サクサク作れるけど、作ったものを消さないと容量圧迫するので、こまめに消す。

```bash
$ kubectl delete pods --all                                                                                  pod "nginx-694b4b8479-v5xwr" deleted

$ kubectl delete services --all                                                                              service "kubernetes" deleted
service "nginx" deleted

$ gcloud container clusters delete <cluster_name>
$ gcloud container clusters list

$ kubectl config delete-context <cluster_name> # 接続情報も消す                              deleted context gke_xxxxxx_us-west1-a_mygke-cluster from /Users/user_name/.kube/config
$ kubectl config get-contexts                                                                            

```