メインコンテンツまでスキップ

K3S クラスター構築

· 約5分

最近 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 を使用します。

前提条件

  1. まずファイアウォールを無効化し、パッケージソースを更新します:
apt-get update
  1. cgroupfs-mount をインストールし、マシンを再起動します:
apt-get install cgroupfs-mount
  1. K3s のデプロイ用ソフトウェアをダウンロードします。k3s のリソースは GitHub 上にあり、中国国内のサーバーからはダウンロードが非常に遅いため、先に GitHub から k3s のインストール用バイナリをダウンロードしてサーバーに配置しておくと、ダウンロードの待ち時間を省けます。

  2. 環境に問題がないか確認します:

k3s help # 基本コマンドを確認
k3s check-config # 環境が実行条件を満たしているか検査

すべてのサーバーで上記 1〜4 の手順を繰り返す必要があります。面倒であれば、1 台のサーバーでこれらの手順を済ませてからシステムディスクのイメージを複製し、以降のクラウドサーバー作成時にそのイメージを選択すれば OK です。

クラスターのデプロイ

  1. 環境チェックに問題がなければ、k3sup を使って最初のコントロールプレーン master ノードを初期化します:
# --cluster は組み込み etcd のクラスターモードで起動することを意味する
k3sup install --ip #{your_service_ip} --user root --cluster --k3s-version v1.23.4+k3s1 --print-command
  1. 残りの 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
  1. 残りの worker ノードをクラスターに参加させます:
k3sup join --user root --server-ip $SERVER1 --ip $AGENT1 --print-command
  1. ノードのステータスを確認します:
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