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


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

0. はじめに

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

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

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

1. k3supって何?

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

読み方は「ケチャップ」だそうです。

2. k3supのインストール

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

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

k3sup --help

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

bash
$ k3sup version
Version: 0.11.0
Git Commit: fd9dfeaa6cd32f0d048f33705a04c14ca4aa3550

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を用意します。
  2. sshの公開鍵と秘密鍵を作っておきます。
  3. k3sを動かす仮想マシンをmultipassで起動します。

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

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側で外部から接続を許可しておきましょう

sudo vi /etc/postgresql/12/main/postgresql.conf
/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アドレスを追記しておきましょう

sudo vi /etc/postgresql/12/main/pg_hba.conf
/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で仮想マシンを用意する

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
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エージェントをインストールする

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をインストールすれば外部からのアクセスも簡単にできるようになります。

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

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

9. 参考