k3os 高可用性（HA)インストール

# k3os 高可用性（HA)インストール

## はじめに
自宅環境にkubernetesを構築して、いろいろ検証していますが、環境を作ったり壊したりするのも段々面倒になってきました。
RancherLabsからは　OS+k3s がセットになった _k3os_(ややこしい） がリリースされていますが、高可用性（High Availability)の設定方法の情報が少なかったのでまとめておきます。
　
## 環境
今回の環境はマスターノード３台を立ち上げます。ワーカーノードの追加は説明しません。
* ノード３台（仮想環境でも、物理環境でも。今回は192.168.1.199 - 201 を割り当てます。ホスト名はnode01 - node03とします。）
* ネットワーク（DHCPサーバ。コンフィグをHTTPで取得する時に一時的にDHCPで仮のIPを取得します。）
* HTTPサーバ（IPが届けば、オンプレ、クラウド問いません。　今回は 192.168.1.80 ポート　８０８１にhttpで接続）

---

## 作業の流れ
1. k3osのISOファイル入手
1. コンフィグファイルの作成
1. node01ブート＆インストール
1. noer02,node03ブート＆インストール
1. 確認

### 1. k3osの入手
ISOファイルを入手する

* https://github.com/rancher/k3os
執筆時点での最新は、v0.22.2-k3s2r0
https://github.com/rancher/k3os/releases/download/v0.22.2-k3s2r0/k3os-amd64.iso


### 2. コンフィグファイルの作成

マスターノード内のリーダーをnode01とする。残りのノードはリーダーに接続して情報を同期する動きになる。
node01のコンフィグ: k3os.k3s_args の引数に --cluster-initを設定する。k3os.token はクラスタ内で共通とする。
このファイルをWebサーバに設置する。　URLはhttp://192.168.1.80:8081/k3os/node01/user-data
```yaml
hostname: node01
ssh_authorized_keys:
  - ssh-rsa #SSH公開鍵
boot_cmd:
  - "ln -sv /usr/share/zoneinfo/Asia/Tokyo /etc/localtime"
init_cmd:
run_cmd:
write_files:
- content: |
    [service_eth0]
    Type = ethernet
    IPv4 =192.168.1.199/255.255.255.0/192.168.1.254
    IPv6 = off
    Nameservers = 192.168.1.1,192.168.1.2,192.168.1.3
    Timeservers = ntp1.jst.mfeed.ad.jp,ntp2.jst.mfeed.ad.jp,ntp3.jst.mfeed.ad.jp
  owner: root:root
  path: /var/lib/connman/eth0.config
  permissions: '0600'
k3os:
  data_sources:
  - cdrom
  environment: {}
  password: #openssl passwd -1 で出力された文字列
  k3s_args:
  - server
  - --no-deploy=traefik
  - --cluster-init
  modules:
  - kvm
  - nvme
  token: cluster01-token
```

node02,node03のコンフィグ: ホスト名、IPアドレス以外は共通。 k3os.k3s_args の引数に　　--server http://node01のIP:6443 を設定
```yaml
hostname: node02
ssh_authorized_keys:
  - ssh-rsa #SSH公開鍵
boot_cmd:
  - "ln -sv /usr/share/zoneinfo/Asia/Tokyo /etc/localtime"
init_cmd:
run_cmd:
write_files:
- content: |
    [service_eth0]
    Type = ethernet
    IPv4 =192.168.1.200/255.255.255.0/192.168.1.254
    IPv6 = off
    Nameservers = 192.168.1.1,192.168.1.2,192.168.1.3
    Timeservers = ntp1.jst.mfeed.ad.jp,ntp2.jst.mfeed.ad.jp,ntp3.jst.mfeed.ad.jp
  owner: root:root
  path: /var/lib/connman/eth0.config
  permissions: '0600'
k3os:
  data_sources:
  - cdrom
  environment: {}
  password: #openssl passwd -1 で出力された文字列
  k3s_args:
  - server
  - --server
  - https://192.168.1.199:6443
  modules:
  - kvm
  - nvme
  token: cluster01-token
```

### 3. node01ブート＆インストール
仮想環境であれば、k3os-amd64.isoファイルをCD-ROMマウントし、物理環境であれば、isoファイルをCD-R、USBメモリに焼いてブートし、K3os LiveLive CD ＆ Installerを選択してブートする
![スクリーンショット 2022-10-13 11.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92527/1585aa92-d8fe-800e-eaef-3c23dc8c4959.png)

立ち上がったら、ユーザー rancher (パスワードなし）でログインする
![スクリーンショット 2022-10-13 11.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92527/3c052665-58a6-c37a-98b5-55c125898aed.png)

sudo k3os installを実行する
* 1. Install to disk を選択
* cloud-init file location(file path or http URL) に　http://192.168.1.80:8081/k3os/node01/user-data　を入力
* continue? に y を入力

![スクリーンショット 2022-10-13 11.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92527/e0e83078-dca4-80b8-7280-2281460b6643.png)

数分するとインストールを終了し、自動的にリブートする。

![スクリーンショット 2022-10-13 11.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92527/527e4e85-41c0-d36b-dff7-f4b7efeba2d7.png)

ホスト名、IPアドレスを確認する。

![スクリーンショット 2022-10-13 11.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92527/425c5d3b-05bd-bc90-5250-b663a05f414a.png)

## noer02,node03ブート＆インストール
node01と同じようにインストールする。
コンフィグファイルを指定する部分で、各ノードのコンフィグファイルのURLを指定する。

![スクリーンショット 2022-10-13 11.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92527/20305d07-ee14-27fa-e6fe-1eaf530f41c9.png)


### 確認
* kubectl で node の状態を確認
```
node01 [~]$ kubectl get nodes
NAME     STATUS   ROLES                       AGE    VERSION
node01   Ready    control-plane,etcd,master   157m   v1.22.2+k3s2
node02   Ready    control-plane,etcd,master   152m   v1.22.2+k3s2
node03   Ready    control-plane,etcd,master   146m   v1.22.2+k3s2
```



## その他
kubeconfigファイルは、各ノードの　/etc/rancher/k3s/k3s.yaml　に出力されている。

## まとめ
HA構成も簡単に構築できますね。 k3os や kubernetes のアップデートも簡単にできるようです。