ニフクラで Rancher を使って Kubernetes クラスタを構築してみた（シングルサーバー） 

[NIFCLOUD](https://www.nifcloud.com/)（以下ニフクラ）で [Rancher](http://www.rancher.io/) を使って [Kubernetes](https://kubernetes.io/) クラスタを構築してみたのでその手順を紹介します。今回は Rancher のニフクラ連携の検証と Rancher 自体を早く試してみたかったのでシングルサーバー構成で構築しました。Rancherサーバー自体の冗長化は[ドキュメント](https://rancher.com/docs/rancher/v2.x/en/installation/ha/)で詳しく解説されているのでそちら([Rancher: HA Install](https://rancher.com/docs/rancher/v2.x/en/installation/ha/))をご覧ください。

## 注意事項

- **当記事を参考にした際の損害について執筆者は一切の責任を負わないものとします**
- **検証用 Rancher 環境の構築手順なので本番に適用する際には別途詳細に検討してください**

## 説明すること

- ニフクラの簡単な設定
- シングル構成の Rancher サーバーの構築方法
- Rancher を使ってニフクラ上に Kubernetes クラスタをデプロイする方法

## 検証環境

- [Rancher](http://www.rancher.io/): `v2.1.4`
- [Docker](https://www.docker.com/): `18.09.0`
- [docker-machine-driver-nifcloud](https://github.com/heriet/docker-machine-driver-nifcloud): `v0.0.6`

## 手順

### 事前準備

- ファイアウォールグループを作成してください
    - Rancher は 80 と 443 アクセスが必要なのでこの2つだけは開けておいてください
    - また ssh で接続する際のポートも開けてある必要があります
    - 本記事では rancherfw という名前で設定してあります
- SSH Key を作成しておいてください
- ニフクラコンパネの右上で east-2 を指定してください

### プライベートLAN の作成

ニフクラではサーバーなどを作成する際に自動的にグローバルIPとプライベートIPが付与されます。このとき、プライベート側は既定ではニフクラ内の共通なプライベートLANに接続されますが、ここでは自分専用の[プライベートLAN](https://cloud.nifty.com/service/plan.htm)を作成し、それを利用します。

ニフクラのコントロールパネルのメニューから「ネットワーク」画面に移動し「プライベートLAN作成」を選択します。
![01_network_pvlan_selection.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/f3297656-bbe0-29a0-ccd2-ea5f779d39dd.png)

プライベートLAN作成の設定画面が出てくるので必要な情報を埋めていきます。今回は下記内容で設定しました。料金プランは適切なものを選択してください（以降省略します）。作成が完了するとネットワーク画面上に ranchercluster プライベートLANが作成されたことを確認できます。

| Index | Value |
| ----- | ----- |
| プライベートLAN名 | ranchercluster |
| ゾーン | east-21 |
| CIDR | 192.168.0.0/24 |
| 料金プラン | 月額 or 従量 |

![02_pvlan_basic_config.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/18ed84dc-036b-a166-7efb-5631d3728cf0.png)

### プライベートLANでのDHCPの設定

Rancher を使ってクラスタをデプロイする際にここで設定したプライベートLANを使うように設定することになりますが、DHCPを設定しておくとプライベートLAN内でのIP付与が自動的に行われ扱いやすくなるのでここで設定します。

今回はプライベートLANが `192.168.0.0/24` の範囲内なので次のようにプライベートIPの用途を定義します。

| IP | 用途 |
| --- | --- |
| 192.168.0.1 | Rancher サーバー |
| 192.168.0.2 <br> ~ <br> 192.168.0.10 | 予備 |
| 192.168.0.11 <br> ~ <br> 192.168.0.253 | Kubernetes クラスタ|
| 192.168.0.254 | ルーター |

ここで、ルーターはプライベートLANに設定するルーターのことで、このルーターにDHCPコンフィグを登録します。

まずはDHCPコンフィグを作成します。「ネットワーク」画面の当該部分を選択します。
![03_network_dhcpconfig_selection.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/0bc89018-7384-ab65-aa51-13054a476522.png)

遷移したDHCPコンフィグページで「DHCPコンフィグ作成」を選択します。
![04_dhcpconfig_create_selection.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/23e52349-938f-63d5-c84f-8af0565d723f.png)

DHCPの作成画面に映るので必要な情報を入力します。この設定はKubernetesクラスタの各ノードが利用するものなので上記プライベートIPの用途定義表を見て次のように設定して作成します。作成されたコンフィグのIDを控えておきます。`dconf-ZZZZZZZZ` という形式になります。

| Index | Value |
| ----- | ----- |
| 開始IPアドレス | 192.168.0.11 |
| 終了IPアドレス | 192.168.0.253 |

![05_dhcpconfig_configuration.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/bed758d2-4c1b-c813-e7ac-7e7eb862cfca.png)

### DHCPが有効なルーターの作成

DHCPコンフィグを適用するルーターを作成します。「ネットワーク」画面から「ルーター作成」を選択します。
![06_network_router_selection.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/1b5109be-8b82-c05e-bc87-4dc4e74edbed.png)

まず、基本設定は次のように設定します。

| Index | Value |
| ----- | ----- |
| ルーター名 | rancherrouter | 
| ゾーン | east-21 |
| タイプ | router.small(10ルール) |

![07_router_basic_config.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/44e8df2d-bfa3-2884-3e1d-ac7a0c9a3a76.png)

ネットワーク設定は次のようにします。

| Index | Value |
| ----- | ----- |
| ネットワーク | ranchercluster(192.168.0.0/24) |
| IPアドレス(任意) | 192.168.0.254 |
| DHCP | 有効 |
| DHCPコンフィグ | `上記で生成したコンフィグのID` |
| DHCPオプション | なし |

![08_router_network_config.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/ac83f902-2b7f-c156-13f5-15883ca098c1.png)

ファイアウォールの設定をします。事前準備で作成したものを設定してください。

| Index | Value |
| ----- | ----- |
| ファイアウォール | rancherfw |

![09_router_firewall_config.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/f1bf6b2b-95c4-1509-8511-774dbc5cf979.png)


以上の設定が終わったら確認して作成してください。作成にはしばらく時間がかかります。成功すると次の図のようになります。
![10_network_router_created_result.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/a5de4078-33f3-fbf7-4007-0f45718535c0.png)

### Rancher 用サーバーの作成

Rancher 用のサーバーを作成します。コンピューティングからサーバーメニューに移動し、サーバー作成を選択します。
![11_server_create_selection.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/300affc3-f01b-795f-3ec9-5b8b58d03692.png)

イメージ選択とゾーン・サーバータイプは次のようにしました。設定できたら、確認して作成してください。

| Index | Value |
| ----- | ----- |
| イメージ名 | Ubuntu Server 18.04 LTS |
| ゾーン | east-21 |
| タイプ | small |

サーバー設定は次のとおりです。

| Index | Value |
| ----- | ----- |
| サーバー名 | rancherServer |
| SSHキー | `準備で作成したもの` |
| ファイアウォール | `準備で作成したもの` |

特にネットワークは以下のとおりです。

| Index | | IPアドレス | |
| ---- | --- | ------ | --- |
| グローバル | | 自動割り当て | |
| プライベート | ranchercluster | 指定する | 192.168.0.1 |

![12_server_create_serverconfig.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/b3e8a05b-6f58-92b8-5782-55de1743b0d1.png)

インフラの作成はここまでです。以降は Rancher の構築に入ります。

### Rancher サーバーの起動

[Rancherのドキュメント](https://rancher.com/docs/rancher/v2.x/en/quick-start-guide/deployment/quickstart-manual-setup/)に書いてある通りにすればシングルサーバーであれば簡単に作成することができます。

まず、先ほど作成した rancherServer にログインします。rancher は docker 化されているので、まずは Docker を導入します。

```sh
sudo apt update -y && sudo apt upgrade -y 
sudo apt install curl -y
curl -fsSL https://get.docker.com | sudo sh
```

次に、ufw で必要なポートを許可します。

```sh
sudo ufw allow 80
sudo ufw allow 443
```

これで Rancher を起動できます。

```sh
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
```

公開しているIPにアクセスすれば Rancher の初期設定画面にアクセスできます。URLを入力する部分がありますが、ドメインを設定していればそれを入力してください、そうでなければ初期状態でIPが入力されているのでそのまま進んでください。後は流れに沿って初期PWなどを設定すれば初期設定は終わりです（最初に聞かれるデフォルトパスワードは `admin` になっています）。

![13_rancher_first_settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/4fadf56e-0016-4812-de88-ce8231beae16.png)

### ニフクラドライバを追加する

ニフクラにデプロイするためにニフクラ用のドライバを追加します。Node Drivers メニューから Add driver を選択します。

![14_rancher_node_drivers_menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/9f7b3051-f2dd-3207-1101-44e819b49bec.png)

ニフクラのNode Driver は Unofficial なものが [Git: heriet/docker-machine-driver-nifcloud](https://github.com/heriet/docker-machine-driver-nifcloud)で公開されているのでこちらを利用します。

Download URL に `https://github.com/heriet/docker-machine-driver-nifcloud/releases/download/0.0.6/docker-machine-driver-nifcloud` だけ入力し、あとは空白で大丈夫です。
![15_rancher_node_drivers_add_nifcloud.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/6fc85b19-df76-aa0b-de6b-be880b7f36e9.png)

### Node Template を作成する

Kubernetes クラスタを作成するためのテンプレートを作成します。画面右上のユーザーアイコンから 「Node Template」を選択して Node Template の画面に遷移します。Add Template を選択すれば作成画面に移れます。まず、最初にクラウドのアイコンがありますが、追加されたNifcloudを選択し、次の項目を埋めていきます。変更箇所だけをここで説明します。

| Index | Value |
| ----- | ----- |
| accessKey | `ニフクラコンパネで確認` |
| availabilityZone | east-21 |
| instanceType | small(適宜) |
| privateNetworkId | `ニフクラで作成したもの` |
| region | jp-east-2 |
| secretAccessKey | `ニフクラコンパネで確認` |
| securityGroup | `準備で作成したもの` |
| usePrivateDhcp | checked |
| usePrivateIp | checked |
| Name | Sample(このテンプレートの名前) |

Engine Option の設定を下記で変更してください。

| Index | Value |
| ----- | ----- |
| Docker Install URL | https://get.docker.com |

### Kubernetes クラスタを作ってみる

まず、Clusters から Add Cluster を選択します。
![16_rancher_add_cluster_provider_selection.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/355ee0b2-bc7b-9ca8-7d3d-8a1192b70bda.png)

下にスクロールし、次のように設定します。

| Index | Value |
| ----- | ----- |
| Cluster Name | Sample-Cluster |

Node Pools は次のようにします。

| NamePrefix | Count | Template | etcd | Control Plane | Worker |
| ---------- | ----- | -------- | ---- | ------------- | ------ |
| master | 1 | Sample | [x] | [x] | [ ] |
| worker | 1 | Sample | [ ] | [ ] | [x] |

![17_rancher_add_cluster_config.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/9445cd86-e8e0-13df-600b-18d72e6aa50e.png)

設定できたら Create を選択してしばらく待ちます。Rancher のサーバーで Rancher の起動しているコンテナのログを見ておくとエラーが起きたときに気が付きやすくなります。あるいは、クラスタNodeのページに行くと進捗を確認できるので両方開いておきましょう。
![18_rancher_deploy_cluster_progress.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/aea4e9d2-ca70-7835-0066-5722f80ad692.png)

クラスタのトップ画面が次のようになれば成功です。
![19_rancher_deployed.PNG](https://qiita-image-store.s3.amazonaws.com/0/190056/747c1b3e-6677-1b03-0555-e053376a9ff8.png)

## まとめ

ニフクラでもRancherを使ってKubernetesクラスタを構築することができました。ニフクラ用の[Docker Machine Driver](https://github.com/heriet/docker-machine-driver-nifcloud)があるのでRancherの利便性を享受できます。今回はRancherサーバーは冗長化されておらず、またRancherサーバーとKubernetesクラスタが同一ファイアウォールグループだったりと省略した構成ですが基本は抑えてあるので応用はしやすいと思います。