Kublrを使用してGCP にk8sクラスタを構築する

# はじめに

業務でオンプレ環境にk8sクラスタを構築する必要があり、その候補のひとつとしてKublrが上がっていたのでインストールしてみた。

kublr v1.11.2 をdockerコンテナで稼働させてk8sクラスタを構築するところまでをやっています。

# kublrとは

[kublr 公式](https://kublr.com/why-kublr/)

Enterprise Readyなコンテナ管理プラットフォーム。機能的にもManaged Kubernetesと同等なのかな？[Rancher](https://rancher.com/) と近いものがあると思う。マルチクラスタを作成・管理することができ、各ノードにエージェントを入れてコントロールプレーンで統合管理する。

# 準備

* Kublrのアカウントを作成して、自分のKublr Licenseを取得する。
* GCPアカウント
* VM (ubuntu 16.04 LTS): 3 インスタンス  
  スペックは公式の推奨をちゃんと見たほうがいいです。

|ノード|vCPU|Memory|Volume| |
|:-------|:------:|:------:|:------:|:-------|
|管理用|1|2GB|10GB|ここにkublr-in-a-boxを入れる|
|マスター|2|4GB|10GB|マスターとワーカーは一緒でもできるのかもしれないが、なぜかできなかったので分けている。公式にもできるとは書いていない（と思う）|
|ワーカー|4|16GB|200GB| |

# 参考

https://docs.kublr.com/quickstart/kublr-in-a-box/
https://docs.kublr.com/quickstart/onpremise/

# インストール

## kublrのインストール

主にGCPのブラウザからsshでターミナルを起動して管理用ノードを操作する。別にローカルマシンからsshで入ってもいい。

管理用ノードに docker をインストール
(*) Rancherのインストーラを拝借してインストールしました。

```shell
$ curl https://releases.rancher.com/install-docker/18.09.sh | sh
```

docker コマンドをsudo なしで実行できるようにしておく。(任意でいい)
でユーザ名を確認

```shell
$ whoami
<user name>

$ sudo usermod -aG docker <user name>
# 一回セッションを終わらせる
$ exit
```

kublr-in-a-boxをインストール

```shell
$ docker run --name kublr -d --restart=unless-stopped -p 9080:9080 -e KUBLR_HOST=<HOST_IP>:9080 -e KUBLR_LICENSE=<your-license> kublr/kublr:1.11.2
```

ブラウザで `http://<HOST_IP>:9080` にアクセスするとKublrのコンソールが開く。
Username, Passwordは登録時にメールで届いているものを入力するとコンソールが表示される。
デフォルトは多分みんな同じ。

## kublrの設定

sshで公開鍵認証を使用して他のノードにアクセスするための鍵を作成する。

```shell
$ whoami
<user name>

$ ssh-keygen -b 4096 -C <user name>
```

kublrの画面で設定に使用する秘密鍵を準備

```shell
$ cat ~/.ssh/id_rsa
```

画面に表示される秘密鍵をコピーして覚えておく。
次にkublrのUIから"Credentials"を選択し、"+ ADD CREDENTIALS"ボタンをして秘密鍵を登録しておく。

> CREDENTIALS TYPE: "SSH Private Key"
> NAME: 任意の名前
> SSH Private Key: コピーした秘密鍵をペースト

入力が終わったら保存して終わり。

## マスター、ワーカーノードの設定

いずれのノードも管理用ノードからSSHで接続するため、公開鍵認証によって接続できるようにしておく。

管理用ノードで公開鍵をコピーする

```shell
$ cat ~/.ssh/id_rsa.pub
```

画面に表示される公開鍵をコピーして覚えておく。
GCPのインスタンスの設定編集から公開鍵を登録する。

* ナビゲーションメニュー => Compute Engine => VM インスタンス
* 該当するノードの詳細画面を開き、編集。
* "SSH 認証鍵" のセクションで公開鍵をペーストして保存

マスター、ワーカーに公開鍵認証にて接続できることを確認しておく。

## k8s クラスタの構築

kublrのUIから"Clusters"を選択し、"+ ADD CLUSTER" ボタンをして設定画面を開く。

|設定項目名|設定値| |
|:-------|:------|:------|
|Cluster Name|any name|自分がクラスタにつけたい名前。なんでもいい|
|Provider| BARE-METAL|今回は手動にてIaaS上にクラスタを作成するため|
|Masters|1 node||
|Installation Type|Automated using SSH|公開鍵をコピーしておいたのはこのため|
|User Name|your-username|`whoami`で取得したユーザ名|
|SSH Key Name|Credentialsで作成した秘密鍵の名前|この鍵と各ノードに設定した公開鍵が対になっている必要がある|
|IP/DNS of Master 1|マスターノードの IP||
|Create Nodes|||
|> InstanceGroup 1|||
|> > Installation Type|Automated using SSH|公開鍵をコピーしておいたのはこのため|
|> > User Name|上のと同じ||
|> > SSH Key Name|上のと同じ||
|> > Add IP/DNS Addresses|ワーカーノードの IP||
|その他の設定||好みで有効にしてみてください|

"CONFIRM AND INSTALL" を押すとクラスタの構築が開始する。
ちょっと待つと"Congratulation"的なメッセージが出るが、そこからすべての機能が立ち上がるまで結構時間がかかる。

最終的にClusterのステータス画面で、

> Overall Status
> Cluster is ready

と表示されるとクラスタ構築が完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178454/3c186115-c8d1-d623-d64d-ddbffc533c59.png)

# 失敗したことなど

* 社内の強固なproxy&FW環境下にあるデバッグ用サーバーにインストールしようとしたが、外部に何度かアクセスする処理があり、失敗。情報システム部と連携してインストールする必要がありそうなので途中でやめた。
* offlineでインストールはできないっぽい。
* １VMインスタンスにシングルノード構成でクラスタ構築しようとしたところ、途中でdockerを再起動する処理があり、kublrコンテナも再起動され、script内で行っていた認証情報をすべて忘れてしまい、インストール途中で認証エラーになって止まる。結果、中途半端な状態でクラスタが構成されて何度もやり直す＆デバッグする羽目に。。。