k3supを使ってk3sをインストールする

毎度、ググっても出てこない小ネタを取り扱っております。 
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

k3sのインストールって微妙に辛いので、k3supというツールに頼ってみた。
k3sについての説明は致しません。

k3sについては下記サイトをご参照ください。
K3s: Lightweight Kubernetes
https://k3s.io/

K3S日本語マニュアルが無料で配布されています。
日本語版k3s マニュアルダウンロード | 株式会社スタイルズ
https://www.stylez.co.jp/rancher-k3s-pdf/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/e223a7b4-ff9f-43a4-e2d4-be142e2ed712.png)

# 1. k3supって何？

k3sのセットアップツールです。
k3sをインストールする対象のサーバーへSSHできる環境であれば、k3supというコマンドでセットアップしてくれます。k3sインストールに特化したコマンドです。


https://k3sup.dev/

読み方は「ケチャップ」だそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/2233ed0b-a42e-e9b7-12ae-dc83cb9a5cf3.png)

# 2. k3supのインストール

k3supをインストールするには、以下のコマンドでインストールは完了です。
このコマンドは、k3sとは関係ない外部サーバーに入れて問題ありません。
(WindowsのCLI版もあります)

```bash
curl -sLS https://get.k3sup.dev | sh
sudo install k3sup /usr/local/bin/

k3sup --help
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/60991028-507b-82d4-60bc-cf82361c0633.png)


本記述の対象バージョン:

```file:bash
$ k3sup version
Version: 0.11.0
Git Commit: fd9dfeaa6cd32f0d048f33705a04c14ca4aa3550
```

## 2-1. シングルサーバーのk3sだけをさっさとインストールしたい人向け

- K3sのバージョンを指定しない場合
```
k3sup install --local --user=$USER --local-path ./kubeconfig
```

- K3sのバージョンを指定する場合
```
k3sup install --local --user=$USER --local-path ./kubeconfig --k3s-version=v1.26.6+k3s1
```

# 3. k3sup

## 3-1. k3sインストールオプション

インストールオプションは、大きく分けて2つのオプションがあります。

|インストールオプション|説明|
|----|----|
|k3sup install|k3sサーバーをインストールするオプション| 
|k3sup join|k3sエージェントをインストール(or 既存サーバーへ参加)するオプション|

### その他のオプション

|インストールオプション|説明|
|----|----|
|k3s app|YAMLやhelmチャートからのアプリインストール|

### 3-1-1. k3sサーバーインストールオプション

```
k3sup install <オプション>
```

|インストールオプション|説明|
|----|----|
| --cluster                |dqliteでクラスターを形成する場合に利用する|
| --context string         |kubeconfigファイルのコンテクスト名を指定 (デフォルト:"default")|
| --datastore string       |オプション: HA構成でk3sデータベースへ接続する接続文字列。例： "mysql://username:password@tcp(hostname:3306)/database-name"|
| --ip ip                  |インストールするノードのIPアドレス (デフォルト127.0.0.1)|
| --ipsec                  |flannel-backendのバックエンドオプションがipsecの時に追加の引数を強制したり有効化する|
| --k3s-channel string     |リリースチャンネル指定オプション: stable, latest, その他の例 v1.18 (デフォルト"v1.18")|
| --k3s-extra-args string  |k3sインストーラーに渡すクオートしたオプション引数 (例: --k3s-extra-args '--no-deploy ervicelb')|
| --k3s-version string     |オプション: インストールバージョンを指定(k3s-channelが上書きされる)|
| --local                  |SSHを使わずにローカルへインストールする|
| --local-path string      |kubeconfigファイルをローカルへ保存するファイルパス (デフォルト "kubeconfig")|
| --merge                  |kubeconfigがあった場合に既存のkubeconfigにマージする kubeconfigが他のディレクトリにすでに存在する場合は、--local-pathフラグに--mergeを指定します |
| --no-extras              |"servicelb" と "traefik"を無効化|
| --print-command          |エラー発生時にSSHを使って手動でリカバリーするためにコマンドを出力|
| --skip-install           |k3sインストーラーをスキップ|
| --ssh-key string         |リモートログインする時に利用するSSHキー (デフォルト ~/.ssh/id_rsa")|
| --ssh-port int           |SSH接続する時のポート番号 (デフォルト 22)|
| --sudo                   |インストール時にsudoを使用する (例: rootを使って sudoを利用しない場合は、falseに設定する)(デフォルト true)|
| --tls-san string         |オプション: 指定がなければデフォルトでサーバーIP|
| --user string            |SSHログインのユーザー名(デフォルト "root")|

### 3-1-2. k3sエージェントインストールオプション

```
k3sup join <オプション>
```

|インストールオプション|説明|
|----|----|
|--ip ip                 | エージェントインストールするノードの公開IP |
|--k3s-channel string    | リリースチャンネル指定オプション: stable, latest, その他の例: v1.18 (default "v1.18")|
|--k3s-extra-args string | k3sインストーラーに渡すクオートしたオプション引数 (e.g. --k3s-extra-args '--node-taint key=value:NoExecute') |
|--k3s-version string    | オプション: インストールバージョンを指定(k3s-channelが上書きされる) |
|--print-command         | エラー発生時にSSHを使って手動でリカバリーするためにコマンドを出力 |
|--server                | エージェントとしてではなく、サーバーとしてクラスターに参加する |
|--server-ip ip          | 既存のk3sサーバーの公開アドレス |
|--server-ssh-port int   | SSH接続するサーバーへSSH接続するポート番号(デフォルトは--ssh-port) (デフォルト 22) |
|--server-user string    | サーバーへSSHログインする時のユーザー名(デフォルトは --userと同じ) (default "root") |
|--skip-install          | k3sインストーラーをスキップ |
|--ssh-key string        | リモートログインする時に利用するSSHキー (デフォルト ~/.ssh/id_rsa") |
|--ssh-port int          | SSH接続する時のポート番号 (デフォルト 22) |
|--sudo                  | インストール時にsudoを使用 (例: rootを使って sudoを利用しない場合は、falseに設定する) (デフォルト true) |
|--user string           | SSHログインのユーザー名(デフォルト "root") |

# 4. k3s事前準備

以下の事前準備を行います。

1. PostgreSQLをk3sのデータストアにするので、PostgreSQLを用意します。
1. sshの公開鍵と秘密鍵を作っておきます。
1. k3sを動かす仮想マシンをmultipassで起動します。

## 4-1. PostgreSQLをインストールしてデータベースを作成

```bash
sudo apt install postgresql

export DATABASE_NAME="k3s_database"
export K3S_DB_USER="k3s_admin"
export K3S_DB_PASSWORD="k3s_admin_foobaa"

echo 'export K3S_DB_USER="k3s_admin"'
echo 'export K3S_DB_PASSWORD="k3s_admin_foobaa"'

# Create User for DATABASE (one time)
sudo -i -u postgres psql -c "CREATE USER ${K3S_DB_USER} WITH password '${K3S_DB_PASSWORD}';"

# Create DATABSE
sudo -i -u postgres psql -c "CREATE DATABASE ${DATABASE_NAME};"
sudo -i -u postgres psql -c "GRANT ALL privileges ON DATABASE ${DATABASE_NAME} TO ${K3S_DB_USER};"
```

DB側で外部から接続を許可しておきましょう

```bash
sudo vi /etc/postgresql/12/main/postgresql.conf
```

```diff:/etc/postgresql/12/main/postgresql.conf
- #listen_addresses = 'localhost'         # what IP address(es) to listen on;
+ listen_addresses = '*'               # what IP address(es) to listen on;
```

DBへ接続してくるIPアドレスを追記しておきましょう

```bash
sudo vi /etc/postgresql/12/main/pg_hba.conf
```

```diff:/etc/postgresql/12/main/pg_hba.conf
+ host    all             all             0.0.0.0/0               md5
```

追記したら、再起動しておきます。

```
sudo systemctl restart postgresql
```

## 4-2. SSHの秘密鍵をコピー

multipassで仮想マシンを起動しますが、普通に`multipass launch`するとデフォルトのSSH鍵で認証されるように公開鍵(/home/ubunt/.ssh/authorized_keys)が仮想マシン側に入ります。SSH鍵で認証してログインします。

SSH鍵は以下にありますが、root権限でしか読み込めないので、`~/.ssh/multpass-ssh-key_id_rsa` とかにコピーしておきます

```
sudo cp /var/snap/multipass/common/data/multipass/ssh-keys/id_rsa ~/.ssh/multipass-ssh-key_id_rsa
```

## 4-3. multipassで仮想マシンを用意する

```bash
multipass launch 18.04 --name "k3s-main" -c 2 -m 4g -d 20g --cloud-init ./cloud-init_k3s.yaml
multipass launch 18.04 --name "k3s-agent" -c 2 -m 4g -d 20g --cloud-init ./cloud-init_k3s.yaml
```

cloud-initファイルは、以下のようなものを用意しておきましょう

```cloud-init_k3s.yaml
#cloud-config
timezone: Asia/Tokyo
package_upgrade: true
package_reboot_if_required: true
```

仮想マシンが起動したらそれぞれのIPアドレスを書き留めておきます。

```
export IP_k3s_main=xx.xx.xx.xx
export IP_k3s_agent=yy.yy.yy.yy
```

# 5. k3sサーバーをインストールする

```
export Postgres_IP_Address=zz.zz.zz.zz
```

```bash
k3sup install \
 --ip $IP_k3s_main \
 --user ubuntu \
 --ssh-key ~/.ssh/multipass-ssh-key_id_rsa \
 --datastore="postgres://${K3S_DB_USER}:${K3S_DB_PASSWORD}@${Postgres_IP_Address}:5432/${DATABASE_NAME}"
```

# 6. k3sエージェントをインストールする

```bash
k3sup join \
 --ip $IP_k3s_agent \
 --server-ip $IP_k3s-main \
 --user ubuntu \
 --ssh-key ~/.ssh/multipass-ssh-key_id_rsa \
```

# 7. K3sが起動しているか確認する

起動したらローカルにkubeconfigファイルができますので、それを使ってget nodeしてみましょう。

```
kubectl --kubeconfig=./kubeconfig get no
```

こんな風に表示されればOKです。

```
NAME       STATUS   ROLES    AGE     VERSION
k3-main    Ready    master   22m     v1.19.11+k3s1
k3-agent   Ready    <none>   3m49s   v1.19.11+k3s1
```

# 8. まとめ

multipassとk3sを組み合わせると簡単にKubernetesを構築することができる便利な時代になりました。

必要に応じて[remote.it](https://remote.it/jp/)をインストールすれば外部からのアクセスも簡単にできるようになります。

multipassとremote.it(remot3.it)で仮想マシンのネットワークを快適にする - Qiita
https://qiita.com/ynott/items/649e653ed2aeadf812ae

k3dはもっと楽になっているので開発者にはこちらの方がお勧めです。

# 9. 参考

https://qiita.com/high-u/items/5bdad1a1793c1895ae13

https://qiita.com/aqarium/items/ae1572a389a023f4c86f