K3S クラスター構築
最近 K8S クラスターのデプロイを学び、その過程で多くのデプロイ方法を使ってみました。例えば公式が提供する kubeadm ツール、QingCloud の KK ツールによるワンクリックデプロイ、さらに GitHub 上のオープンソースの無料・有料ワンクリックデプロイツールなど、いずれも試しましたが、最終的にクラスターのデプロイには K3S-up を選びました。
なぜ K3S を選んだのか
K8S と比べて、K3S はシステムコンテナの数が少なく軽量で、デフォルトでコンテナランタイムに containerd を採用しています。内部の ingress には Go 言語で開発された traefik を使用し、Etcd の代わりに SQLite を統合しています。ただし、複数の master ノードを持つシナリオでは、データの一貫性を保証して HA を実現するために、Etcd コンポーネントを使うのがベストです。
環境設計
今回の構築では Alibaba Cloud の共有型サーバー 6 台を使い、HA-etcd 高可用 k3s クラスターを構築します:
- master 3 台(2 コア 4GB)
- worker 3 台(2 コア 4GB)
OS は Debian 10.10 を使用します。
前提条件
- まずファイアウォールを無効化し、パッケージソースを更新します:
apt-get update
- cgroupfs-mount をインストールし、マシンを再起動します:
apt-get install cgroupfs-mount
-
K3s のデプロイ用ソフトウェアをダウンロードします。k3s のリソースは GitHub 上にあり、中国国内のサーバーからはダウンロードが非常に遅いため、先に GitHub から k3s のインストール用バイナリをダウンロードしてサーバーに配置しておくと、ダウンロードの待ち時間を省けます。
-
環境に問題がないか確認します:
k3s help # 基本コマンドを確認
k3s check-config # 環境が実行条件を満たしているか検査
すべてのサーバーで上記 1〜4 の手順を繰り返す必要があります。面倒であれば、1 台のサーバーでこれらの手順を済ませてからシステムディスクのイメージを複製し、以降のクラウドサーバー作成時にそのイメージを選択すれば OK です。
クラスターのデプロイ
- 環境チェックに問題がなければ、k3sup を使って最初のコントロールプレーン master ノードを初期化します:
# --cluster は組み込み etcd のクラスターモードで起動することを意味する
k3sup install --ip #{your_service_ip} --user root --cluster --k3s-version v1.23.4+k3s1 --print-command
- 残りの master ノードをクラスターに参加させます:
# --server は master としての参加を意味し、--server-ip は 1 台目の master を指す
k3sup join --ip #{next_service_ip} --user root --server-user root --server-ip #{first_service_ip} --server --k3s-version v1.23.4+k3s1 --print-command
- 残りの worker ノードをクラスターに参加させます:
k3sup join --user root --server-ip $SERVER1 --ip $AGENT1 --print-command
- ノードのステータスを確認します:
kubectl get nodes
k3sup のよく使うパラメータ
--cluster— 組み込み etcd(組み込み HA)を使って、このサーバーをクラスターモードで起動する--skip-install— すでに k3s がインストールされている場合、このコマンドで kubeconfig を取得できる--ssh-key— リモートログイン用の SSH 鍵のパスを指定する--local-path— kubeconfig の保存パスを設定する。デフォルト値は./kubeconfigで、デフォルトではこのファイルは上書きされる--merge— 上書きせずに既存ファイルへ設定をマージする。例えばデフォルトの kubectl 設定に追加する場合:--local-path ~/.kube/config --merge--context— kubeconfig のコンテキスト名を設定する。デフォルト値はdefault--ssh-port— SSH ポートを指定する。デフォルトは 22--k3s-extra-args— k3s インストーラーに渡す任意の追加引数。引用符で囲む必要がある。例:--k3s-extra-args '--no-deploy traefik'や--k3s-extra-args '--docker'。複数の引数はシングルクォート内にまとめて書く:--k3s-extra-args '--no-deploy traefik --docker'--k3s-version— k3s の特定バージョンを設定する。例:v1.21.1--k3s-channel— チャンネルで k3s のバージョンを設定する。例:stable--ipsec— k3s に--flannel-backend ipsecの使用を強制する--print-command— SSH 経由でリモートマシンに送信されるコマンドを表示する--datastore— SQL 接続文字列を k3s の--datastore-endpointに渡す。フォーマットはRancher ドキュメントの k3s が要求する形式に従って記述する必要がある
クラスターのコントロールパネル
k3s は kuboard と組み合わせて使えます。kuboard コントロールパネルのドキュメント:Kuboard介绍 | Kuboard
まとめ
これで k3s クラスターが手に入り、ビジネス規模を水平方向にスケールできるようになりました。一連の流れは k3sup が SSH 経由でリモートで完結してくれるため、kubeadm を手作業で実行するよりずっと手間が省け、中国国内のネットワーク環境で何度も再構築するのにも向いています。K3S 自体が軽量で、組み込み etcd と組み合わせれば master の高可用性を実現できるので、小規模クラスターには良い選択肢です。今後はさらに各種モニタリングや service mesh 一式を統合していく予定です。
COMMENTS