なるべくCLIでGKEクラスタを作成してみる

# 概要
自由に使えるKubernetes環境が欲しかったので、GKEを使って構築してみます。
手順に沿うだけであれば、15分程度でKubernetesクラスタを用意できます。

- gcloudをセットアップ
- GKEクラスタを構築

# 前提
- GCPの無料トライアルアカウントは作成済み

# gcloudのセットアップ
## インストール
今回はCLIで構築を行いたいため、gcloudをセットアップします。
gcloudのインストールはScoopで行います。

Scoopを知らない方は以下の記事を読んで、ぜひ試してみてください。Windowsユーザオススメです！
- [Scoopを使ったWindows環境構築のススメ - Super!!](https://qiita.com/rkbk60/items/12dc8fb14042888113d0)

以下のコマンドを叩いて、インストール完了です。簡単ですね。
途中ブラウザが開きGoogleアカウントの認証を求められるので認証して下さい。

```bash
$ scoop bucket add extras
$ scoop install gcloud
```
## 初期設定
追加で、デフォルトのリージョン/ゾーンと、今回GKEのハンズオンを行うプロジェクトを作成して設定します。

```bash
#リージョンとゾーンの設定
$ gcloud config set compute/region asia-northeast1
$ gcloud config set compute/zone asia-northeast1-a

#プロジェクトの作成と設定
$ gcloud projects create gke-handson-1234
$ gcloud config set project gke-handson-1234

```

# GKEクラスタの構築
## GKEクラスタの作成
下記のコマンドだけでK8sクラスタが構築できるのは凄い

```bash
$ gcloud container clusters create gke-handson 
```

詳細な設定は下記を参照。
項目が多すぎたので、今回はシンプルに作成…
- [gcloud container clusters create](https://cloud.google.com/sdk/gcloud/reference/container/clusters/create?hl=ja)

しかし、kubectlが無いとエラー。

```
WARNING: Accessing a Kubernetes Engine cluster requires the kubernetes commandline
client [kubectl]. To install, run
  $ gcloud components install kubectl
```


## kubectlのインストール
kubectlをインストールせずにクラスタを作成しようとすると怒られたので、先にインストールします。

下記コマンドでインストール。これもScoopで一発です。エラーログのコマンドでも構いません。（Scoop使いたいだけ）

```
$ scoop install kubectl
```
## Kubernetes Engine APIを有効化
kubectlインストール後に再度クラスタを構築しようとした所、またエラーが発生。
プロジェクトでKubernetes Engine APIが有効じゃないよとのこと。

```bash
ERROR: (gcloud.container.clusters.create) ResponseError: code=403, message=Kubernetes Engine API is not enabled for this project. Please ensure it is enabled in Google Cloud Console and try again:
 visit https://console.cloud.google.com/apis/api/container.googleapis.com/overview?project=gke-handson-1234 to do so.
```

指定されたURLにアクセスして、`有効にする`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411298/6c9dd77b-39f8-8d88-4457-652e38026e56.png)

しかし、`課金が必要です`との表示が。。
無料枠だけ使える設定だと、GKEは使えなさそう。素直に課金を有効化して、APIを有効化する。
（プロジェクト作成時のオプションで事前に設定できるのかな？）

## GKEクラスタの作成
エラー対応したところで改めて作成。３分ぐらいで完了。

```bash
$ gcloud container clusters create gke-handson 
```

# クラスタの確認
## kubectlの接続先を確認

```bash
$ kubectl config current-context
gke_gke-handson-1234_asia-northeast1-a_gke-handson

```

クラスタの接続先とか自分で設定しなくても勝手に設定してくれてた。
1つのクラスタだけ管理してる分には良いけど、複数管理してる人にはお節介かも？

## nodeを確認
クラスタ作成時に台数指定していなかったけど、デフォルトは3台みたい

```bash
$ kubectl get node
NAME                                         STATUS   ROLES    AGE     VERSION
gke-gke-handson-default-pool-0e9ea686-63w1   Ready    <none>   9m45s   v1.12.7-gke.10
gke-gke-handson-default-pool-0e9ea686-br52   Ready    <none>   9m45s   v1.12.7-gke.10
gke-gke-handson-default-pool-0e9ea686-d0wz   Ready    <none>   9m45s   v1.12.7-gke.10
```

## podを確認
基本サービスが起動してますね。

```bash
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                                    READY   STATUS    RESTARTS   AGE
kube-system   event-exporter-v0.2.3-f9c896d75-tb2zc                   2/2     Running   0          8m50s
kube-system   fluentd-gcp-scaler-69d79984cb-nwpdv                     1/1     Running   0          8m39s
kube-system   fluentd-gcp-v3.2.0-h7zs4                                2/2     Running   0          7m37s
kube-system   fluentd-gcp-v3.2.0-tngff                                2/2     Running   0          8m5s
kube-system   fluentd-gcp-v3.2.0-wr2t8                                2/2     Running   0          7m57s
kube-system   heapster-v1.6.0-beta.1-6fc8df6cb8-dkkqz                 3/3     Running   0          8m12s
kube-system   kube-dns-autoscaler-76fcd5f658-pxwpt                    1/1     Running   0          8m29s
kube-system   kube-dns-b46cc9485-8pq76                                4/4     Running   0          8m51s
kube-system   kube-dns-b46cc9485-zm25h                                4/4     Running   0          8m20s
kube-system   kube-proxy-gke-gke-handson-default-pool-0e9ea686-63w1   1/1     Running   0          8m37s
kube-system   kube-proxy-gke-gke-handson-default-pool-0e9ea686-br52   1/1     Running   0          8m37s
kube-system   kube-proxy-gke-gke-handson-default-pool-0e9ea686-d0wz   1/1     Running   0          8m35s
kube-system   l7-default-backend-6f8697844f-94zkg                     1/1     Running   0          8m52s
kube-system   metrics-server-v0.3.1-5b4d6d8d98-zw7hk                  2/2     Running   0          8m14s
kube-system   prometheus-to-sd-j66jz                                  1/1     Running   0          8m37s
kube-system   prometheus-to-sd-mfz8d                                  1/1     Running   0          8m37s
kube-system   prometheus-to-sd-pbb22                                  1/1     Running   0          8m37s
```

# クラスタの削除
勉強用なので、忘れず削除します。

```
$ gcloud container clusters delete gke-handson
```

# 所感
- 無料枠の範囲であればお金もかからず、かつ簡単に構築もできて、初学者のK8sの勉強に最適ですね。Google神…
- 次回は簡単にmanifestを色々書いたり、helmを使ったり、GitOpsを試してみます。