Terraform で GKE(GoogleContainerCluster) のコンテナクラスタを作成

# 前提
- GoogleCloudPlatform のアカウントは取得済み
- Google Cloud SDK インストールおよび認証済み
- terraformはインストール済み（今回の環境では0.6.8）

# 事前作業
GoogleDevelopersConsole にて以下の作業を行っておく

- プロジェクトの作成
- OAuth の同意設定
- サービスアカウントキーの取得（JSON形式）

# 手順
tfファイルと同じ場所に事前に取得したサービスアカウントキーのJSONを置く

■tfファイルを作成

```
variable "project" {}
variable "region" {
  default = "asia-east1"
}
variable "cluster_name" {}
variable "zone" {}
variable "network" {}
variable "initial_node_count" {}
variable "machine_type" {}
variable "disk_size" {}
variable "master_auth_username" {}
variable "master_auth_password" {}

provider "google" {
  credentials = "${file("account.json")}"
  project     = "${var.project}"
  region      = "${var.region}"
}

resource "google_container_cluster" "default" {
  name = "${var.cluster_name}"
  zone = "${var.zone}"
  network = "${var.network}"
  initial_node_count = "${var.initial_node_count}"

  node_config {
    machine_type = "${var.machine_type}"
    disk_size_gb = "${var.disk_size}"
  }

  master_auth {
    username = "${var.master_auth_username}"
    password = "${var.master_auth_password}"
  }

}
```


■terraform.tfvarsの中身

```
project = "************"
cluster_name = "cluster-1"
zone = "asia-east1-b"
network = "default"
initial_node_count = "3"
machine_type = "f1-micro"
disk_size = "10"
master_auth_username = "***********"
master_auth_password = "***********"
```
※f1-micro の場合は、initial_node_count の値は3以上を指定


terraform apply 実行するとコンテナクラスタが作成される


# Kubernetes の Web UI へのログイン
作成したコンテナクラスタの MASTER IP を確認

```
$ gcloud container clusters list
NAME       ZONE          MASTER_VERSION  MASTER_IP        MACHINE_TYPE  NUM_NODES  STATUS
cluster-1  asia-east1-b  1.1.3           ***.***.***.***  f1-micro      3          RUNNING
```
https://{上記 MASTER_IP に表示されているIPアドレス}/ui/ にアクセス
※Basic認証のID・パスワードは terraform の .tfvars に設定した master_auth_username / master_auth_password となります

![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/c949e659-92c9-578e-1fe7-e8e3ab0b17c6.png)




kubectl の認証情報を取得

```
$ gcloud container clusters get-credentials cluster-1
```

ノードの確認

```
$ kubectl get node
NAME                               LABELS                                                    STATUS    AGE
gke-cluster-1-e6ff40f6-node-oxvo   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-oxvo   Ready     1m
gke-cluster-1-e6ff40f6-node-v2rg   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-v2rg   Ready     1m
gke-cluster-1-e6ff40f6-node-v8mt   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-v8mt   Ready     1m
```


# ※TIPS
cluster内のノード追加・削除に関しては、terraformからは変更できない

initial_node_count = "4" に変更して terraform plan 実行すると cluster が再作成されることが分かる

```
-/+ google_container_cluster.default
    cluster_ipv4_cidr:                    "10.52.0.0/14" => "<computed>"
    endpoint:                             "***.***.***.***" => "<computed>"
    initial_node_count:                   "3" => "4" (forces new resource)
```

# ノードの追加方法

まずはインスタンスグループを確認する

```
$ gcloud compute instance-groups managed list
NAME                         ZONE         BASE_INSTANCE_NAME          SIZE TARGET_SIZE INSTANCE_TEMPLATE            AUTOSCALED
gke-cluster-1-e6ff40f6-group asia-east1-b gke-cluster-1-e6ff40f6-node 3    3           gke-cluster-1-e6ff40f6-1-1-3 no
```

gcloud コマンドにて確認したインスタンスグループに対して、サイズ変更（ノード数を3→4に変更）

```
$ gcloud compute instance-groups managed resize gke-cluster-1-e6ff40f6-group --size 4
...snip...
currentActions:
  abandoning: 0
  creating: 1
  deleting: 0
  none: 3
  recreating: 0
  refreshing: 0
  restarting: 0
...snip...
targetSize: 4
zone: asia-east1-b
```

ノードの確認

```
$ kubectl get node
NAME                               LABELS                                                    STATUS    AGE
gke-cluster-1-e6ff40f6-node-c723   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-c723   Ready     1m
gke-cluster-1-e6ff40f6-node-oxvo   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-oxvo   Ready     23m
gke-cluster-1-e6ff40f6-node-v2rg   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-v2rg   Ready     23m
gke-cluster-1-e6ff40f6-node-v8mt   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-v8mt   Ready     23m
```

# ノードの削除
ノード数を4→3に変更

```
$ gcloud compute instance-groups managed resize gke-cluster-1-e6ff40f6-group --size 3
```

ノードの確認

```
$ kubectl get node
NAME                               LABELS                                                    STATUS    AGE
gke-cluster-1-e6ff40f6-node-oxvo   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-oxvo   Ready     34m
gke-cluster-1-e6ff40f6-node-v2rg   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-v2rg   Ready     34m
gke-cluster-1-e6ff40f6-node-v8mt   kubernetes.io/hostname=gke-cluster-1-e6ff40f6-node-v8mt   Ready     34m
```