Rancher on k3os

# はじめに
先日、Rancher Labs より [k3os](https://github.com/rancher/k3os) がリリースされました。
軽い上に、OS に既に k3s (k8s の軽量版) がインストールされているということでコンテナのお試しにも使えるかと思います。
折角なので簡単な導入と、Rancher の構築までを試したので残しておきます。
トラブルシュートしながらやったので、ある程度はつまずかずに進めるはず・・・です。

# サーバ構成
今回は クラウドを使わずにローカルの環境で構築します。
k3os はリソース制限が緩いのでサクサク動くかと思います。

* ホストOS：Windows 7 Pro SP1
* VirtualBox：5.2.30
* ksos：v0.2.0

# k3os 構築
あらかじめ [k3os](https://github.com/rancher/k3os) のサイトより ISO をダウンロードしておきましょう。
※約400MBです。

↓ 今回使う ISO ファイル
https://github.com/rancher/k3os/releases/tag/v0.2.0
↓リリース一覧
https://github.com/rancher/k3os/releases

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/e07a0ca0-23e6-13fd-e9f9-7db775aa1f9b.jpeg)

## vm 構築
VirutualBox に VM を構築します。
今回の VM の構成は以下の通りです。

* 名前：任意
* タイプ：Linux
* バージョン：Other Linux (64-bit)
* メモリーサイズ：2048 MB
* ハードディスク
  * サイズ：8.00GB
  * タイプ：VDI
  * その他：可変サイズ

新規作成した VM に以下の設定を追加します。

* ストレージ
  * 空の光学ドライブにダウンロードした k3os の ISO ファイルを指定
* ネットワーク
  * アダプター 1
     * 割り当て：ブリッジアダプター

## k3os 起動
それでは早速起動してみましょう

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1c17ee1d-0bc8-ca29-394a-5f663fd0e15c.jpeg)

![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/11f47e30-5481-c32c-cb97-f14f301fe7d6.jpeg)

30秒もかからずに起動はするかと思います。
ログインアカウントを求められるので「rancher」を入力するとパスワードなしでログインできます。

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/963365b1-4416-e566-6904-cf2c98e8702f.jpeg)

起動直後の状態ですとまだパスワードや鍵の設定がないため、ssh でのログインができません。
ひとまずパスワードを設定して ssh できる状態にします。
※sudo がパスワード無しで実行できます

```
$ sudo passwd rancher

# 合わせて接続先 IP アドレスを確認しておきます
$ ip a show dev eth0
# または
$ ifconfig eth0
```

teraterm などの ssh クライアント（アカウント名：rancher / パスワード：設定したパスワード）でログインできることを確認してください。

```
Welcome to k3OS!

Refer to https://github.com/rancher/k3os for README and issues

By default mode of k3OS is to run a single node cluster. Use "kubectl"
to access it.  The node token in /var/lib/rancher/k3s/server/node-token
can be used to join agents to this server.


You can configure this system or install to disk using "sudo os-config"
k3os-19686 [~]$
```

## os-config
k3os の設定に os-config を使用します。
まずはディスクに k3os をコピーします。
※コピーせずに利用することもできますが、再起動の度にローカルディスクはリセットされます。

```
# sudo を付けて実行します
$ sudo os-config

Running k3OS configuration
Choose operation
1. Install to disk
2. Configure server or agent
Select Number [1]: 1 ★ ディスクへのインストール と k3sのタイプ設定が選択可能
Config system with cloud-init file? [y/N]: N ★ cloud-init の設定ファイルを指定して起動時の自動設定
Authorize GitHub users to SSH? [y/N]: N ★ GitHub 連携用に SSH の認証設定
Please enter password for [rancher]: ******* ★ パスワードを再設定
Confirm password for [rancher]: ******* ★ パスワード再入力
Configure WiFi? [y/N]: N ★ WiFiの設定
Run as server or agent?
1. server
2. agent
Select Number [1]: 1 ★ 起動時の k3s のタイプを設定
Token or cluster secret (optional): ★ agent を後ほど追加する際に必要なトークン、クラスタシークレットの設定

Configuration
-------------

device: /dev/sda

Your disk will be formatted and k3OS will be installed with the above configuration.
Continue? [y/N]: y ★ 最終確認

・・・

Installation finished. No error reported.
 * Rebooting system in 5 seconds (CTRL+C to cancel) ★ 自動で再起動します
```

自動で再起動が行われるのですが、このまま起動しても設定は反映されていません。
なぜかというと、マウントしている　ISO　ファイルで起動するためディスクに書き込んだ設定で起動しません。
コンソールから rancher アカウントでログインし、以下のコマンドで k3os を停止させましょう。

```
$ sudo poweroff
※k3os は alpine をもとに作られているため、shutdown コマンドはありません。
```

VirutalBox の設定から ISO ファイルを外しましょう。

![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/75e23537-dd48-1713-7068-59e4d7779555.jpeg)

起動すると起動画面のメニューが変ったことが確認できます。

![07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/3a486c33-8554-47d5-4b00-cd12761465f6.jpeg)

起動後、ユーザ名：rancher / 設定したパスワード で ssh ログインできることを確認してください。

kubectl のテストだけであればこれでセットアップ完了です。
kubectl 使って好きにコンテナを構築できます。
※ディスクへのファイルコピーが無くても、k3os が起動した段階で kubectl は利用可能です
※ディスクへのコピーが完了後は os-config が利用できなくなっていました
⇒インストール前は /usr/local/bin/os-config に設置されていました
※ディレクトリによってはエフェメラル(再起動でリセット)な場所もあるので、以下を参考にしてください
https://github.com/rancher/k3os#file-system-structure

# Rancher 構築

折角なので Rancher を構築してみようと思います。
弊社 [FY0323](https://qiita.com/FY0323) さんの以下の記事を参考にさせて頂きました。

[Rancher v2.2.2のHA構成をAWS上で構築する](https://qiita.com/FY0323/items/6e8eb8c1c6d5d755c0fc)

※Rancher 構築は主目的では無いので流しめで。

## helm インストール
rancher の構築は docker さえ動いていればワンライナーなのですが、k3s は containerd が動いています。
今回は helm で rancher を構築します。

```
# container-runtime 確認
$ kubectl get node -o wide
NAME         STATUS   ROLES    AGE     VERSION         INTERNAL-IP      EXTERNAL-IP   OS-IMAGE      KERNEL-VERSION      CONTAINER-RUNTIME
k3os-21654   Ready    <none>   XdXXh   v1.14.1-k3s.4   X.X.X.X          <none>        k3OS v0.2.0   4.15.0-47-generic   containerd://1.2.5+unknown

# ServiceAccount 作成
$ kubectl -n kube-system create serviceaccount tiller

# ClusterRoleBinding 作成
kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

# helm バイナリダウンロード
$ curl -O  https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21.8M  100 21.8M    0     0  31.1M      0 --:--:-- --:--:-- --:--:-- 31.1M

# 解凍して配置
$ tar zxf helm-v2.13.1-linux-amd64.tar.gz
$ sudo mv linux-amd64/helm /usr/local/bin/

# helm 実行確認
$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Error: Get http://localhost:8080/api/v1/namespaces/kube-system/pods?labelSelector=app%3Dhelm%2Cname%3Dtiller: dial tcp [::1]:8080: connect: connection refused

# 接続先ポートが異なるため Error となっている
# helm 初期化用(tiller 作成用に k3s にアクセスするため)に接続設定ファイルを作成する
$ kubectl config view > ~/.kube/config

# 初期化しようとしますが、今度は証明書でエラーとなります
$ helm init --service-account tiller
・・・
$HELM_HOME has been configured at /home/rancher/.helm.
Error: error installing: Post https://localhost:6443/apis/extensions/v1beta1/namespaces/kube-system/deployments: x509: certificate signed by unknown authority

# 接続設定ファイルから、証明書設定をコメントアウトし、TLS の設定を追加します
$ vim ~/.kube/config
・・・
- cluster:
#     certificate-authority-data: DATA+OMITTED ★コメントアウト
    insecure-skip-tls-verify: true ★追加
    server: https://localhost:6443
  name: default
・・・

# helm のインストール(今度は成功)
$ helm init --service-account tiller
$HELM_HOME has been configured at /home/rancher/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

# version 確認
$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

※helm version を早く叩きすぎると以下のエラーが出ます。少し待ってから再度コマンドをたたきましょう
Error: could not find a ready tiller pod
```

※helm デフォルトで利用するポート(6443)と k3s(8080) で使うポートが異なりました
※証明書、TLS の設定を無効化してデプロイしています

## certmanager cnt

Rancher で利用する証明書管理用の Pod をデプロイします。

```
# レポジトリを追加
$ helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
"rancher-latest" has been added to your repositories

# レポジトリを確認
$ helm repo list
NAME            URL
stable          https://kubernetes-charts.storage.googleapis.com
local           http://127.0.0.1:8879/charts
rancher-latest  https://releases.rancher.com/server-charts/latest

# cert-manager デプロイ
$ helm install stable/cert-manager --name cert-manager --namespace kube-system --version v0.5.2
NAME:   cert-manager
LAST DEPLOYED: XXXX
NAMESPACE: kube-system
STATUS: DEPLOYED
・・・

# デプロイ確認
$ helm ls
NAME            REVISION        UPDATED     STATUS          CHART                   APP VERSION      NAMESPACE
cert-manager    1               XXXX        DEPLOYED        cert-manager-v0.5.2     v0.5.2           kube-system

$ kubectl get deploy -n kube-system
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
cert-manager    1/1     1            1           3m11s ★
coredns         1/1     1            1           21m
tiller-deploy   1/1     1            1           17m
traefik         1/1     1            1           20m
```

# Rancher GUI
最後に Rancher をデプロイして、アクセスまで確認します。
※helm でデプロイする際に hostname を指定していますが、DNS または hosts ファイルで適宜名前解決できるように準備してください。
※今回の検証ではクライアント側(Windows PC)の hosts ファイルに k3os のIPアドレスを登録してアクセス確認します。

```
# rancher のデプロイ
$ helm install rancher-latest/rancher --name rancher \
--namespace cattle-system --set hostname=www.rancher.internal
NAME:   rancher
LAST DEPLOYED: XXXX
NAMESPACE: cattle-system
STATUS: DEPLOYED
・・・
NOTES:
Rancher Server has been installed.
・・・
Browse to https://www.rancher.internal

Happy Containering!

# デプロイ確認
$ helm list
NAME            REVISION        UPDATED     STATUS          CHART                   APP VERSION      NAMESPACE
cert-manager    1               XXXX        DEPLOYED        cert-manager-v0.5.2     v0.5.2           kube-system
rancher         1               XXXX        DEPLOYED        rancher-2.2.3           v2.2.3           cattle-system

$ kubectl get all -n cattle-system
NAME                           READY   STATUS    RESTARTS   AGE
pod/rancher-857cc6984c-4ln46   1/1     Running   2          109s
pod/rancher-857cc6984c-r24x2   1/1     Running   2          109s
pod/rancher-857cc6984c-wltpm   1/1     Running   1          109s

NAME              TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/rancher   ClusterIP   10.43.30.65   <none>        80/TCP    109s

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rancher   3/3     3            3           109s

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/rancher-857cc6984c   3         3         3       109s

$ kubectl get ingress --all-namespaces
NAMESPACE       NAME      HOSTS                  ADDRESS   PORTS     AGE
cattle-system   rancher   www.rancher.internal             80, 443   14m
```

hosts に k3os の IP アドレスで ```www.rancher.internal``` を登録してから以下のアドレスにアクセスしてみましょう。
```https://www.rancher.internal```

![08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/1eec5617-f76f-c9e8-0b2a-cb79b26bbd45.jpeg)

無事表示されたでしょうか。

# まとめ

今回は k3os 導入にふれてみました。
既に k3s が入っており、またディスクサイズも少なくすむ為、手軽にコンテナを始められると思います。
また、起動も早い為、検証、開発の環境の構築もスピーディに行えると思います。

クラスタリングについても簡単に行えそうなので、次回はクラスタリングについてふれたいと思います。

# 反省会

起動はしたものの裏でエラーがいくつかはかれていたので補足を・・・
※rancher にログイン後に pod が作成されたみたいです。

```
$ kubectl get pods --all-namespaces
NAMESPACE       NAME                                    READY   STATUS             RESTARTS   AGE
cattle-system   cattle-cluster-agent-68874df6b6-v4ggm   0/1     CrashLoopBackOff   18         26m
cattle-system   cattle-node-agent-9xcpd                 0/1     CrashLoopBackOff   8          36m
```

### cattle-node-agent

名前解決が出来ないエラーがでていました。

```
$ kubectl logs -n cattle-system cattle-node-agent-9xcpd
・・・
ERROR: https://www.rancher.internal/ping is not accessible (Could not resolve host: www.rancher.internal)
```
応急処置として k3os の /etc/hosts の localhost に www.～ を登録しておくと正常に起動することを確認しました。
ただ、/etc/hosts は再起動するとリセットされる対象なので一時しのぎ程度と思ってください。

### cattle-cluster-agent

こちらも名前解決でエラーですが・・・

```
・・・
INFO: Using resolv.conf: search cattle-system.svc.cluster.local svc.cluster.local cluster.local nameserver 10.43.0.10 options ndots:5
ERROR: https://www.rancher.internal/ping is not accessible (Could not resolve host: www.rancher.internal)
```
こちらは DNS 設定が異なるようで解決できませんでした。
時間ができたら・・・