【2019年11月版】k3s + k9s = k12s?! お手軽、簡単 k8s 環境の構築！

# k3s + k9s がすごいお手軽、便利。

こちらの記事を読みまして・・・

- [k9s で k8s Surfing (kubectl には戻れない)](https://qiita.com/high-u/items/7515904d9afabbbb8b6b)

k3s での実験で日々 kubectl と格闘しておりまして、まさに**こんなの作ろうと思っていた**ところでしたｗ

k3s はとても簡単に動きますが、そのあとはやっぱり普通に k8s なんですよね。。。結局、**ターミナルと kubectl と yml の闇深い沼**なのでもうちょっと全体を見渡しながら apply したいんだけど・・・と思っておりましたところで。。。
k9s、これならだいぶ見通しがよくなります！

k3s + k9s の環境構築手順をご紹介いたします。

## 対象環境

今回、k3s を動かす対象の環境は Ubuntu 18.04 LTS でアーキテクチャは以下の通り x86_64 です。

```shell
$ uname -a
Linux xxxxx-xxxxx-xxxxx 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```

また、クライアントとなる kubectl と k9s は、手元の環境では　Ubuntu と Windows の両方で動かしてます。
kubectl は事前のインストールをお願いいたします。

- [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)

それではさっそく参りましょう～。

## 1. k3s のインストールと起動

以下のコマンドで k3s をインストール＆起動します。

```shell
$ sudo curl -sfL https://get.k3s.io | sh -
..
```
はい、以上です。

sysmtectlから状況が確認できます。

```
$ sudo systemctl status k3s.service
● k3s.service - Lightweight Kubernetes
   Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-11-14 10:53:21 JST; 1h 2min ago
     Docs: https://k3s.io
  Process: 23060 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
  Process: 23059 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
 Main PID: 23061 (k3s-server)
    Tasks: 89
   CGroup: /system.slice/k3s.service
           ├─23061 /usr/local/bin/k3s server
           ├─23092 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/cont
...
```
ログもjournald から取得できます。

```
$ sudo journalctl -u k3s.service
-- Logs begin at Tue 2019-03-12 09:49:11 JST, end at Thu 2019-11-14 11:57:47 JST. --
...
```
k3s のマスターノードは起動完了です。（動かすだけなら最速。）

## 2. kubectl用の接続情報を取得

続いて接続情報を取得します。

```shell
$ sudo cat /etc/rancher/k3s/k3s.yaml
```
ここで表示される情報をkubectlを動かすところの `~/.kube/config` ファイルに上書きしておきます。今回は元のUbuntuと、手元のWindowsの方に設定をばら撒いておきました。
この時、アクセスされるサーバーは `127.0.0.1:6443` になっておりますので、LANなどからアクセスするIPアドレスに修正しておいてください。

また、元ファイルはバックアップしておいた方がよいかもです。

## 3. エージェントの接続トークン取得

続いて、エージェントからの接続トークンは以下のコマンドで取得できます。

```shell
$ sudo cat /var/lib/rancher/k3s/server/node-token
...
```
こちらのトークンをエージェント側で指定します。

### 4. エージェント側のインストールと起動

Master と同様に以下のコマンドでインストールを行います。

```shell
$ sudo curl -sfL https://get.k3s.io | sh -
...
```
これだけでサービスの登録からサーバーの起動までやってくれますが、エージェント起動でそこまでいらないので、以下のコマンドで起動したプロセスをすべて消します。

```shell
$ sudo k3s-killall.sh
...
```

ワーッと起動中のプロセスから各種のファイルまで消し去ってくれます。
完了後、agent として k3s を起動します。

```shell
$ sudo k3s agent --server https://192.168.xx.xx:6443 --token ... &
```
この `--token` に続けて上記で取得したクライアントの接続トークンを貼り付けます。

で、これをバックグラウンドで起動させて放置でOKです！

いったん kubectl でノードの確認をしておきましょうか。

```shell
$ kubectl get no
...
```
エージェントがノードとしてちゃんと参加できているかどうか、確認をお願いします。

## 5. k9s のインストールと起動

[k9s の github サイトのリリースページ](https://github.com/derailed/k9s/releases)からバイナリをダウンロードしておきます。
Linux の x86_64 版を curl でダウンロードする場合は以下のようになるでしょうか。

```
$ curl -L https://github.com/derailed/k9s/releases/download/0.9.3/k9s_0.9.3_Linux_x86_64.tar.gz > k9s.tar.gz
```
で、`tar vxf` などで解凍を行ってください。解凍後に`k9s`がバイナリで出てくるので、それをパスの通っている場所に置けばOKです。
Ubuntuでやる場合には以下のコマンドとなります。

```shell
$ tar xvf k9s.tar.gz
$ sudo mv k9s /usr/local/bin/
$ sudo chmod +x /usr/local/bin/k9s
```

で、`k9s` を起動すればOKです！

使い方などは[先の記事の方が詳しい](https://qiita.com/high-u/items/7515904d9afabbbb8b6b)ので、ここでは割愛させていただきます・・・(^^;;;

## 6. CPU、メモリ使用量などメトリクスの表示

k9s で画面が見栄え良くなるのはいいのですが、k3s 初期状態ではメトリクスをレポートしてくれるやつがいません。
そんなわけで、metrics-server を入れましょう。

- [https://github.com/kubernetes-sigs/metrics-server](https://github.com/kubernetes-sigs/metrics-server)

とはいっても手順は簡単です。

まず `git clone` して、

```shell
$ git clone git@github.com:kubernetes-sigs/metrics-server.git
$ cd metrics-server
```

`deploy/1.8+/metrics-server-deployment.yaml` で指定している metrics-server の起動コマンドに、以下のように引数を追加します。

```yaml:deploy/1.8+/metrics-server-deployment.yaml
...
     - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.6
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-insecure-tls
          - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
        ports:
        - name: main-port
          containerPort: 4443
...
```

`--kubelet-insecure-tls` と `--kubelet-preferred-address-types` を追加します。

んで、これを apply すればOKです。

```shell
$ kubectl apply -f deploy/1.8+/
```

しばらくすれば k9s に CPU や MEM の情報が出ると思います。MEMの単位は多分 MiB でしょうかね？
個人的には k9s で `:no` とするとノードリストが取れますが、ここで残りのメモリなどがチェックできるのでギリギリまで攻められるので嬉しいです。

追記：
- https://rancher.com/docs/k3s/latest/en/configuration/#metrics-server

こちらの案内によると v1.0.0 以降はmetrics-server 標準で付いてくるらしいです！
まだ v1.0.0-rc2 なので`https://get.k3s.io`のコマンドではインストールしてくれないですが・・・

## 7. k3s のアンインストール

マスターとエージェントで停止の手順が違うようですね。。。

### 7-1. Agent の停止

1. ps コマンドで `k3s-agent` のプロセスを見つける
2. kill !!
3. k3s-killall.sh
4. k3s-killall.sh で消し残しがないか確認

k3s-killallはサービスの停止→ゴミ削除のみで`k3s-agent`のプロセスは落としてくれないようですね。

~~k3s.serviceの設定でagentモードで起動できるようにした方がよいのかもしれないです。…が、`/etc/systemd/system/k3s.service`にトークン直打ちも嫌だし、`/etc/systemd/system/k3s.service.env`に定義して`/etc/systemd/system/k3s.service`から参照する、なんて手間なら `k3s-agent` を kill した方が速いよなぁ。。。~~

## 7-2. Master の停止

`k3s-killall.sh` だけでOKですが、`k3s-killall.sh` を何回か実行して、削除漏れがないか確認した方がよいです。

## 7-3. アンインストール

プロセス停止後は、マスターもエージェントもどちらも以下のコマンドですべて削除できます。

```shell
$ sudo k3s-uninstall.sh
```

ボリューム用に作られたファイルなども削除してくれるのでこれはありがたいです。(というか手作業じゃ無理でしょ・・・)

## まとめ

とりあえず立ち上げるのは簡単な k3s ですが最初から traefik が動いてたりして、なかなか初学者にはハードルが超高いです。traefik-ingress で 80と443と8080は(起動した直後で)使用済みですからね！

で、別のサービスで間違って 6443 を指定して、k3s 即死、なんてこともさっきやりました。
ちなみに Traefik のダッシュボードは 8080 を転送させても見れませんでした。。。泣

それでは良い k12s ライフを！