RancherOS+k3s+Rancherで、超軽量のKubeお勉強環境を作ってみた

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2ec65192-234c-791c-32ab-86af1e11f944.png)
# はじめに
こんにちわ！石田です。昨年くらいから「これからの技術者はKubernetesのスキル付けんと（どうこう）」ってことで、Qiita読者の皆様はもうk8sをあれこれお勉強中かと思います。私もあれこれ試してたんですが

- とにかく手間かけずに現物を触ってみたいならメガ・ベンダーが提供するk8sのクラウド・サービスが一番簡単でしょうが、各々独自のお約束や手間があるし、自分で環境作らないと、なんか腹落ちしません。（すぐ動くけど、やったことすぐ忘れそう）
- 「minikubeってのがあるよ」ってことで自分のPCに入れてみたんですが、結構重いです！私のPCはメモリ16GB/SSDのThinkpadなんですが、VMWareで実行するとメモリ8GB割り当てても、起動までにかなり待たされますし、なんか「モッサリ」感が否めません。

そんな時にRancherLabsからk8sの軽量版、k3sってのが出たよ、と知りました。「すごく軽い」と聞いたんで試してみたら、確かに導入も簡単でメチャ軽い！これでCNCFの認証通ってるって、すごいなあと素直に驚きました。IoTなどのエッジ向け、ってことですし、まだバージョンも0.2でHAも未実装＝要は「発展途上」のようですが、クラスターもコンテナも普通に動くのでお勉強用ならこれで十分。軽さとシンプルさは正義です。

ということで、k3sのご紹介記事を書こうと思ったのですが、もう先達の記事が色々ありますし**k3sだけだと「ダウンロードして起動するだけ」なんでシンプルすぎて記事になりません。**(＝スバラシイ！）

ついては**「RancherOS+k3s+Rancher」のRancherLabs３兄弟**の組み合わせでお勉強環境の構築手順を書くことにしました。「この通りやってけば数十分でkubeの環境が作れる」ように書きます。

:triangular_flag_on_post: 当記事の執筆時点は2019/3月です。先々バージョンやコマンドが変わるかもしれませんが、その場合はご容赦ください。
:triangular_flag_on_post: (2019/7/3) 当記事は2019/3月に投稿しましたが、その後、4月になって[RancherOSとk3sをセットにした**k3OS**が発表](https://www.publickey1.jp/blog/19/kuberneteslinuxk3oskuberneteskubernetesrancher_labs.html)されました。こちらのほうがより便利かもしれませんが、執筆時期の関係もあり**当記事では扱っておりません**ので念のため申し添えます。[^7]

[^7]: おかげさまで当記事は今も読んでいただいているようなので、k3osに言及しておかないと知識が古いままになり申し訳ないなあ、と思ったので追記しました。

# まずは、用語の整理

（私がそうでしたが）Rancher周りが初めての方は混乱するかも、と思うので、まず用語をおさらいしますね。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/95bf7ca5-db31-9c1c-3522-eeec664da591.png)

上記のように**RancherOS**(または別のLinux+Docker)上で**Rancher**やk3sが動きます。(特に**RancherOSとRancherは別のもの**なので混同しないようにしましょう)
:triangular_flag_on_post: (2018/3/29) @inductorさんに「k3sにはdocker不要」とのコメントを頂いたので、不明確だった記述を修正しました。変更箇所は:memo:の印を付けています。

### :one: RancherOS

- Dockerコンテナの実行に特化した軽量OSです
- Dockerを内蔵してますので、Dockerの別導入は不要です
- IoTやエッジデバイス向けですが、PC上でも軽くて便利！
- 売り文句: **OS Fast, ultra-lightweight container OS**
- Rancherやk3sを動かす環境としてのOSはubuntuやRHELでもいいです。[^1] 

[^1]: まあ今回はRancherOSを使いますが、RancherOSは軽量すぎて何も入って無いんで、ぶっちゃけ、お勉強ならUbuntuの方が楽かも、、とは思います。ubuntuならdockerの導入も一発( apt install docker.io)で楽ですし。

### :two: Rancher

- Kunbenetesを管理するためのUIダッシュボード/ツールです
- マルチベンダー/ハイブリッドを謳っており、様々なKubeを一元管理できます  
- 売り文句: **An Enterprise Platform for Managing Kubernetes Everywhere**
- :memo:(追記) Rancherはdocker runで起動するので、ubuntuやRHEL上で動かす場合、Dockerを別途導入してください

### :three: k3s

- 40MBという超軽量なKubernetesの実装です
- 高可用性(HA)は現在未実装ですが、導入も簡単でサクサク動くのでKubeのお勉強には最適！
- 売り文句: **Lightweight Kubernetes Easy to install. A binary of less than 40 MB. Only 512 MB of RAM required to run.** 
- :memo:(追記) ubuntuやRHELで動かす場合でも、k3sはDockerの代わりにcontainerdが内蔵されているので、Dockerは不要です

### :four: k8s

- Rancherの管理対象となるマルチベンダー/ハイブリッドな様々なKubernetes実装群
- Rancherから独自のkubernetes環境を構築することもできます

なお今回は意図して:one:～:three:の組み合わせでご紹介しますが、各々は独立しており、依存関係は関係はありません。つまり、

- Rancherやk3sはRancherOSが前提ではありません。例えばubuntu等の上でも、導入して動かせます
- k3sを動かすのにRancherは必須ではありません。ks3の実体は単独の実行バイナリーです。今回はRancher自体のお勉強も兼ねて、k3sの管理やリソース可視化のために入れてみるだけ、です。
- Rancherはk3sのためのツールではなく、より幅広い一般的なKubertetesの管理ツールです
- 上記の絵では１ノードのイメージで表現してしまっていますが、Rancherとk3sは別のノードであってもかまいません。共存も、分離もできます。（ただし後述しますが同一ノードのときはポート競合に注意)

ちなみに**Rancher Labs**が上記の開発元の会社の名前です。

なお、以下は**１ノードの環境に全部詰め込む前提**で書いてます。
では早速、やってみます！


# 1. RancherOS
まずはOSを用意しましょう。筆者の環境は

- Thinkpad X230 / Windows 
- VMWare Workstation Pro 12.5

なのでVMWareでやりますが、その他の仮想化環境でも大丈夫かと思います。


### 1) イメージ(iso)の入手

[Rancher.com](https://rancher.com/rancher-os/)からダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4a232d1e-f5df-c364-cfa0-172785d69d36.png)
「Download Now」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a4030cef-668e-6dd4-03ae-452e7ae05efc.png)
環境別のイメージが用意されています。今回は一番普通っぽい rancheros.isoを選択[^2]。全体が88MBしかないのですぐ終わります。

[^2]: rancheros-vmware.isoでもよかったのでしょうが、やってません。


### 2) VMWareでのVM設定と起動

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0a0088d4-bde2-8ae0-3691-0a13d24ae4e7.png)

普通にVMを定義してISOで起動すればいいだけですが、一点だけ、ゲストOSは「**Linux-他のLinux 3.xカーネル 64ビット**」とします。

### 3) ISOを使ったブートとOSインストール

ISOでブートします。筆者の環境では２分くらいでインストール完了します。

【1】ブート起動直後の画面
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7bc70ff6-7da6-ea5f-349b-a4e9a08ce149.png)

【2】自動的にopenvmtoolsのコンテナイメージがダウンロードされます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/101c7aba-f905-b8a8-c4d2-9e5624dd1ae8.png)

【3】`RancherOS vX.Y.Z started`が表示されたら起動完了です

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/cffee9be-b3b0-506c-d165-23b0b20b8ae5.png)

【4】デフォルトユーザー **rancher**(/パスワードなし)でコンソールにログインできます 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8ff792ef-af67-9294-21cf-96f776cdab36.png)


### 4) リモートログインのためにユーザー rancherにパスワードを設定する

この後puttyとか使いたいのですが、このままではリモートからはでログインできません。

【1】下記のコマンドでユーザー rancherにパスワードを設定するとリモート・ログインできるようになります。

`sudo ros install -d /dev/sda --append "rancher.password=password"`

 - rancher.password=に任意のパスワードを設定してください
 - VMWareのコンソール上、この時点では英語キーボードになっていますので"とか=の文字入力がしずらいですが、[USキーボードの配列](http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm)を見ながら入力してください

【2】Continueに「**y**」を答えます
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d74f2917-7b24-c11c-0847-222497fe729f.png)

【3】リブートするかどうか聞かれるので「**y**」を答える
→リブートされます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/990f2a4c-bd39-cdc9-decf-26265e16f077.png)


### 5) リブート後の再ログイン

【1】ユーザー rancherでログインすると、今度はパスワードを聞かれるので、設定したパスワードでログインします
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/1c5319a0-86b7-aa9b-9db9-c15883acd92a.png)

【2】`ifconfig -a`でIPアドレスを確認します
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/78bf6572-83d6-0039-42bf-a10a8c5fd03b.png)

### 6) SSHでログイン

sshでログインできました。筆者はSuperPuttyを使いましたが、要はお好みのsshクライアントでよろしいかと。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/004a2502-2501-5d5b-3052-eb07b625f22f.png)


### 7) curlなどを使えるよう、コンソールを切り替えておく

RancherOSは軽量化のためコンテナを実行するのに必要な最低限の機能のみが有効化されています。デフォルトのコンソールのままではapt-getもcurlも使えません。[^3] dockerコマンドは使えるのでコンテナを実行するだけならこれでもいいのですが、k3sは実行バイナリーをダウンロードする必要があるのでcurlが必要です。コンソールをデフォルトのものからubuntuのものに切り替えるとapt-getやcurlが使えるようになります。やってみましょう。

[^3]: 各種のserviceは当初は無効化(disabled)されていますが、必要ならrosコマンドで有効化(enable)できます

【1】切り替え手順

`sudo ros console list`でコンソールの状態を確認し、
`sudo ros console switch ubuntu`で切り替えます
確認にyを答えるとログアウトされるので、再ログインして
`sudo apt-get -v`
`curl`
で両コマンドが使えることを確認します。


<details><summary>【実行例】</summary><div>

```bash
[rancher@rancher ~]$ sudo ros console list
disabled alpine
disabled centos
disabled debian
current  default
disabled fedora
disabled ubuntu
[rancher@rancher ~]$ sudo ros console switch ubuntu
Switching consoles will
1. destroy the current console container
2. log you out
3. restart Docker
Continue [y/N]: y
ERRO[0030] Missing the image: Error: No such image: docker.io/rancher/os-ubuntuconsole:v1.4.3
Pulling console (docker.io/rancher/os-ubuntuconsole:v1.4.3)...
v1.4.3: Pulling from rancher/os-ubuntuconsole

6cf436f81810: Pull complete
987088a85b96: Pull complete
b4624b3efe06: Pull complete
d42beb8ded59: Pull complete
2213fb92a87a: Pull complete
ec69cc1fb387: Pull complete
Digest: sha256:ec123f657bbf8ff340460ff4c5686ce0f1cbb969f08b909c881b0e7591395840
Status: Downloaded newer image for rancher/os-ubuntuconsole:v1.4.3
switch-console_1 | time="2019-03-18T14:30:16Z" level=info msg="Project [os]: Starting project "
switch-console_1 | time="2019-03-18T14:30:16Z" level=info msg="[0/20] [console]: Starting "
switch-console_1 | time="2019-03-18T14:30:16Z" level=info msg="Recreating console"

===ログアウトされる===
===再度ログインする===
Using username "rancher".
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.14.73-rancher x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

rancher@rancher:~$

```
</div></details>


<details><summary>【実行例】curlとapt-getが使えることの確認</summary><div>

```bash
rancher@rancher:~$ sudo apt-get -v
apt 1.6.8 (amd64)
Supported modules:
*Ver: Standard .deb
*Pkg:  Debian dpkg interface (Priority 30)
 Pkg:  Debian APT solver interface (Priority -1000)
 Pkg:  Debian APT planner interface (Priority -1000)
 S.L: 'deb' Debian binary tree
 S.L: 'deb-src' Debian source tree
 Idx: Debian Source Index
 Idx: Debian Package Index
 Idx: Debian Translation Index
 Idx: Debian dpkg status file
 Idx: Debian deb file
 Idx: Debian dsc file
 Idx: Debian control file
 Idx: EDSP scenario file
 Idx: EIPP scenario file
rancher@rancher:~$ curl
curl: try 'curl --help' or 'curl --manual' for more information
```
</div></details>


### 8) Dockerの稼動を確認

docker環境が動くことも確認しておきます

【1】確認例
`docker ps`
`docker run hello-world`

<details><summary>【実行例】docker run hello-world</summary><div>

```bash
rancher@rancher:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

rancher@rancher:~$

```
</div></details>

以上でRancherOSのインストールと設定は完了です。

### 9) ご参考

- VMWareでは次回のリブートでisoから始動せぬよう、isoを外しておきましょう

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8726b441-07d5-0a3c-e0d2-4624a84af269.png)

- RancherOSでsudoを毎回打つのが面倒なら以下でrootにsuできます

`sudo passwd root` →新しいパスワードの入力
`su -`

<details><summary>【実行例】rootになる</summary><div>

```bash:rootになる
rancher@rancher:~$ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
rancher@rancher:~$ su -
Password:
root@rancher:~# whoami
root
root@rancher:~#
```

</div></details>

# 2. k3s

次はk3sのインストールです。っても40MB弱の実行バイナリーをダウンロードして起動するだけで、超簡単です！

:warning: [k3sのトップページ](https://k3s.io/)では以下のように
` curl -sfL https://get.k3s.io | sh -`でもいいよ～と書いてあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/656f83c8-9762-36dd-8120-70582e27fa22.png)

ubuntuとかならこの一発でいいんですが、RancherOSではsystemdが無いのでエラーになります[^4]。よって[githubのリポジトリ](https://github.com/rancher/k3s)から実行バイナリーを直にダウンロードします。


```bash:RancherOSではエラー
rancher@rancher:~$ sudo curl -sfL https://get.k3s.io | sh -
[ERROR]  Can not find systemd to use as a process supervisor for k3s
```

[^4]: RancherOSではsystemdの代わりにsystem-dockerってのが動いてます。

### 1) 実行バイナリーのダウンロード

`sudo curl -L "https://github.com/rancher/k3s/releases/download/v0.2.0/k3s" -o /usr/local/bin/k3s`　で、ダウンロードして/usr/local/binにコピー
`sudo chmod +x /usr/local/bin/k3s`で実行フラグつけます

:warning: 上記のURL中のv0.2.0の部分は[ここ](https://github.com/rancher/k3s/releases/)見て**適宜、最新のものに変更してください**

<details><summary>実行例</summary><div>

```bash:
rancher@rancher:~$ sudo curl -L "https://github.com/rancher/k3s/releases/download/v0.2.0/k3s" -o /usr/local/bin/k3s
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   594    0   594    0     0    370      0 --:--:--  0:00:01 --:--:--   370
100 35.9M  100 35.9M    0     0   163k      0  0:03:45  0:03:45 --:--:--  173k
rancher@rancher:~$ sudo chmod +x /usr/local/bin/k3s
rancher@rancher:~$ ls -al /usr/local/bin/k3s
-rwxr-xr-x 1 root root 37735552 Mar 19 04:49 /usr/local/bin/k3s
rancher@rancher:~$

```

</div></details>

### 2) k3s(クラスター)の起動

`sudo k3s server &`でk3sのクラスターをバックグランド実行します。
`sudo k3s kubectl get nodes` でクラスターがReadyであることを確認します。


<details><summary>【実行例】</summary><div>

```bash
rancher@rancher:~$ sudo k3s server &
[1] 2314
rancher@rancher:~$ INFO[0000] Preparing data dir /var/lib/rancher/k3s/data/e44f7a46cadac4cec9a759756f2a27fdb25e705a83d8d563207c6a6c5fa368b4
INFO[2019-03-19T05:18:26.079861991Z] Starting k3s v0.2.0 (2771ae1)
INFO[2019-03-19T05:18:27.979256923Z] Running kube-apiserver --watch-cache=false --cert-dir /var/lib/rancher/k3s/server/tls/temporary-certs --allow-privileged=true --authorization-mode Node,RBAC --service-account-signing-key-file /var/lib/rancher/k3s/server/tls/service.key --service-cluster-ip-range 10.43.0.0/16 --advertise-port 6445 --advertise-address 127.0.0.1 --insecure-port 0 --secure-port 6444 --bind-address 127.0.0.1 --tls-cert-file /var/lib/rancher/k3s/server/tls/localhost.crt --tls-private-key-file /var/lib/rancher/k3s/server/tls/localhost.key --service-account-key-file /var/lib/rancher/k3s/server/tls/service.key --service-account-issuer k3s --api-audiences unknown --basic-auth-file /var/lib/rancher/k3s/server/cred/passwd --kubelet-client-certificate /var/lib/rancher/k3s/server/tls/token-node.crt --kubelet-client-key /var/lib/rancher/k3s/server/tls/token-node.key
INFO[2019-03-19T05:18:28.973264623Z] Running kube-scheduler --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --port 10251 --address 127.0.0.1 --secure-port 0 --leader-elect=false
INFO[2019-03-19T05:18:28.977256753Z] Creating CRD listenerconfigs.k3s.cattle.io
INFO[2019-03-19T05:18:28.996962188Z] Running kube-controller-manager --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --service-account-private-key-file /var/lib/rancher/k3s/server/tls/service.key --allocate-node-cidrs --cluster-cidr 10.42.0.0/16 --root-ca-file /var/lib/rancher/k3s/server/tls/token-ca.crt --port 10252 --address 127.0.0.1 --secure-port 0 --leader-elect=false
Flag --address has been deprecated, see --bind-address instead.
INFO[2019-03-19T05:18:29.096540855Z] Creating CRD addons.k3s.cattle.io
INFO[2019-03-19T05:18:29.099448611Z] Creating CRD helmcharts.k3s.cattle.io
INFO[2019-03-19T05:18:29.152491793Z] Waiting for CRD addons.k3s.cattle.io to become available
INFO[2019-03-19T05:18:29.658810108Z] Done waiting for CRD addons.k3s.cattle.io to become available
INFO[2019-03-19T05:18:29.659264325Z] Waiting for CRD helmcharts.k3s.cattle.io to become available
INFO[2019-03-19T05:18:30.162743240Z] Done waiting for CRD helmcharts.k3s.cattle.io to become available
INFO[2019-03-19T05:18:30.165942412Z] Listening on :6443
INFO[2019-03-19T05:18:31.382331741Z] Node token is available at /var/lib/rancher/k3s/server/node-token
INFO[2019-03-19T05:18:31.382582891Z] To join node to cluster: k3s agent -s https://192.168.118.144:6443 -t ${NODE_TOKEN}
INFO[2019-03-19T05:18:31.385053592Z] Writing manifest: /var/lib/rancher/k3s/server/manifests/coredns.yaml
INFO[2019-03-19T05:18:31.385334019Z] Writing manifest: /var/lib/rancher/k3s/server/manifests/traefik.yaml
INFO[2019-03-19T05:18:31.941839249Z] Wrote kubeconfig /etc/rancher/k3s/k3s.yaml
INFO[2019-03-19T05:18:31.941874823Z] Run: k3s kubectl
INFO[2019-03-19T05:18:31.941882500Z] k3s is up and running
INFO[2019-03-19T05:18:32.010735171Z] Logging containerd to /var/lib/rancher/k3s/agent/containerd/containerd.log
INFO[2019-03-19T05:18:32.010966950Z] Running containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/k3s/agent/containerd
INFO[2019-03-19T05:18:32.011088117Z] Waiting for containerd startup: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial unix /run/k3s/containerd/containerd.sock: connect: no such file or directory"
INFO[2019-03-19T05:18:33.022583350Z] Connecting to wss://localhost:6443/v1-k3s/connect
INFO[2019-03-19T05:18:33.022742208Z] Connecting to proxy                           url="wss://localhost:6443/v1-k3s/connect"
INFO[2019-03-19T05:18:33.034916056Z] Handling backend connection request [rancher]
WARN[2019-03-19T05:18:33.061762193Z] Disabling CPU quotas due to missing cpu.cfs_period_us
INFO[2019-03-19T05:18:33.061897865Z] Running kubelet --healthz-bind-address 127.0.0.1 --read-only-port 0 --allow-privileged=true --cluster-domain cluster.local --kubeconfig /var/lib/rancher/k3s/agent/kubeconfig.yaml --eviction-hard imagefs.available<5%,nodefs.available<5% --eviction-minimum-reclaim imagefs.available=10%,nodefs.available=10% --fail-swap-on=false --cgroup-driver cgroupfs --root-dir /var/lib/rancher/k3s/agent/kubelet --cert-dir /var/lib/rancher/k3s/agent/kubelet/pki --seccomp-profile-root /var/lib/rancher/k3s/agent/kubelet/seccomp --cni-conf-dir /var/lib/rancher/k3s/agent/etc/cni/net.d --cni-bin-dir /var/lib/rancher/k3s/data/e44f7a46cadac4cec9a759756f2a27fdb25e705a83d8d563207c6a6c5fa368b4/bin --cluster-dns 10.43.0.10 --container-runtime remote --container-runtime-endpoint unix:///run/k3s/containerd/containerd.sock --address 127.0.0.1 --anonymous-auth=false --client-ca-file /var/lib/rancher/k3s/agent/client-ca.pem --hostname-override rancher --cpu-cfs-quota=false
Flag --allow-privileged has been deprecated, will be removed in a future version
INFO[2019-03-19T05:18:33.096232102Z] waiting for node rancher: nodes "rancher" not found
INFO[2019-03-19T05:18:35.170536317Z] waiting for node rancher CIDR not assigned yet
INFO[2019-03-19T05:18:37.175216057Z] waiting for node rancher CIDR not assigned yet
INFO[2019-03-19T05:18:39.180562347Z] waiting for node rancher CIDR not assigned yet
INFO[2019-03-19T05:18:41.185533616Z] waiting for node rancher CIDR not assigned yet
INFO[2019-03-19T05:18:43.191732721Z] waiting for node rancher CIDR not assigned yet

[[Ctrl+C]]でstdoutを終わらせる

rancher@rancher:~$ sudo k3s kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
rancher   Ready    <none>   14m   v1.13.4-k3s.1

```

</div>
</details>

:triangular_flag_on_post: 以下ご参考ですが、k3sは実はserver/agentの2層構造です。ただしデフォルトではserver起動時にagentも自動的に起動されますので１ノード構成ではagentは意識不要です。もしもagentを別マシンで起動したければ`k3s server --disable-agent`でサーバーをagentなしで起動してから
別マシンで`sudo k3s agent --server https://myserver:6443 --token ${NODE_TOKEN}`でエージェントを起動します。

詳しくは[ドキュメント](https://github.com/rancher/k3s)の「Running server」「Joining nodes」のあたりをご参照ください。

### 3) (オプション) kubectlを/usr/local/binにコピーして直接使えるようにする

デフォルトでもコマンド **k3s kubectl ～**のようにk3sを介してkubectlコマンドを使えますが、面倒なのでkubectlを/usr/local/binにコピーして、直接使えるようにしておきます。（当作業はオプションです。やらなくても支障はありません）

 `sudo find / -name kubectl -print`で実行モジュールをみつけて
 `cp -p /var/lib/rancher/k3s/data/xxxxxxxxxxx/bin/kubectl /usr/local/bin`でコピー
  `kubectl get nodes`でk3s抜きでもコマンドが使えることを確認
 
 
<details><summary>【実行例】</summary><div>

```bash
rancher@rancher:~$ kubectl
-bash: kubectl: command not found
rancher@rancher:~$  sudo find / -name kubectl -print
/var/lib/rancher/k3s/data/e44f7a46cadac4cec9a759756f2a27fdb25e705a83d8d563207c6a6c5fa368b4/bin/kubectl
find: '/proc/655/task/655/net': Invalid argument
(途中省略)
rancher@rancher:~$ sudo cp -p /var/lib/rancher/k3s/data/e44f7a46cadac4cec9a759756f2a27fdb25e705a83d8d563207c6a6c5fa368b4/bin/kubectl /usr/local/bin
rancher@rancher:~$ ls -al /usr/local/bin/kubectl
-rwxr-xr-x 1 root root 85842112 Mar  9 02:46 /usr/local/bin/kubectl

rancher@rancher:~$ kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
rancher   Ready    <none>   12m   v1.13.4-k3s.1

```
</div></details>

### 4) nginxのコンテナを動かしてみる 

:triangular_flag_on_post: 以下の表記で、コマンド先頭の(k3s)の部分は前項でkubectlを直接打てるように設定した場合は不要、という意味です。

【1】コンテナのデプロイと起動
`(k3s) kubectl run nginx --image=nginx:latest`　でコンテナをクラスターにデプロイし
`(k3s) kubectl get pods`で状態がRunningになるまで待ちます

<details><summary>【実行例】</summary><div>

```bash
rancher@rancher:~$ k3s kubectl run nginx --image=nginx:latest
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
rancher@rancher:~$ k3s kubectl get pods
NAME                    READY   STATUS              RESTARTS   AGE
nginx-585fddf4b-4b8jj   0/1     ContainerCreating   0          21s
rancher@rancher:~$ k3s kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-585fddf4b-4b8jj   1/1     Running   0          92s
rancher@rancher:~$
```
</div></details>

【2】稼動確認のため、ポートの公開
`(k3s) kubectl expose deployment/nginx --type=NodePort --port=80`で外向けポートを公開し
`(k3s) kubectl get svc`で割り当てられたポート番号を確認します(X:Y/TCPのY)

<details><summary>【実行例】</summary><div>

```bash:
rancher@rancher:~$ k3s kubectl expose deployment/nginx --type=NodePort --port=80
service/nginx exposed
rancher@rancher:~$ k3s kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1     <none>        443/TCP        6m5s
nginx        NodePort    10.43.45.95   <none>        80:32411/TCP   44s

```
</div></details>

【3】nginxの稼動確認

ブラウザーでHTTPでアクセスするとnginxが動いているのがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/35136ea5-6427-d664-9c3d-aabfe71999bf.png)

【3】後始末

`kubectl get deployments`で名前を確認して
`kubectl delete deployments nginx`でデプロイメントを消す
`kubectl delete svc nginx`でサービスを消す

<details><summary>【実行例】</summary><div>

```bash:後始末
rancher@rancher:~$ kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           16m
rancher@rancher:~$ kubectl delete deployments
error: resource(s) were provided, but no name, label selector, or --all flag specified
rancher@rancher:~$ kubectl delete deployments nginx
deployment.extensions "nginx" deleted
rancher@rancher:~$ kubectl get deployments
No resources found.
rancher@rancher:~$ kubectl get pods
No resources found.
rancher@rancher:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1     <none>        443/TCP        129m
nginx        NodePort    10.43.45.95   <none>        80:32411/TCP   124m
rancher@rancher:~$ kubectl delete svc nginx
service "nginx" deleted
rancher@rancher:~$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   130m
rancher@rancher:~$

```
</div></details>

# 3. Rancher
稼働中のk3sクラスターをRancherで管理できるように登録します

### 1) コンテナ rancher/rancherの起動 

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ba73caa7-e63b-7ae3-8d7a-ef9b01e7b4c8.png)

`sudo docker run -d --restart=unless-stopped -p 8080:80 -p 449:443 rancher/rancher:v2.2.0-rc6`　でrancherを起動します。Docker Hubから自動的にコンテナイメージがダウンロードされます。

:warning: 同一ノードでk3sと一緒に動かすときはポートが被るため、rancher側の外向けポートを変更してください。上記ではhttpを8080にhttpsを449に変更しています
:triangular_flag_on_post: rancherには1.x系(rancher/server)と2.x系(rancher/rancher)があります。今回はPrometheusに対応した最新版を使いたかったので明示的にタグを指定(:v2.2.0-rc6)しました。その時点での最新版のタグは[こちらから](https://hub.docker.com/r/rancher/rancher/tags)確認できます。安定版でよいならタグなし(≒latest)でいいと思います。

<details><summary>【実行例】</summary><div>

```bash
rancher@rancher:~$ sudo docker run -d --restart=unless-stopped -p 8080:80 -p 449:443 rancher/rancher:v2.2.0-rc6
Unable to find image 'rancher/rancher:v2.2.0-rc6' locally
v2.2.0-rc6: Pulling from rancher/rancher
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
6897608b7b9b: Pull complete
c6a7299acae7: Pull complete
459492722b0b: Pull complete
1561e91246c3: Pull complete
8544aa5eabc5: Pull complete
99b14c64eae3: Pull complete
7bf88285e9b5: Pull complete
ec6e883abd70: Pull complete
Digest: sha256:dd7c5b4fc3c6671f1a12805f2f7cf3d75b2b489464068125c114aa8539c30c4c
Status: Downloaded newer image for rancher/rancher:v2.2.0-rc6
b6694394617a98a46c40624d87730b76fd566df1e6472ec442d9a576d719138d
rancher@rancher:~$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                                        NAMES
b6694394617a        rancher/rancher:v2.2.0-rc6   "entrypoint.sh"     2 minutes ago       Up About a minute   0.0.0.0:8080->80/tcp, 0.0.0.0:449->443/tcp   mystifying_bose
rancher@rancher:~$

```


</div></details>

### 2) ダッシュボードへのアクセス

【1】アクセス
すでにrancherは動いています。ブラウザーで`https://<IPアドレス>:449`[^5]にアクセスするとパスワードを設定するように求められるので、任意のものに設定します。
[^5]: 念のためですが、この例ではrancher起動時にポート449を指定したので449を指定しました。違う値ならその値を指定してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/731964bf-4c78-e706-eb3e-b2358dade7dd.png)

次回からのURLです
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8dfbfa9c-0c8e-80ac-3a28-41804f657432.png)

### 3) k3sクラスターの追加（登録)

【1】既にk3sのクラスターは動いていますのでrancherに追加しましょう。
「Add Cluster」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d8410a59-d170-eed3-aff5-16b373327016.png)

【2】
- クラスターの種類から右上の「import」を選択
- Cluster Nameに任意の名前を入力
- 「Create」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/77301a87-9b47-98cc-8312-93b36e69d559.png)

【3】既存クラスターをRancherに登録するためのコマンドが表示されますので、最下のコマンドを実行します
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0034b114-3f06-8f8b-21f1-c7d145f5c2d4.png)

<details><summary>【実行例】</summary><div>

```bash
rancher@rancher:~$ kubectl apply -f https://192.168.118.144:449/v3/import/bjgt6mmcqx5pr7cfcx4b89bpfb92jgjz22mcnqp4rm8bqh98k7jggj.yaml
Unable to connect to the server: x509: certificate signed by unknown authority
rancher@rancher:~$ curl --insecure -sfL https://192.168.118.144:449/v3/import/bjgt6mmcqx5pr7cfcx4b89bpfb92jgjz22mcnqp4rm8bqh98k7jggj.yaml | kubectl apply -f -
namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-c568c94 created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.extensions/cattle-cluster-agent created
daemonset.extensions/cattle-node-agent created
rancher@rancher:~$
```
</div></details>

しばらくするとクラスターがactiveになります

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/526ff053-809f-adb2-818c-5b53e422f6bc.png)

【4】リソース監視の活動化

k3sをクリックして次パネルで「Enable Monitoring to see live metrics」をクリック(:warning:V2.2以降でないとこのリンクは表示されません）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b354da3c-abc0-e147-5e19-2eacb751306e.png)

モニタリングを「Enable」にして「Save」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/41552e2a-5f94-886c-c831-48be06d01b02.png)

活動化した直後は「Monitoring API Not Ready」ですが、しばらくするとデータが収集され、性能データが見られるようになります
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a8058336-b00e-8dee-0c62-1c4ba1379fb3.png)

以下はCluster Metrics
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/242152f1-03ff-6cae-b0bf-3b1f035bee04.png)

Grafanaは当記事執筆時点(2019/03-2.2.0RC6)では「Node」の情報だけはきちんと表示されました。カッコイイですね。[^6]
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/1cff514d-cb0e-45dc-089f-a81461d8a82d.png)

[^6]: 筆者の環境では他の部分の情報が表示されないのですが、RCゆえのバグか、設定が必要なのかは未調査です。

以上です。お疲れ様でした！

### ご参考文献やリンク

|    | RancherOS | k3s | Rancher |
|:---|:---:|:---:|:---:|
|    | -------------------- | -------------------- | -------------------- |
|:house: ホーム| [Link](https://rancher.com/rancher-os/)| [Link](https://k3s.io/)| [Link](https://rancher.com/products/rancher/)|
|:rocket: Quick Start|[Link](https://rancher.com/docs/os/v1.x/en/quick-start-guide/)| n/a | [Link](https://rancher.com/docs/rancher/v2.x/en/quick-start-guide/)|
|:blue_book: Document|[Link](https://rancher.com/docs/os/v1.x/en/)| [Link](https://github.com/rancher/k3s/blob/master/README.md)| [Link](https://rancher.com/docs/rancher/v2.x/en/)|
|:octocat: Github|[Link](https://github.com/rancher/os)| [Link](https://github.com/rancher/k3s)| [Link](https://github.com/rancher/rancher)|

:jp: [RancherLabs 公式日本語サイト](https://www.rancher.co.jp/)
:jp: [RancherJP](https://rancherjp.connpass.com/)
:jp: [RancherOS日本語訳](http://fromalto.sakura.ne.jp/rancher/docs/os/v1.x/ja/) - 「[くまかみ工房](http://fromalto.sakura.ne.jp/kkk/)」さんがドキュメントを翻訳/公開してくれていました。ありがとうございます！