Rancher 2.3 を使って GKE を構築してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/bf0c7af6-50aa-b6c6-177a-92606671bb17.png)

トップゲートのインフラエンジニア兼プロジェクトマネージャをやっています堤です。

私はDockerやKubernetesなどのコンテナ技術が好きで、2年ぐらい前から触っています。

昨今、Kubernetesがとても注目されていますが、結構扱うにはハードルが高いプロダクトではないかと思います。特に自前でKubernetesクラスタを構築/管理するとなると、かなり大変で骨が折れる。まあ、そこでGKEなどのマネージドなKubernetesサービスがクラウド各社からリリースされているものの、それでもkubectlなどのコマンドを使ったオペレーションが必要になってきます。

そこで、Rancherの登場です。Rancherは、GUIでクラスタ構築から、アプリケーションのデプロイまでやってくれるプロダクトです。日本国内でも熱くなっているプロダクトですが、実は中国ではバリバリ使われている製品です。

さて、ここでは、Rancherを使ってGKEクラスタを作成するところまでガイドしたいと思います。


## 1. 下準備

### 1-1. GCEを構築する

* OS: Ubuntu 18.04
* インスタンス： n1-standard-1（vCPU x 1、メモリ 3.75 GB）
* ストレージ： 100GB

### 1-2. Dockerをインストールする

Rancherを構築するには、Dockerが必要です。ここでは Docker のインストール方法の詳細は書きませんので、以下のドキュメントを参考に構築してください。

https://docs.docker.com/v17.09/engine/installation/linux/docker-ce/ubuntu/

あと、GCEでDockerをインストールして`docker info`を実行すると、なぜか以下の`No Swap Limit Support`が表示される。

```console
$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 0

＜中略＞

 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No swap limit support
```

この警告を回避するには、「/etc/default/grub.d/50-cloudimg-settings.cfg」を以下のように変更する。

```/etc/default/grub.d/50-cloudimg-settings.cfg
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0.1
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=0.1
# GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0"
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0 cgroup_enable=memory swapaccount=1"
GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=Y"
GRUB_RECORDFAIL_TIMEOUT=0
GRUB_TERMINAL=console
```

編集が完了したら、update-grubを実行してサーバを再起動する。

```sh
sudo update-grub
sudo reboot
```

## 2. Rancherのインストール

Rancherのインストールはとても簡単です。今回はLet's EncrpytでSSL証明書を自動取得します。予めCloud DNSでRancherサーバのAレコードを登録しておきます。

```console
$ sudo docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  rancher/rancher:latest \
  --acme-domain RANCHER.YOURDOMAIN.ORG
```

しばらくするとコンテナが立ち上がり、`https://RANCHER.YOURDOMAN.ORG` で接続できるようになります。接続すると`admin`のパスワードを設定して、ログインすると以下の画面が立ち上がります。

<img width="1274" alt="Rancher Console" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/c5f0cd48-0f6f-2d9e-5c4e-44ba9184ba20.png">

## 3. GKE クラスタ登録

### 3-1. サービスアカウントの作成

まず、RancherからGKEクラスタを操作させるためのサービスアカウントを作成します。

```console
$ gcloud iam service-accounts create rancher \
 --description "Rancher server" \
 --display-name "rancher"
Created service account [rancher].
```

次に作成したサービスアカウントに対してロールを割り当てます。割り当てるロールは下記4つです。`gcloud projects add-iam-policy-binding`コマンドでは、一つずつしかroleが割り当てられないので、4回コマンドを実行する必要があります。

* roles/compute.viewer
* roles/viewer
* roles/container.admin
* roles/iam.serviceAccountUser

```console
$ gcloud projects add-iam-policy-binding <PROJECT-NAME> \
 --member serviceAccount:rancher@<PROJECT-NAME>.iam.gserviceaccount.com \
 --role roles/compute.viewer

$ gcloud projects add-iam-policy-binding <PROJECT-NAME> \
 --member serviceAccount:rancher@<PROJECT-NAME>.iam.gserviceaccount.com \
 --role roles/viewer

$ gcloud projects add-iam-policy-binding <PROJECT-NAME> \
 --member serviceAccount:rancher@<PROJECT-NAME>.iam.gserviceaccount.com \
 --role roles/container.admin
 
$ gcloud projects add-iam-policy-binding <PROJECT-NAME> \
 --member serviceAccount:rancher@<PROJECT-NAME>.iam.gserviceaccount.com \
 --role roles/iam.serviceAccountUser
```

そして、サービスアカウントキーを生成します。

```sh
gcloud iam service-accounts keys create ~/rancher-key.json \
 --iam-account rancher@<PROJECT-NAME>.iam.gserviceaccount.com
```

### 3-2. GKEクラスタの作成

次に、RancherでGKEクラスタを構成したいと思います。まずは、`Clusters→Add Cluster`を選択します。

<img width="1271" alt="ScreenShot 2019-11-08 15.38.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/9f9fcbe3-21a3-b036-fc2c-a9e518cfe3e3.png">

次に、`Google GKE`を選びます。

<img width="1298" alt="ScreenShot 2019-11-08 15.39.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/f180f9ea-b56e-d7c1-0676-7d2b8063022d.png">

先程生成したサービスアカウントの鍵`rancher-key.json`を読み込みます。認証にパスしますと、ノードの設定画面が自動的にロードされます。

<img width="1288" alt="ScreenShot 2019-11-11 18.44.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/428940a0-2b21-b7fe-9b3e-0491da19a3a7.png">

以下のようにクラスタを構成したいと思います。

* ノードの数：3つ
* ゾーン： asia-northeast1-a, asia-northeast1-b, asia-northeast1-c
* OS: Container-Optimized OS

各ゾーンに1つずつノードを配置するパターンです。まず、Zoneのところに`asia-northeast1-a`を選択して、Additional Zoneに`asia-northeast1-b`と`asia-northeast1-c`のチェックを入れます。

<img width="1248" alt="ScreenShot 2019-11-11 14.45.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/bb31080c-3b8c-4dec-e6e3-f67fd94ddb37.png">

そして、Node Countのところに「1」を選択します。こうすることで、上で選択したZoneに対して一つずつ配備する形になります。そして一番下にある`Create`を押して、しばらく待ちます。

<img width="1257" alt="ScreenShot 2019-11-11 14.45.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/9123266b-82e6-8f98-a809-af72cf1f1cca.png">

最終的には、クラスタができて、以下のようになります。

<img width="1279" alt="ScreenShot 2019-11-11 18.49.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/be342a25-ce7d-7394-4b2b-ced292c6fb13.png">

GCPのGKEコンソール画面の「ノードゾーン」を参照すると、asia-northeast1-a〜cにノードができていることがわかります。

<img width="455" alt="ScreenShot 2019-11-11 14.54.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/b06adf8b-b66a-d807-3782-0baae980ae5d.png">

次は、Rancherを使ってアプリケーションのデプロイをやってみたいと思います。