Terraformを用いたGKE構築

## 目的

+ Kubernetes(以下、k8s)環境をサクッと体験してみたい :beginner: 
+ k8sもコードで `管理` したい :computer:  
+ etc...

## 使用するアプリケーション

+ [GCP](https://cloud.google.com/?hl=ja)
    + Google社が提供しているクラウドプラットフォーム
    + このサービスの中の[Kubernetes Engine](https://cloud.google.com/kubernetes-engine/?hl=ja)を使います
+ [Terraform](https://www.terraform.io/)
    + HashiCorp社製のコード管理ツール
    + k8sのスペック管理や構築に使います
+ [Docker](https://www.docker.com/)
    + 言わずとしれた仮想化コンテナ技術
        + 詳しくは他の記事を参考にして下さい:bow:
    + 今回は[Docker for Mac](https://www.docker.com/docker-mac)を用いて、Terraformの実行環境をコード化します
+ [git](https://git-scm.com/)
    + コードの管理・受け渡しに使います

## 準備

### GCPの準備・開設

+ 他に詳しく書いてる方が沢山いますので割愛します。

### GCP上のサービスアカウントキー取得

[https://console.cloud.google.com/home/]

+ APIとサービス > [認証情報]をクリック
    + [認証情報を作成]をクリック
        + [サービス アカウント キー]をクリック

+ 下記のように新しくサービスアカウントを作成する
    + :warning: 役割は適宜変更して下さい

![2018-03-17-01.png](https://qiita-image-store.s3.amazonaws.com/0/25582/267d250f-4d99-22f5-f290-9c295f944426.png)



+ json形式のサービスアカウントをダウンロード

### ソースのclone

+ お手元の環境にソースをcloneします

```
cd ${作業ディレクトリ}
git clone https://github.com/iganari/try-gke.git
cd try-gke
```

### 認証情報の設置

+ 先程ダウンロードした認証情報のjsonを `service-account.json` という名前に変更します

```
## 例
mv hogehoge.json service-account.json
```

+ リネームしたjsonを先程cloneしたディレクトリにコピーします


```
$ ls -1 try-gke/
Dockerfile
docker-build-run.sh
etc/
main.tf
operation-tf-build.sh
operation-tf-remove.sh
readme.md
service-account.json        <--------- これ
service-account.json.sample
terraform/
variables.tf
```

### 起動設定の変更

+ `variables.tf` の中にGCP上のプロジェクト名やk8sクラスターの名前やノードの数、バージョンを記入するとこがあるので適宜編集しましょう

```
vim variables.tf
```

+ 最低限変更が必要な項目
    + project
    + master_auth_password
    + min_master_version(※ 古いバージョンになった場合)
    + node_version(※ 同上)

### dockerの起動

:warning: dockerコマンドがsudo無しで起動出来る環境を想定していますので適宜環境にあわせて `sudo` 等をつけて下さい

```
sh docker-build-run.sh
```

+ 起動すると コンテナの中にログインしています :whale: 
    + 以下の作業で :whale: があるものは上記のコンテナ内での作業(コマンド)です

### Terraformの初期作業

Terraformを使用するための初期作業が必要になるのでコマンドで実施します。

+ :whale: terraformの初期設置

```
./terraform/terraform init
```

+ 結果
    
```
Terraform has been successfully initialized!
```

### Terraformを使って、GKE上にk8sクラスターを起動

+ :whale: terraformの実施

```
sh operation-tf-build.sh
```

+ しばらくすると、GKE上に任意のK8sが作成出来きてます :ok_woman: 

<img width="765" alt="2018-03-17-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/25582/5bfa7292-e358-1703-6c8d-238f00ca7034.png">


### k8sにアクセスしてみる

このままだと外からk8sを見ているだけなので、k8sの内部にアクセスしてみる

+ :whale: 環境変数を抜き出す

```
export client_email=`cat service-account.json | grep client_email | awk -F\" '{print $4}'`
```
```
export project_id=`cat service-account.json | grep project_id | awk -F\" '{print $4}'`
```
```
export myid=`cat terraform.tfstate | jq -r '.modules[].resources[].primary.attributes.id''`
```
```
export myzone=`cat terraform.tfstate | jq -r '.modules[].resources[].primary.attributes.zone'`
```



+ :whale: GCPに対してgoogle authを通す

```
gcloud auth activate-service-account \
            ${client_email} \
            --key-file ./service-account.json \
            --project ${project_id}
```

+ :whale: 今回作成したk8sに対して、kubectl コマンドのアクセスを作成する

```
gcloud container clusters get-credentials \
                 ${myid} \
                 --zone ${myzone} \
                 --project ${project_id}
```

+ :whale: Kubernetes コントロール プレーンへのプロキシを開始する

```
kubectl proxy --address='0.0.0.0' &
```

+ ブラウザで確認する
    + http://127.0.0.1:8001/ui


<img width="734" alt="2018-03-17-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/25582/0922d951-f49d-0d21-0810-ecaf47124d3e.png">

### これで手元の :whale: とGKE上のk8sを繋ぐことが出来ました :ok_woman: 



### 破棄

作業が終わったら、各リソースを削除しておきましょう

+ :whale: terraformによるk8sの削除

```
sh operation-tf-remove.sh
```

+ :whale: コンテナの破棄

```
exit
```

## :warning: 注意点

clusterの数を変更する場合、一度全てのnodeが破棄されるためサービス維持に難有り。