AWS上にk3sクラスタ(embedded etcd利用)を構築する（その２：サービス化）

[前回](https://qiita.com/yasuyuki_terashi/items/883e644f3284e0fc5247)はAWS上にk3sクラスタをコマンドラインで実行する形で構築しました。今回は、サービスとして登録するようにしたいと思います。インストールのコマンド(長くなりがち)さえしっかりしていれば、いちいち手動でバイナリのダウンロードをしなくてもよくなるので、結果的に前回より楽だったかもしれません。落ち着いてコマンドを組み立てたらLinux初心者の僕でも怖くない、、、

# １．準備
[前回](https://qiita.com/yasuyuki_terashi/items/883e644f3284e0fc5247)記事と同様です。
## 用意したインスタンス
**サーバー用×3**
名前：k3s-a,k3s-b,k3s-c
インスタンスタイプ：t3.large
ストレージ：20G
AMI：Debian 11を指定

**エージェント用×1**
名前：k3s-d
インスタンスタイプ：t2.micro
ストレージ：20G
AMI：Debian 11を指定
## 留意事項など
embedded etcdを利用する関係上、サーバノードは奇数必要でお勧めは3台、と書いてあったので3台用意しました。
* 各インスタンスは、同じサブネットに所属するように設定しておきました。
* セキュリティグループも各インスタンス同じものを設定しておきます。このセキュリティグループは、同じセキュリティグループに所属するインスタンスからは無制限にアクセスできるようにしておく必要があります(これを忘れると嵌る)

# ２．インストール
## サーバ1台目
k3s-aにログインします。
~~~powershell:powershell
PS ssh -i "keyA.pem" admin@ec2-13-208-241-109.ap-northeast-3.compute.amazonaws.com
~~~
※接続先は要確認。

インストールを行います。`K3S_TOKE`は今回SECRETとしました。1台目に関しては`--cluster-init`を指定するのがembedded etcdを利用する上で重要。
~~~bash:bash(k3s-a)
curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server --cluster-init
~~~
インストール自体はそんなに時間がかからないので、終わったらサービスが動いているか確認してみます。動作していたらrunnningとなっているはずです。
~~~
$ systemctl status k3s
● k3s.service - Lightweight Kubernetes
     Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-07-03 23:57:02 UTC; 1h 47min ago
       Docs: https://k3s.io
(以下略)
~~~
※上記画面から抜け出るには`q`キーを押す。
起動した後、トークン情報を確認します。このトークン情報は、残りのサーバ、エージェントを動かす際に必要です。
~~~
$cat /var/lib/rancher/k3s/server/node-token
K106264b9ee480c62f29a39450bd143aaa2ad07a37373e45b65f833003144a55d9f::server:SECRET
~~~
## サーバ2台目、3台目
k3s-bにログインし、以下のようにインストールを行います。トークンは先ほど取得したものを指定します。`server`の後ろに`--server`オプションを指定し、そこに`https://<1台目のアドレス>:6443`を指定します。
~~~bash:bash(k3s-b)
$ curl -sfL https://get.k3s.io | K3S_TOKEN=K106264b9ee480c62f29a39450bd143aaa2ad07a37373e45b65f833003144a55d9f::server:SECRET sh -s - server --server https://172.31.42.76:6443
~~~
インストールが終わったら、また`systemctl status k3s`でサービスとして動いているか確認を取っておきます。
三台目は二台目と全く同じです。

## エージェント
エージェント用インスタンスk3s-dにログインし、以下のようにインストールを行います。トークンは先ほど取得したものを指定します。`agent`の後ろに`--server`オプションを指定し、そこに`https://<1台目のアドレス>:6443`を指定します。
~~~bash:bash(k3s-d)
curl -sfL https://get.k3s.io | K3S_TOKEN=K106264b9ee480c62f29a39450bd143aaa2ad07a37373e45b65f833003144a55d9f::server:SECRET sh -s - agent --server https://172.31.42.76:6443
~~~
インストールが終わったら、サービスが動いているか確認します（サービス名はk3sではなくk3s-agent）。
~~~
$ systemctl status k3s-agent
● k3s-agent.service - Lightweight Kubernetes
     Loaded: loaded (/etc/systemd/system/k3s-agent.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-07-04 01:20:08 UTC; 39min ago
(略)
~~~
## 最終確認
エージェント用インスタンスからexitし、いずれかのサーバインスタンスにログインします。その上で、クラスタができているかを確認します。下記のように4台分見えていたらOKです。
~~~bash
$ sudo k3s kubectl get nodes
NAME               STATUS   ROLES                       AGE    VERSION
ip-172-31-37-118   Ready    <none>                      54m    v1.23.8+k3s1
ip-172-31-42-76    Ready    control-plane,etcd,master   126m   v1.23.8+k3s1
ip-172-31-46-204   Ready    control-plane,etcd,master   64m    v1.23.8+k3s1
ip-172-31-47-52    Ready    control-plane,etcd,master   68m    v1.23.8+k3s1
~~~

# ３．おわりに
embedded etcdを利用したクラスタを構築することができました。今回はAWS上に作りましたが、実機を用意してもそれほど手順は変わらないと思います。今後は、Node-REDをk3s上で動作させてみたいと思います。また、耐障害性がどれほどのものかを試してみたいです。いずれかのインスタンスが停まった場合にクラスタとして動作し続けるのか、試してみたいと思います。