Rancher 2.1のHA installを試してみる

[NTTテクノクロス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ntt-tx "NTTテクノクロス Advent Calendar 2018")の2日目担当 @niiku-y です。

突然ですが、皆様の会社では、コンテナのプラットフォームとして何を使っていますか？
本日の記事では、コンテナのデプロイや管理に使うソフトウェア [Rancher](https://rancher.com/ "Rancher") の冗長構成でのインストールについて、書いてみようと思います。

# 動機

簡単にいうと、「やったことなかったのでやってみました」ということですね。

- 私の所属チームは、インフラの構築・運用を主な業務としており、その中で私は、OpenStack、コンテナに関する業務に関わっています。
  - 例えば [OSSクラウド基盤トータルサービス](https://www.ntt-tx.co.jp/products/osscloud/?utm_source=qiita&utm_medium=ac2018&utm_campaign=02 "OSSクラウド基盤トータルサービス") のうち「チケットサービス」によりお客様OpenStack環境でのトラブル対応をしたり、案件対応としてコンテナを使った環境の設計をお客様と一緒に検討したり、といったことをやっています。
  - [OpenStack Summit](https://www.ntt-tx.co.jp/column/tec/openstack_summit_2018_berlin/?utm_source=qiita&utm_medium=ac2018&utm_campaign=02 "OpenStack Summit 2018 Berlin参加レポート") , [OpenStack Days](https://www.ntt-tx.co.jp/column/tec/openstack_days_tokyo_2018/?utm_source=qiita&utm_medium=ac2018&utm_campaign=02 "OpenStack Days Tokyo 2018に出展しました！")等の国内外イベントに出席し、技術動向や製品・事例を見に行ったり、自社サービスの宣伝をする、といったこともしています。
- [Rancher](https://rancher.com/ "Rancher") については、上記のような業務の中で社内や顧客環境で使用するコンテナプラットフォームを検討する中で出会い、社内クラウドに [Single Node Install](https://rancher.com/docs/rancher/v2.x/en/installation/single-node/ "Rancher Single Node Install")で入れて試用したりしています。
- Rancherの[HA install](https://rancher.com/docs/rancher/v2.x/en/installation/ha/ "Rancher HA install")は、気になりつつもまだ試していなかったので、今更ながら試してみました。
- あと、なんかrancherの独特の画面、好きなんですよね。あの牛も好きです

# 環境情報

## 1. 論理構成

作業に使った環境は以下のような構成です。

「なぜ、そんな構成になっているの？」というツッコミはあるかとは思いますが、使える環境やリソースが限られていたので、、、ご容赦ください。。

![nw3.png](https://qiita-image-store.s3.amazonaws.com/0/318326/e7fd79d5-7b36-c7c9-4a22-95248bb2edad.png)

- ロードバランサとして構築するノードが1台(LBノード)、rancher-server用ノードが3台(master#1～3)。
  - LBノードは、rancher-server用ノードとは別のノードにする。L4ロードバランサをrancher-server用ノードに同居させない。
- いずれもOpenStackで構築したVMで、LBノードにのみFloating IPを付与する。
- rancher-serverは、3台のHA構成で構築する。
- L4ロードバランサを構築し、ユーザからのリクエストが3台のrancher-server用ノードに振り分けられるようにする。
- この環境は踏み台サーバを経由しての作業となる。踏み台から直接アクセスできるのはLBノードのFloating IPアドレスのみ。

## 2. 各ノードのスペック
- 環境のリソースの都合上、各ノードはvCPUs 2、RAM 4GB、ディスク 20GBで作成。
- 手順を試すくらいであればこのスペックでも動く。が、本来は、[Node Requirements](https://rancher.com/docs/rancher/v2.x/en/installation/requirements/ "Node Requirements")の「Hardware」で適切なスペックのものを準備すべき。

## 3. IPアドレス

| ノード                | IPアドレス               | 備考                |
|:----------------------|:------------------------|:--------------------| 
| lb01.openstacklocal | 172.16.24.150 | LBノードの踏み台サーバ側のIPアドレス |
| lb01.openstacklocal | 192.168.0.108 | LBノードのrancher-server側のIPアドレス |
| master01 | 192.168.0.109 | rancher-server用ノードの1台目(master#1) |
| master02 | 192.168.0.110 | rancher-server用ノードの2台目(master#2) |
| master03 | 192.168.0.111 | rancher-server用ノードの3台目(master#3) |

## 4. 使用したversion

LBノード、rancher-server用ノードで使っているOS, dockerのバージョンは全て同じ。

- OS : ubuntu 16.04.5
- docker : docker-ce 17.03.2
- kubernetes : v1.11.3
- rke : v0.1.11
- helm : v2.11.0
- rancher : v2.1.1
  - chart : rancher-2018.10.2
- cert-manager : v0.5.0 
- nginx : 1.14.1-1~xenial

# サマリ

実施した作業は以下のとおり。

- requirementsに沿ってノード自体を作成し、LBノード、rancher-server用ノードでdockerを使えるようにする
- RKEによりrancher-server用ノードにkubernetesを入れる（kubectlも含む）
- Helmによりcert-managerとrancherを入れる
- LBノードでL4ロードバランサを構築し、Rancher画面が見れるか動作確認する

もう少し細かく書くと、各作業内容とその対象ノードは以下のようになります。
表中、○の付いているノードが作業対象です。（折りたたんであります）

<details><summary>各作業の対象ノード</summary><div>

| 項番 | 作業内容 | lb01 | master01 | master02 | master03 | 踏み台 | 
|:----|:---------|:----:|:--------:|:--------:|:--------:|:-----:|
| 1   | node requirement確認 | ○ | ○ | ○ | ○ | - |
| 2   | 各ノード自体の用意     | - | - | - | - | - |
| 2.1 | VM自体の作成          | ○ | ○ | ○ | ○ | - |
| 2.2 | 踏み台からVMに入るための設定 | - | - | - | - | ○ |
| 2.3 | VMのパッケージ更新、名前解決の設定 | ○ | ○ | ○ | ○ | - |
| 2.4 | LBノードからVMへのsshアクセス設定 | ○ | ○ | ○ | ○ | - |
| 2.5 | docker-ceインストール | ○ | ○ | ○ | ○ | - |
| 2.6 | Post-installation stepsの実施 | ○ | ○ | ○ | ○ | - |
| 3   | RKEによるkubernetesインストール | - | - | - | - | - |
| 3.1 | rancherクラスタの設定ファイル作成 | ○ | - | - | - | - |
| 3.2 | RKEのインストール | ○ | - | - | - | - |
| 3.3 | RKEコマンド実行   | ○ | - | - | - | - |
| 3.4 | kube_config_rancher-cluster.yml配布 | ○ | ○ | ○ | ○ | - |
| 3.5 | kubectlインストールと動作確認 | - | ○ | ○ | ○ | - |
| 4   | Helmのインストール | - | - | - | - | - |
| 4.1 | Tillerサービスアカウントの設定 | - | ○ | - | - | - |
| 4.2 | kubectlによる状態確認 | - | ○ | - | - | - |
| 4.3 | Helmインストール | - | ○ | - | - | - |
| 5   | cert-managerとrancherのインストール | - | - | - | - | - |
| 5.1 | Helmリポジトリ追加 | - | ○ | - | - | - |
| 5.2 | cert-managerインストール | - | ○ | - | - | - |
| 5.3 | rancherインストール | - | ○ | - | - | - |
| 6   | LB構築 | - | - | - | - | - |
| 6.1 | nginxインストール | ○ | - | - | - | - |
| 6.2 | nginxの設定 | ○ | - | - | - | - |
| 7   | 動作確認  | - | - | - | - | - |
| 7.1 | 踏み台サーバからのsshポート転送 | - | - | - | - | ○ |
| 7.2 | 名前解決設定の確認 | ○ | - | - | - | ○ |
| 7.3 | クライアントからのrancher画面アクセス | - | - | - | - | - |
</div></details>

次のセクションで、実施した作業の手順を詳述します。

が、dockerインストール等々をいまさら見るのもかったるい方も多いと思いますので、
そんな方々は、最初のほうはすっ飛ばして、 [RKEによるkubernetesインストール](https://qiita.com/niiku-y/private/d0768b8a2380094b2e4d#3-rke%E3%81%AB%E3%82%88%E3%82%8Bkubernetes%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB "RKEによるkubernetesインストール") 以降をごらんください。

# 実施手順

上記サマリのとおり、基本的に[High Availability (HA) Install](https://rancher.com/docs/rancher/v2.x/en/installation/ha/ "High Availability (HA) Install")に従って進めればOKです。

ですが、若干ハマった箇所もあったので、そこはどう対処したか記載しています。
私の作業ミスや、理解不足、勘違いの場合もあるかと思いますので、そうした点があった場合は、ご指摘ください。

詳細な記載が無かった部分は、ポインタとなる情報がちゃんとドキュメントに書いてあるので、適宜補いながら環境構築できました。

## 1. node requirementの確認

構築前に、必要なハードウェアリソース、使用できるOS, dockerなどの各バージョン、使用ポートを[Node Requirements](https://rancher.com/docs/rancher/v2.x/en/installation/requirements/ "Node Requirements") , [RKE Requirements](https://rancher.com/docs/rke/v0.1.x/en/os/ "RKE Requirements") , [NGINX](https://rancher.com/docs/rancher/v2.x/en/installation/ha/create-nodes-lb/nginx/ "NGINX") で確認しておく。

## 2. 各ノード自体の用意

LBノード、rancher-server用ノード全台のVMを用意、初期設定する。
ここでは [Create Nodes and Load Balancer](https://rancher.com/docs/rancher/v2.x/en/installation/ha/create-nodes-lb/ "Create Nodes and Load Balancer") に従い、各ノードを設定する。

※2.1～2.4は準備作業を実施するための準備みたいなところなので、適当に読み飛ばしていただければと思います。

### 2.1 VM自体の作成

- [公開されているUbuntuのイメージ](https://cloud-images.ubuntu.com/xenial/current/ "Ubuntu 16.04 LTS (Xenial Xerus) Daily Build")をもとに、LBノード、rancher-server用ノードのVMを作成する。
  - VMにアクセスするためのキーペアも作成しておく。

### 2.2 踏み台からVMに入るための設定

- 踏み台サーバにLBノードへsshアクセスするための秘密鍵を配置する
  - VM作成時に作ったキーペアのうち、秘密鍵のほう
- 踏み台サーバからLBノードにsshで入れることを確認しておく

### 2.3 VMのパッケージ更新、名前解決の設定

- LBノード、rancher-server用ノード全台で以下を実施
  - 名前解決の設定（resolv.conf, hosts）
  - パッケージ更新（apt-get update, apt-get upgrade）

```
ubuntu@lb01:~$ vi init_common.sh
ubuntu@lb01:~$ cat init_common.sh
#!/bin/bash
# init_common.sh

echo "backup resolv.conf, resolv.conf.d/base"
cp /etc/resolv.conf /etc/.resolv.conf.org
cp /etc/resolvconf/resolv.conf.d/base /etc/resolvconf/resolv.conf.d/.base.org

echo "nameserver 8.8.8.8" >> /etc/resolvconf/resolv.conf.d/base
resolvconf -u

echo ""
echo "/etc/resolv.conf (after) : "
cat /etc/resolv.conf

echo ""
echo "package update ..."
sudo apt-get update && sudo apt-get upgrade -y

cat <<EOF >> /etc/hosts
192.168.0.108   lb01.openstacklocal  lb01
192.168.0.109   master01
192.168.0.110   master02
192.168.0.111   master03
EOF

echo ""
echo "/etc/hosts : "
cat /etc/hosts

echo ""
echo "finish."

ubuntu@lb01:~$ chmod +x init_common.sh
ubuntu@lb01:~$ sudo bash ./init_common.sh
```

### 2.4 LBノードからVMへのsshアクセス設定

- LBノードで鍵ペアの作成

後述するrkeコマンドの実行時に、VM作成時に生成したキーペアを使用した場合、
LBノードからrancher-server用ノードへのアクセスがうまくいかなかった。

※IPアドレスが現在の環境と異なるが、試したときのrkeのログを以下に残しておく。

```
WARN[0000] Failed to set up SSH tunneling for host [192.168.0.107]: Can't retrieve Docker Info: error during connect: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info: Failed to dial ssh using address [192.168.0.107:22]: Error configuring SSH: asn1: structure error: superfluous leading zeros in length 
```

そのため、ここではLBノードからrancher-server用ノードへのアクセスのためのキーペアを作成し、適当な名前で保存しておく。公開鍵はauthorized_keysに登録しておく。
※ここで作成したキーペアを使った場合は、rkeコマンドが成功した

```
ubuntu@lb01:~$ ssh-keygen -t rsa -b 4096
ubuntu@lb01:~$ cd .ssh
ubuntu@lb01:~/.ssh$ mv id_rsa id_rsa.pri.lb01
ubuntu@lb01:~/.ssh$ mv id_rsa.pub id_rsa.pub.lb01
ubuntu@lb01:~/.ssh$ cat id_rsa.pub.lb01 >> authorized_keys
```

- LBノードでsshのconfig設定

LBノードからrancher-server用ノード全台へのsshログインをより簡単にするため.ssh/configを設定する。

ここではVM作成時の秘密鍵のファイルパスを~/.ssh/hoge.pemとしている。

```
ubuntu@lb01:~/.ssh$ cat config
Host lb01
    Hostname lb01
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/hoge.pem
Host master01
    Hostname master01
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/hoge.pem
Host master02
    Hostname master02
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/hoge.pem
Host master03
    Hostname master03
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/hoge.pem

ubuntu@lb01:~/.ssh$ chmod 600 config
ubuntu@lb01:~/.ssh$ ls -l
```

- authorized_keysとconfigの配布

LBノードからrancher-server用ノード全台に対して、上記authorized_keysとsshのconfigを配布する

```
ubuntu@lb01:~$ vi copy_keyconf.sh
ubuntu@lb01:~$ cat copy_keyconf.sh
#!/bin/bash
# copy_keyconf.sh

HOSTLIST="master01 master02 master03"

for h in $HOSTLIST
do
    scp ~/.ssh/authorized_keys ubuntu@${h}:/home/ubuntu/.ssh/authorized_keys
    scp ~/.ssh/config ubuntu@${h}:/home/ubuntu/.ssh/config
done

ubuntu@lb01:~$ chmod +x copy_keyconf.sh
ubuntu@lb01:~$ ./copy_keyconf.sh

```

- 動作確認

LBノードから秘密鍵を使ってrancher-server用ノード全台にsshログインできることを確認する。

```
ubuntu@lb01:~/.ssh$ ssh master01
ubuntu@lb01:~/.ssh$ ssh master02
ubuntu@lb01:~/.ssh$ ssh master03
```

### 2.5 docker-ceインストール

[ubuntuへのdocker-ceインストール手順](https://docs.docker.com/install/linux/docker-ce/ubuntu/ "ubuntuへのdocker-ceインストール手順")に従って、LBノード、rancher-server用ノード全台でdockerのインストールを実施する。

```
ubuntu@master01:~$ vi install_docker.sh
ubuntu@master01:~$ cat install_docker.sh
#!/bin/bash
#install_docker.sh

echo "dpkg -l docker : "
dpkg -l docker
sudo apt-get update

echo ""
echo "install apt-transport-https ca-certificates curl software-properties-common : "
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

echo ""
echo "apt-key add : "
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
## OKとなること

echo ""
echo "fingerprint : "
sudo apt-key fingerprint 0EBFCD88
## 以下であること
## Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88

echo ""
echo "add repository : "
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable edge test"
sudo apt-get update

echo ""
echo "install docker-ce : "
#apt-cache madison docker-ce
sudo apt-get install -y docker-ce=17.03.2~ce-0~ubuntu-xenial
sudo docker run hello-world
sudo docker info

ubuntu@master01:~$ chmod +x install_docker.sh
ubuntu@master01:~$ ./install_docker.sh
```

### 2.6 Post-installation stepsの実施

引き続き、LBノード、rancher-server用ノード全台で、[Post-installation steps for Linux](https://docs.docker.com/install/linux/linux-postinstall/ "Post-installation steps for Linux")を実施する。

lsmodしたとき、[RKEのOS Requirements](https://rancher.com/docs/rke/v0.1.x/en/os/#operating-system "OS Requirements")にあるkernel moduleが存在してない場合、 /etc/modulesに記載して起動時に組み込まれるようにしておく。

- dockerグループへのユーザ追加
- swap無効化
- カーネルモジュールの設定
- カーネルパラメータの設定

```
ubuntu@lb01:~$ vi postinst.sh
ubuntu@lb01:~$ cat postinst.sh
#!/bin/bash
# postinst.sh

usr="ubuntu"
echo "group check : "
if ! groups $usr | grep docker >/dev/null ; then
  sudo usermod -aG docker $usr
  echo "after : "
  groups $usr
else
  echo "nothing to do."
  groups $usr
fi

## すでに無効化されているので現状表示のみ
echo ""
echo "swap check (fstab) :"
cat /etc/fstab
echo ""
echo "swap check (free) :"
free -h

echo ""
echo "kernel module (check) :"
lsmod

if [ ! -f check.sh ]; then
  cat <<EOF >> check.sh
#!/bin/bash
# check.sh
modules="br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat nf_nat_ipv4 nf_nat_masquerade_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set xt_statistic xt_tcpudp"
for m in \${modules}
do
    if ! lsmod | grep \${m} >/dev/null ; then
        echo "\${m}"
    fi
done
EOF
  chmod +x ./check.sh
else
  echo "check.sh : already exists"
fi

./check.sh > list.txt

echo ""
echo "kernel module (modify) :"
if [ ! -f /etc/modules.org ]; then
    cat /etc/modules list.txt >> modules.after
    cp /etc/modules /etc/modules.org
    cp modules.after /etc/modules
    cat /etc/modules
else
    echo "exist : /etc/modules.org"
    echo "/etc/modules : already modified."
    cat /etc/modules
fi

echo ""
echo "kernel parameter : "
if ! grep net.bridge.bridge-nf-call-iptables /etc/sysctl.conf >/dev/null ; then
    cp /etc/sysctl.conf /etc/sysctl.conf.org
    echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
    diff /etc/sysctl.conf /etc/sysctl.conf.org
    grep net.bridge.bridge-nf-call-iptables /etc/sysctl.conf
    sysctl -p /etc/sysctl.conf
else
    echo "exist : net.bridge.bridge-nf-call-iptables"
fi

echo ""
echo "confirm (sysctl) : "
sysctl net.bridge.bridge-nf-call-iptables

echo ""
echo "confirm (check.sh) : "
./check.sh

echo ""
echo "finish."

ubuntu@lb01:~$ chmod +x postinst.sh
ubuntu@lb01:~$ sudo bash postinst.sh

```

各ノードreboot後も設定が有効であることを確認しておく。
check.sh実行の結果は、なにも表示されないことが正しい。
表示されたものは/etc/modulesに追記して起動時に有効になるよう反映する。

```
ubuntu@lb01:~$ sysctl net.bridge.bridge-nf-call-iptables
ubuntu@lb01:~$ ./check.sh
```

## 3. RKEによるkubernetesインストール

ここでは [Install Kubernetes with RKE](https://rancher.com/docs/rancher/v2.x/en/installation/ha/kubernetes-rke/ "Install Kubernetes with RKE") の内容を実施する。
kubectlは入っていなかったので、「3.5 kubectlインストールと動作確認」にて入れる必要がある。

### 3.1 rancherクラスタの設定ファイル作成

のちほど、LBノードでrkeコマンドを実行してrancher-server用ノードにkubernetesを入れることになるが、そのときの入力となるファイルが、このrancher-cluster.ymlである。

LBノードからrancher-server用ノードへのsshログイン時に使う秘密鍵(id_rsa.pri.lb01)を、この設定ファイルにて指定する。
ここまでで各rancher-server用ノードには、authorized_keysとして対応する公開鍵(id_rsa.pub.lb01)の情報は配布済みである。

```
ubuntu@lb01:~$ vi rancher-cluster.yml
ubuntu@lb01:~$ cat rancher-cluster.yml 
nodes:
  - address: 192.168.0.109
    user: ubuntu
    ssh_key_path: /home/ubuntu/.ssh/id_rsa.pri.lb01
    role: [controlplane,worker,etcd]
  - address: 192.168.0.110
    user: ubuntu
    ssh_key_path: /home/ubuntu/.ssh/id_rsa.pri.lb01
    role: [controlplane,worker,etcd]
  - address: 192.168.0.111
    user: ubuntu
    ssh_key_path: /home/ubuntu/.ssh/id_rsa.pri.lb01
    role: [controlplane,worker,etcd]

services:
  etcd:
    snapshot: true

ubuntu@lb01:~$ 
```

### 3.2 RKEのインストール

LBノードにて、githubからRKEをダウンロードしてきて、実行権あたえて好きな場所にmvなどで配置する。

```
ubuntu@lb01:~$ vi install_rke.sh
ubuntu@lb01:~$ cat install_rke.sh
#!/bin/bash
# install_rke.sh

echo "install rke : "
wget https://github.com/rancher/rke/releases/download/v0.1.11/rke_linux-amd64
chmod +x rke_linux-amd64
sudo mv rke_linux-amd64 /usr/local/bin/rke

echo "rke : "
which rke

echo "version : "
rke --version
ubuntu@lb01:~$ chmod +x install_rke.sh
ubuntu@lb01:~$ ./install_rke.sh
```

### 3.3 RKEコマンド実行

さきほど作成したrancher-cluster.ymlを指定して、LBノードからRKEコマンドを実行する。
実行時に以下のようなログが出力される。（長いので折りたたんである。200行くらい）
めでたく「Finished building Kubernetes cluster successfully」が出たら構築成功である。

<details><summary>rke up --config rancher-cluster.ymlの実行結果</summary><div>

```
ubuntu@lb01:~$ rke up --config rancher-cluster.yml
INFO[0000] Building Kubernetes cluster                  
INFO[0000] [dialer] Setup tunnel for host [192.168.0.111] 
INFO[0000] [dialer] Setup tunnel for host [192.168.0.109] 
INFO[0000] [dialer] Setup tunnel for host [192.168.0.110] 
INFO[0001] [network] Deploying port listener containers 
INFO[0001] [network] Pulling image [rancher/rke-tools:v0.1.15] on host [192.168.0.109] 
INFO[0001] [network] Pulling image [rancher/rke-tools:v0.1.15] on host [192.168.0.110] 
INFO[0001] [network] Pulling image [rancher/rke-tools:v0.1.15] on host [192.168.0.111] 
INFO[0015] [network] Successfully pulled image [rancher/rke-tools:v0.1.15] on host [192.168.0.109] 
INFO[0015] [network] Successfully pulled image [rancher/rke-tools:v0.1.15] on host [192.168.0.110] 
INFO[0015] [network] Successfully started [rke-etcd-port-listener] container on host [192.168.0.109] 
INFO[0015] [network] Successfully started [rke-etcd-port-listener] container on host [192.168.0.110] 
INFO[0015] [network] Successfully pulled image [rancher/rke-tools:v0.1.15] on host [192.168.0.111] 
INFO[0016] [network] Successfully started [rke-etcd-port-listener] container on host [192.168.0.111] 
INFO[0017] [network] Successfully started [rke-cp-port-listener] container on host [192.168.0.110] 
INFO[0017] [network] Successfully started [rke-cp-port-listener] container on host [192.168.0.109] 
INFO[0017] [network] Successfully started [rke-cp-port-listener] container on host [192.168.0.111] 
INFO[0017] [network] Successfully started [rke-worker-port-listener] container on host [192.168.0.109] 
INFO[0017] [network] Successfully started [rke-worker-port-listener] container on host [192.168.0.110] 
INFO[0017] [network] Successfully started [rke-worker-port-listener] container on host [192.168.0.111] 
INFO[0017] [network] Port listener containers deployed successfully 
INFO[0017] [network] Running etcd <-> etcd port checks  
INFO[0018] [network] Successfully started [rke-port-checker] container on host [192.168.0.110] 
INFO[0018] [network] Successfully started [rke-port-checker] container on host [192.168.0.109] 
INFO[0018] [network] Successfully started [rke-port-checker] container on host [192.168.0.111] 
INFO[0018] [network] Running control plane -> etcd port checks 
INFO[0019] [network] Successfully started [rke-port-checker] container on host [192.168.0.109] 
INFO[0019] [network] Successfully started [rke-port-checker] container on host [192.168.0.110] 
INFO[0019] [network] Successfully started [rke-port-checker] container on host [192.168.0.111] 
INFO[0019] [network] Running control plane -> worker port checks 
INFO[0019] [network] Successfully started [rke-port-checker] container on host [192.168.0.109] 
INFO[0019] [network] Successfully started [rke-port-checker] container on host [192.168.0.110] 
INFO[0019] [network] Successfully started [rke-port-checker] container on host [192.168.0.111] 
INFO[0019] [network] Running workers -> control plane port checks 
INFO[0020] [network] Successfully started [rke-port-checker] container on host [192.168.0.109] 
INFO[0020] [network] Successfully started [rke-port-checker] container on host [192.168.0.110] 
INFO[0020] [network] Successfully started [rke-port-checker] container on host [192.168.0.111] 
INFO[0020] [network] Checking KubeAPI port Control Plane hosts 
INFO[0020] [network] Removing port listener containers  
INFO[0020] [remove/rke-etcd-port-listener] Successfully removed container on host [192.168.0.111] 
INFO[0020] [remove/rke-etcd-port-listener] Successfully removed container on host [192.168.0.110] 
INFO[0020] [remove/rke-etcd-port-listener] Successfully removed container on host [192.168.0.109] 
INFO[0021] [remove/rke-cp-port-listener] Successfully removed container on host [192.168.0.111] 
INFO[0021] [remove/rke-cp-port-listener] Successfully removed container on host [192.168.0.110] 
INFO[0021] [remove/rke-cp-port-listener] Successfully removed container on host [192.168.0.109] 
INFO[0021] [remove/rke-worker-port-listener] Successfully removed container on host [192.168.0.110] 
INFO[0021] [remove/rke-worker-port-listener] Successfully removed container on host [192.168.0.109] 
INFO[0021] [remove/rke-worker-port-listener] Successfully removed container on host [192.168.0.111] 
INFO[0021] [network] Port listener containers removed successfully 
INFO[0021] [certificates] Attempting to recover certificates from backup on [etcd,controlPlane] hosts 
INFO[0022] [certificates] Successfully started [cert-fetcher] container on host [192.168.0.109] 
INFO[0022] [certificates] Successfully started [cert-fetcher] container on host [192.168.0.110] 
INFO[0023] [certificates] Successfully started [cert-fetcher] container on host [192.168.0.111] 
INFO[0023] [certificates] No Certificate backup found on [etcd,controlPlane] hosts 
INFO[0023] [certificates] Generating CA kubernetes certificates 
INFO[0023] [certificates] Generating Kubernetes API server certificates 
INFO[0024] [certificates] Generating Kube Controller certificates 
INFO[0024] [certificates] Generating Kube Scheduler certificates 
INFO[0025] [certificates] Generating Kube Proxy certificates 
INFO[0025] [certificates] Generating Node certificate   
INFO[0026] [certificates] Generating admin certificates and kubeconfig 
INFO[0026] [certificates] Generating etcd-192.168.0.109 certificate and key 
INFO[0027] [certificates] Generating etcd-192.168.0.110 certificate and key 
INFO[0027] [certificates] Generating etcd-192.168.0.111 certificate and key 
INFO[0027] [certificates] Generating Kubernetes API server aggregation layer requestheader client CA certificates 
INFO[0027] [certificates] Generating Kubernetes API server proxy client certificates 
INFO[0028] [certificates] Temporarily saving certs to [etcd,controlPlane] hosts 
INFO[0034] [certificates] Saved certs to [etcd,controlPlane] hosts 
INFO[0034] [reconcile] Reconciling cluster state        
INFO[0034] [reconcile] This is newly generated cluster  
INFO[0034] [certificates] Deploying kubernetes certificates to Cluster nodes 
INFO[0040] Successfully Deployed local admin kubeconfig at [./kube_config_rancher-cluster.yml] 
INFO[0040] [certificates] Successfully deployed kubernetes certificates to Cluster nodes 
INFO[0040] Pre-pulling kubernetes images                
INFO[0040] [pre-deploy] Pulling image [rancher/hyperkube:v1.11.3-rancher1] on host [192.168.0.110] 
INFO[0040] [pre-deploy] Pulling image [rancher/hyperkube:v1.11.3-rancher1] on host [192.168.0.109] 
INFO[0040] [pre-deploy] Pulling image [rancher/hyperkube:v1.11.3-rancher1] on host [192.168.0.111] 
INFO[0108] [pre-deploy] Successfully pulled image [rancher/hyperkube:v1.11.3-rancher1] on host [192.168.0.111] 
INFO[0111] [pre-deploy] Successfully pulled image [rancher/hyperkube:v1.11.3-rancher1] on host [192.168.0.109] 
INFO[0119] [pre-deploy] Successfully pulled image [rancher/hyperkube:v1.11.3-rancher1] on host [192.168.0.110] 
INFO[0119] Kubernetes images pulled successfully        
INFO[0119] [etcd] Building up etcd plane..              
INFO[0119] [etcd] Pulling image [rancher/coreos-etcd:v3.2.18] on host [192.168.0.109] 
INFO[0127] [etcd] Successfully pulled image [rancher/coreos-etcd:v3.2.18] on host [192.168.0.109] 
INFO[0127] [etcd] Successfully started [etcd] container on host [192.168.0.109] 
INFO[0127] [etcd] Saving snapshot [etcd-rolling-snapshots] on host [192.168.0.109] 
INFO[0127] [etcd] Successfully started [etcd-rolling-snapshots] container on host [192.168.0.109] 
INFO[0128] [certificates] Successfully started [rke-bundle-cert] container on host [192.168.0.109] 
INFO[0128] [certificates] successfully saved certificate bundle [/opt/rke/etcd-snapshots//pki.bundle.tar.gz] on host [192.168.0.109] 
INFO[0129] [etcd] Successfully started [rke-log-linker] container on host [192.168.0.109] 
INFO[0129] [remove/rke-log-linker] Successfully removed container on host [192.168.0.109] 
INFO[0129] [etcd] Pulling image [rancher/coreos-etcd:v3.2.18] on host [192.168.0.110] 
INFO[0136] [etcd] Successfully pulled image [rancher/coreos-etcd:v3.2.18] on host [192.168.0.110] 
INFO[0136] [etcd] Successfully started [etcd] container on host [192.168.0.110] 
INFO[0136] [etcd] Saving snapshot [etcd-rolling-snapshots] on host [192.168.0.110] 
INFO[0137] [etcd] Successfully started [etcd-rolling-snapshots] container on host [192.168.0.110] 
INFO[0137] [certificates] Successfully started [rke-bundle-cert] container on host [192.168.0.110] 
INFO[0137] [certificates] successfully saved certificate bundle [/opt/rke/etcd-snapshots//pki.bundle.tar.gz] on host [192.168.0.110] 
INFO[0138] [etcd] Successfully started [rke-log-linker] container on host [192.168.0.110] 
INFO[0138] [remove/rke-log-linker] Successfully removed container on host [192.168.0.110] 
INFO[0138] [etcd] Pulling image [rancher/coreos-etcd:v3.2.18] on host [192.168.0.111] 
INFO[0148] [etcd] Successfully pulled image [rancher/coreos-etcd:v3.2.18] on host [192.168.0.111] 
INFO[0148] [etcd] Successfully started [etcd] container on host [192.168.0.111] 
INFO[0148] [etcd] Saving snapshot [etcd-rolling-snapshots] on host [192.168.0.111] 
INFO[0149] [etcd] Successfully started [etcd-rolling-snapshots] container on host [192.168.0.111] 
INFO[0149] [certificates] Successfully started [rke-bundle-cert] container on host [192.168.0.111] 
INFO[0150] [certificates] successfully saved certificate bundle [/opt/rke/etcd-snapshots//pki.bundle.tar.gz] on host [192.168.0.111] 
INFO[0150] [etcd] Successfully started [rke-log-linker] container on host [192.168.0.111] 
INFO[0150] [remove/rke-log-linker] Successfully removed container on host [192.168.0.111] 
INFO[0150] [etcd] Successfully started etcd plane..     
INFO[0150] [controlplane] Building up Controller Plane.. 
INFO[0151] [controlplane] Successfully started [kube-apiserver] container on host [192.168.0.109] 
INFO[0151] [healthcheck] Start Healthcheck on service [kube-apiserver] on host [192.168.0.109] 
INFO[0152] [controlplane] Successfully started [kube-apiserver] container on host [192.168.0.111] 
INFO[0152] [healthcheck] Start Healthcheck on service [kube-apiserver] on host [192.168.0.111] 
INFO[0152] [controlplane] Successfully started [kube-apiserver] container on host [192.168.0.110] 
INFO[0152] [healthcheck] Start Healthcheck on service [kube-apiserver] on host [192.168.0.110] 
INFO[0169] [healthcheck] service [kube-apiserver] on host [192.168.0.109] is healthy 
INFO[0169] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.109] 
INFO[0169] [remove/rke-log-linker] Successfully removed container on host [192.168.0.109] 
INFO[0170] [controlplane] Successfully started [kube-controller-manager] container on host [192.168.0.109] 
INFO[0170] [healthcheck] Start Healthcheck on service [kube-controller-manager] on host [192.168.0.109] 
INFO[0170] [healthcheck] service [kube-apiserver] on host [192.168.0.110] is healthy 
INFO[0170] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.110] 
INFO[0171] [remove/rke-log-linker] Successfully removed container on host [192.168.0.110] 
INFO[0171] [healthcheck] service [kube-apiserver] on host [192.168.0.111] is healthy 
INFO[0171] [controlplane] Successfully started [kube-controller-manager] container on host [192.168.0.110] 
INFO[0171] [healthcheck] Start Healthcheck on service [kube-controller-manager] on host [192.168.0.110] 
INFO[0171] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.111] 
INFO[0172] [remove/rke-log-linker] Successfully removed container on host [192.168.0.111] 
INFO[0172] [controlplane] Successfully started [kube-controller-manager] container on host [192.168.0.111] 
INFO[0172] [healthcheck] Start Healthcheck on service [kube-controller-manager] on host [192.168.0.111] 
INFO[0175] [healthcheck] service [kube-controller-manager] on host [192.168.0.109] is healthy 
INFO[0176] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.109] 
INFO[0176] [healthcheck] service [kube-controller-manager] on host [192.168.0.110] is healthy 
INFO[0176] [remove/rke-log-linker] Successfully removed container on host [192.168.0.109] 
INFO[0177] [controlplane] Successfully started [kube-scheduler] container on host [192.168.0.109] 
INFO[0177] [healthcheck] Start Healthcheck on service [kube-scheduler] on host [192.168.0.109] 
INFO[0177] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.110] 
INFO[0177] [remove/rke-log-linker] Successfully removed container on host [192.168.0.110] 
INFO[0177] [controlplane] Successfully started [kube-scheduler] container on host [192.168.0.110] 
INFO[0177] [healthcheck] Start Healthcheck on service [kube-scheduler] on host [192.168.0.110] 
INFO[0178] [healthcheck] service [kube-controller-manager] on host [192.168.0.111] is healthy 
INFO[0179] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.111] 
INFO[0179] [remove/rke-log-linker] Successfully removed container on host [192.168.0.111] 
INFO[0179] [controlplane] Successfully started [kube-scheduler] container on host [192.168.0.111] 
INFO[0179] [healthcheck] Start Healthcheck on service [kube-scheduler] on host [192.168.0.111] 
INFO[0182] [healthcheck] service [kube-scheduler] on host [192.168.0.109] is healthy 
INFO[0183] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.109] 
INFO[0183] [healthcheck] service [kube-scheduler] on host [192.168.0.110] is healthy 
INFO[0183] [remove/rke-log-linker] Successfully removed container on host [192.168.0.109] 
INFO[0183] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.110] 
INFO[0184] [remove/rke-log-linker] Successfully removed container on host [192.168.0.110] 
INFO[0185] [healthcheck] service [kube-scheduler] on host [192.168.0.111] is healthy 
INFO[0185] [controlplane] Successfully started [rke-log-linker] container on host [192.168.0.111] 
INFO[0186] [remove/rke-log-linker] Successfully removed container on host [192.168.0.111] 
INFO[0186] [controlplane] Successfully started Controller Plane.. 
INFO[0186] [authz] Creating rke-job-deployer ServiceAccount 
INFO[0186] [authz] rke-job-deployer ServiceAccount created successfully 
INFO[0186] [authz] Creating system:node ClusterRoleBinding 
INFO[0186] [authz] system:node ClusterRoleBinding created successfully 
INFO[0186] [certificates] Save kubernetes certificates as secrets 
INFO[0186] [certificates] Successfully saved certificates as kubernetes secret [k8s-certs] 
INFO[0186] [state] Saving cluster state to Kubernetes   
INFO[0187] [state] Successfully Saved cluster state to Kubernetes ConfigMap: cluster-state 
INFO[0187] [state] Saving cluster state to cluster nodes 
INFO[0187] [state] Successfully started [cluster-state-deployer] container on host [192.168.0.109] 
INFO[0187] [remove/cluster-state-deployer] Successfully removed container on host [192.168.0.109] 
INFO[0188] [state] Successfully started [cluster-state-deployer] container on host [192.168.0.110] 
INFO[0188] [remove/cluster-state-deployer] Successfully removed container on host [192.168.0.110] 
INFO[0189] [state] Successfully started [cluster-state-deployer] container on host [192.168.0.111] 
INFO[0189] [remove/cluster-state-deployer] Successfully removed container on host [192.168.0.111] 
INFO[0189] [worker] Building up Worker Plane..          
INFO[0189] [remove/service-sidekick] Successfully removed container on host [192.168.0.109] 
INFO[0189] [remove/service-sidekick] Successfully removed container on host [192.168.0.110] 
INFO[0189] [remove/service-sidekick] Successfully removed container on host [192.168.0.111] 
INFO[0189] [worker] Successfully started [kubelet] container on host [192.168.0.109] 
INFO[0189] [healthcheck] Start Healthcheck on service [kubelet] on host [192.168.0.109] 
INFO[0189] [worker] Successfully started [kubelet] container on host [192.168.0.110] 
INFO[0189] [healthcheck] Start Healthcheck on service [kubelet] on host [192.168.0.110] 
INFO[0190] [worker] Successfully started [kubelet] container on host [192.168.0.111] 
INFO[0190] [healthcheck] Start Healthcheck on service [kubelet] on host [192.168.0.111] 
INFO[0195] [healthcheck] service [kubelet] on host [192.168.0.109] is healthy 
INFO[0195] [healthcheck] service [kubelet] on host [192.168.0.110] is healthy 
INFO[0195] [healthcheck] service [kubelet] on host [192.168.0.111] is healthy 
INFO[0195] [worker] Successfully started [rke-log-linker] container on host [192.168.0.109] 
INFO[0195] [worker] Successfully started [rke-log-linker] container on host [192.168.0.110] 
INFO[0196] [remove/rke-log-linker] Successfully removed container on host [192.168.0.109] 
INFO[0196] [remove/rke-log-linker] Successfully removed container on host [192.168.0.110] 
INFO[0196] [worker] Successfully started [rke-log-linker] container on host [192.168.0.111] 
INFO[0196] [worker] Successfully started [kube-proxy] container on host [192.168.0.109] 
INFO[0196] [healthcheck] Start Healthcheck on service [kube-proxy] on host [192.168.0.109] 
INFO[0196] [worker] Successfully started [kube-proxy] container on host [192.168.0.110] 
INFO[0196] [healthcheck] Start Healthcheck on service [kube-proxy] on host [192.168.0.110] 
INFO[0196] [remove/rke-log-linker] Successfully removed container on host [192.168.0.111] 
INFO[0196] [worker] Successfully started [kube-proxy] container on host [192.168.0.111] 
INFO[0196] [healthcheck] Start Healthcheck on service [kube-proxy] on host [192.168.0.111] 
INFO[0201] [healthcheck] service [kube-proxy] on host [192.168.0.109] is healthy 
INFO[0201] [healthcheck] service [kube-proxy] on host [192.168.0.110] is healthy 
INFO[0202] [worker] Successfully started [rke-log-linker] container on host [192.168.0.109] 
INFO[0202] [worker] Successfully started [rke-log-linker] container on host [192.168.0.110] 
INFO[0202] [healthcheck] service [kube-proxy] on host [192.168.0.111] is healthy 
INFO[0202] [remove/rke-log-linker] Successfully removed container on host [192.168.0.109] 
INFO[0202] [remove/rke-log-linker] Successfully removed container on host [192.168.0.110] 
INFO[0203] [worker] Successfully started [rke-log-linker] container on host [192.168.0.111] 
INFO[0203] [remove/rke-log-linker] Successfully removed container on host [192.168.0.111] 
INFO[0203] [worker] Successfully started Worker Plane.. 
INFO[0203] [sync] Syncing nodes Labels and Taints       
INFO[0205] [sync] Successfully synced nodes Labels and Taints 
INFO[0205] [network] Setting up network plugin: canal   
INFO[0205] [addons] Saving addon ConfigMap to Kubernetes 
INFO[0205] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-network-plugin 
INFO[0205] [addons] Executing deploy job..              
INFO[0215] [addons] Setting up KubeDNS                  
INFO[0215] [addons] Saving addon ConfigMap to Kubernetes 
INFO[0215] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-kubedns-addon 
INFO[0215] [addons] Executing deploy job..              
INFO[0220] [addons] KubeDNS deployed successfully..     
INFO[0220] [addons] Setting up Metrics Server           
INFO[0220] [addons] Saving addon ConfigMap to Kubernetes 
INFO[0220] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-metrics-addon 
INFO[0220] [addons] Executing deploy job..              
INFO[0225] [addons] KubeDNS deployed successfully..     
INFO[0225] [ingress] Setting up nginx ingress controller 
INFO[0225] [addons] Saving addon ConfigMap to Kubernetes 
INFO[0225] [addons] Successfully Saved addon to Kubernetes ConfigMap: rke-ingress-controller 
INFO[0225] [addons] Executing deploy job..              
INFO[0230] [ingress] ingress controller nginx is successfully deployed 
INFO[0230] [addons] Setting up user addons              
INFO[0230] [addons] no user addons defined              
INFO[0230] Finished building Kubernetes cluster successfully 
ubuntu@lb01:~$ 
```
</div></details>

### 3.4 kube_config_rancher-cluster.yml配布

- kube_config_rancher-cluster.yml配布

rkeコマンドによりrancher-server用ノードにkubernetesがインストールされると、LBノードにはkube_config_rancher-cluster.ymlが作成されている。

これをLBノードからrancher-server用ノード全台に配布する。

```
ubuntu@lb01:~$ ls
ubuntu@lb01:~$ cat kube_config_rancher-cluster.yml
ubuntu@lb01:~$ scp kube_config_rancher-cluster.yml ubuntu@master01:/home/ubuntu/
ubuntu@lb01:~$ scp kube_config_rancher-cluster.yml ubuntu@master02:/home/ubuntu/
ubuntu@lb01:~$ scp kube_config_rancher-cluster.yml ubuntu@master03:/home/ubuntu/
```

- .profileへの設定追加

YAML配布後、各rancher-server用ノードでkube_config_rancher-cluster.ymlを利用できるように.profileに設定を追加する

```
ubuntu@master01:~$ cp kube_config_rancher-cluster.yml kube_config_rancher-cluster.yml.org
ubuntu@master01:~$ cp .profile .profile.org
ubuntu@master01:~$ cat .profile
ubuntu@master01:~$ echo "export KUBECONFIG=/home/ubuntu/kube_config_rancher-cluster.yml" >> .profile
ubuntu@master01:~$ cat .profile
ubuntu@master01:~$ source .profile
ubuntu@master01:~$ env|grep KUBE
KUBECONFIG=/home/ubuntu/kube_config_rancher-cluster.yml
ubuntu@master01:~$ 
```

### 3.5 kubectlインストールと動作確認

rancher-server用ノード全台でkubectlをインストールする。
入れたあと、get nodes、get podsで軽く動作確認する。

```
ubuntu@master01:~$ sudo apt-get update && sudo apt-get install -y apt-transport-https
ubuntu@master01:~$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
ubuntu@master01:~$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
ubuntu@master01:~$ sudo apt-get update && sudo apt-get install -y kubectl
ubuntu@master01:~$ which kubectl
ubuntu@master01:~$ kubectl get nodes
ubuntu@master01:~$ kubectl get pods --all-namespaces -o wide
```

## 4. Helmインストール

[Initialize Helm (Install tiller)](https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-init/ "Initialize Helm (Install tiller)")に従い、rancher-server用ノードでTillerをインストールする。
ここでは、master01にて作業する。

### 4.1 Tillerサービスアカウントの設定

Tiller用のサービスアカウントを「kube-system」名前空間で作成し、
ロールとして「cluster-admin」を結びつけるClusterrole Bindingを作成する。

```
ubuntu@master01:~$ kubectl -n kube-system create serviceaccount tiller
ubuntu@master01:~$ kubectl -n kube-system get sa tiller -o yaml
ubuntu@master01:~$ kubectl create clusterrolebinding tiller --clusterrole cluster-admin  --serviceaccount=kube-system:tiller

```

### 4.2 kubectlによる状態確認

Clusterrole Bindingの作成後の確認ついでに、kubectlコマンドにより、サービスアカウントや
ロール、コンテキストについて状態確認した。

```
ubuntu@master01:~$ kubectl config get-contexts
ubuntu@master01:~$ kubectl config view
ubuntu@master01:~$ kubectl get clusterrolebinding tiller -o yaml
ubuntu@master01:~$ kubectl get clusterrole cluster-admin -o yaml
ubuntu@master01:~$ kubectl get clusterrolebindings
ubuntu@master01:~$ kubectl get clusterroles
ubuntu@master01:~$ kubectl get serviceaccounts
ubuntu@master01:~$ kubectl get serviceaccounts -n kube-system
```

### 4.3 Helmインストール

このあとでrancherをインストールするために、master01でhelmをインストールする。
helm初期化時は、さきほど作成したサービスアカウントtillerを指定する。

```
ubuntu@master01:~$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-amd64.tar.gz
ubuntu@master01:~$ tar -zxvf helm-v2.11.0-linux-amd64.tar.gz
ubuntu@master01:~$ sudo mv linux-amd64/helm /usr/local/bin/helm
ubuntu@master01:~$ which helm
ubuntu@master01:~$ helm init --service-account tiller
ubuntu@master01:~$ kubectl -n kube-system  rollout status deploy/tiller-deploy
ubuntu@master01:~$ helm version
```

## 5. cert-managerとrancherのインストール

[Install Rancher](https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/ "Install Rancher")に従い、helmによりcert-managerとrancherをインストールする。

### 5.1 Helmリポジトリ追加

master01にて、rancherのリポジトリを追加する。

```
ubuntu@master01:~$ helm repo list
ubuntu@master01:~$ helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
ubuntu@master01:~$ helm repo list
```

### 5.2 cert-managerインストール

[4 - Install Rancher](https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/#rancher-generated-certificates "4 - Install Rancher")において、今回「Rancher Generated Certificates」によりrancherをインストールするので、cert-managerが必要となる。

以下のコマンドにより、名前空間「kube-system」にcert-managerをインストールする。
インストールされたことを、helm lsにより確認する。

```
ubuntu@master01:~$ helm install stable/cert-manager --name cert-manager --namespace kube-system
ubuntu@master01:~$ helm ls --all
```

### 5.3 rancherインストール

rancherをhelmによりインストールする。
「Set the hostname to the DNS name you pointed at your load balancer.」
とあるので、その通り指定する。変な名前は指定しない。

```
ubuntu@master01:~$ helm install rancher-latest/rancher --name rancher --namespace cattle-system --set hostname=lb01.openstacklocal
ubuntu@master01:~$ helm ls --all
ubuntu@master01:~$ kubectl get pods -n ingress-nginx
```

もし設定を変えたい、などの理由でrancherを入れなおすときは、一度以下のコマンドで
rancherを削除してから、再度入れなおすこと。

```
ubuntu@master01:~$ helm del --purge rancher
```

## 6. LB構築

[NGINX](https://rancher.com/docs/rancher/v2.x/en/installation/ha/create-nodes-lb/nginx/ "NGINX")に従い、LBノードでnginxによるL4ロードバランサを構築する。

### 6.1 nginxインストール

[Ubuntu 16.04 (Xenial)でのnginxインストール手順](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/ "Ubuntu 16.04 (Xenial)でのnginxインストール手順")を参考に、LBノードにnginxをインストールする。

```
ubuntu@lb01:~$ cat add_nginx_list.sh
#!/bin/bash
# add_nginx_list.sh

listfile=/etc/apt/sources.list.d/nginx.list
if [ ! -f $listfile ]; then
    cat <<EOF > $listfile
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx
EOF
fi

if [ -f $listfile ]; then
    echo "print nginx.list..."
    cat $listfile
fi

ubuntu@lb01:~$ chmod +x add_nginx_list.sh
ubuntu@lb01:~$ sudo bash ./add_nginx_list.sh
ubuntu@lb01:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62
ubuntu@lb01:~$ sudo apt-get update
ubuntu@lb01:~$ sudo apt-get install nginx
```

なお、apt-keyコマンドを実行しなかった場合、sudo apt-get updateの時に
以下のようなエラーメッセージが出てしまうので、上記のように
apt-keyコマンドを実施後にsudo apt-get updateという手順にしてある。

```
W: GPG error: http://nginx.org/packages/ubuntu xenial Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY $key 
```

### 6.2 nginxの設定

nginxの設定ファイルにrancher-serverへの振り分けをする設定をしてnginxを起動する。
[NGINX](https://rancher.com/docs/rancher/v2.x/en/installation/ha/create-nodes-lb/nginx/ "NGINX")では「# nginx -s reload」を実行していたが、nginxをインストールした直後は起動していないので、単純にnginxコマンド実行にて起動した。

```
ubuntu@lb01:~$ sudo su
root@lb01:/home/ubuntu# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
root@lb01:/home/ubuntu# vi /etc/nginx/nginx.conf
root@lb01:/home/ubuntu# cat /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}
stream {
    upstream rancher_servers {
        least_conn;
        server 192.168.0.109:443 max_fails=3 fail_timeout=5s;
        server 192.168.0.110:443 max_fails=3 fail_timeout=5s;
        server 192.168.0.111:443 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     443;
        proxy_pass rancher_servers;
    }
}

root@lb01:/home/ubuntu# sudo nginx
```

nginx設定後、lb01にて
curl -k -X GET https://lb01.openstacklocal/
を何度か実行してみて、tcpdumpにより通信先がmaster#1～3で振分けできているか確認しておく。

## 7. 動作確認

ここまでで、L4ロードバランサ含めて構築ができたので、動作確認をしてみる。
今回、踏み台サーバを挟んだ先に環境構築しているため、Rancherの画面を確認するには一工夫いる。

### 7.1 踏み台サーバからのsshポート転送

- 踏み台サーバにsshログインのうえ、localhost:https(443)を172.16.24.150:443へssh転送する。
- [Tera Term](https://ja.osdn.net/projects/ttssh2/ "Tera Term")にて以下のように設定

![ssh-3-OK.png](https://qiita-image-store.s3.amazonaws.com/0/318326/7f06bddb-e2b8-c0e4-1fcb-24c64dfc0a5c.png)


### 7.2 名前解決設定の確認

クライアントからバックエンドにいたるまでのどこかで名前解決が適切に行われなかった場合、正しくrancher画面が見られず、「default backend - 404」画面を見ることになる。

![default-backend-404.png](https://qiita-image-store.s3.amazonaws.com/0/318326/29b13f71-67a3-c227-147d-85ad6d0bf791.png)

そのため、ここでLBノード、踏み台サーバ、クライアントの名前解決設定（hosts設定）を確認しておき、必要に応じ修正する。

- LBノードでのhosts設定

LBノードの/etc/hostsに以下がない場合は、追記しておく。

```
192.168.0.108  lb01.openstacklocal
```

- 踏み台でのhosts設定

踏み台サーバの/etc/hostsに以下がない場合は、追記しておく

```
172.16.24.150  lb01.openstacklocal
```

- クライアント側でのhosts設定

helmでrancherをインストールする際、「--set hostname=lb01.openstacklocal」を指定したが、これが証明書のCommon Nameになっている。

![cn2.png](https://qiita-image-store.s3.amazonaws.com/0/318326/5cd78330-41f3-8fee-3302-6d93b125036c.png)

そのため、ssh転送した上でブラウザからrancher画面にアクセスするとき、
「https://127.0.0.1/」
ではなく、CNにあわせて
「https://lb01.openstacklocal/」
によりアクセスする必要がある。

ということは、クライアント側のhostsに「127.0.0.1  lb01.openstacklocal」の
組合わせを記載しないとならない。メモ帳を管理者で起動して
C:\Windows\System32\drivers\etc\hosts
を編集することで、lb01.openstacklocalを127.0.0.1と対応づけるよう設定する。

```
# (略)
#	127.0.0.1       localhost
#	::1             localhost
127.0.0.1    localhost  lb01.openstacklocal
```

また、プロキシ環境からのアクセスになるため、「lb01.openstacklocal」にはプロキシなしで接続するようにブラウザで設定しないといけない。

### 7.3 クライアントからのアクセス

rancher画面に、ブラウザからアクセスしてみる。無事に開けますように。

![rancher-ha-1.png](https://qiita-image-store.s3.amazonaws.com/0/318326/b7aaf631-9d46-b6b0-2f8c-b0ee06e546e8.png)

![rancher-ha-2.png](https://qiita-image-store.s3.amazonaws.com/0/318326/e05104ad-4d60-cad2-1f3a-a15be9b9cd7c.png)

![rancher-ha-3.png](https://qiita-image-store.s3.amazonaws.com/0/318326/048323f7-8aed-b4dc-ba74-f1e6275855e2.png)

無事、開けました！

さて、とりあえずrancher画面までは辿り着いたものの、この時点ではその先をあまり触れていない
という意味で、ここまでで構築時に問題なかったのか？は、あまり確認できていないと言えます。

そのため別の機会に、このあとの動作確認と合わせ何か新機能などを試してみて、結果をご報告したいと思います！


# 参考

この記事を書くにあたり、以下を参考にさせていただきました。

## Docker
- [docker-ceインストール(ubuntu)](https://docs.docker.com/install/linux/docker-ce/ubuntu/ "docker-ceインストール(ubuntu)")

## Rancher
- [High Availability (HA) Install](https://rancher.com/docs/rancher/v2.x/en/installation/ha/ "High Availability (HA) Install")
- [Rancherの使用ポート](https://rancher.com/docs/rancher/v2.x/en/installation/requirements/ "Rancherの使用ポート")
- [Rancher release-note](https://github.com/rancher/rancher/releases "Rancher release-note")

## RKE
- [RKEのインストール](https://rancher.com/docs/rke/v0.1.x/en/installation/ "RKEのインストール")

## Helm
- [Initialize Helm (Install tiller)](https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-init/ "Initialize Helm (Install tiller)")
- [Helm](https://helm.sh/ "Helm")
- [Installing Helm](https://docs.helm.sh/using_helm/#installing-helm "Installing Helm")
- [Helmによるrancherインストール](https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/ "helmによるrancherインストール")
- [helmリポジトリ追加](https://rancher.com/docs/rancher/v2.x/en/installation/server-tags/#helm-chart-repositories "helmリポジトリ追加")

## Nginx
- [nginx](https://www.nginx.com/ "nginx")
- [HA Install with External Load Balancer (TCP/Layer 4)](https://rancher.com/docs/rancher/v2.x/en/installation/ha/rke-add-on/layer-4-lb/#1-provision-linux-hosts "HA Install with External Load Balancer (TCP/Layer 4)")


# まとめ

- Rancher 2.1のHA installでの構築をやってみました。
- Rancherは機能盛りだくさん。今後も
[当社のコラム・ブログ「情報畑でつかまえて」](https://www.ntt-tx.co.jp/column/?utm_source=qiita&utm_medium=ac2018&utm_campaign=02 "NTTテクノクロス コラム・ブログ「情報畑でつかまえて」")で引き続き、Rancherやコンテナに関する記事を投稿予定です！