高可用性外部データベース

このセクションでは、外部データベースを使用した高可用性K3sクラスターのインストール方法について説明します。

大規模なHAクラスターを迅速にデプロイするには、関連プロジェクトを参照してください。

単一サーバークラスターはさまざまなユースケースに対応できますが、Kubernetesコントロールプレーンの稼働時間が重要な環境では、K3sをHA構成で実行できます。HA K3sクラスターは以下で構成されます:

  • Kubernetes APIを提供し、他のコントロールプレーンサービスを実行するサーバーノードが2つ以上

  • (単一サーバーセットアップで使用される埋め込みSQLiteデータストアとは対照的に)外部データストア

  • オプション:アプリケーションやサービスを実行するために指定されたエージェントノードが0個以上

  • オプション:エージェントノードがクラスターに登録するための固定登録アドレス

これらのコンポーネントがどのように連携するかの詳細については、アーキテクチャセクションを参照してください。

インストール概要

HAクラスターのセットアップには以下の手順が必要です:

1. 外部データストアの作成

まず、クラスター用の外部データストアを作成する必要があります。詳細については、クラスターのデータストアオプションのドキュメントを参照してください。

2. サーバーノードの起動

K3sのHA構成には2つ以上のサーバーノードが必要です。最小マシン要件については、要件ガイドを参照してください。

これらのノードでk3s serverコマンドを実行する際、K3sが外部データストアに接続する方法を知るためにdatastore-endpointパラメータを設定する必要があります。ノードを追加する際に決定的なトークンを設定するためにtokenパラメータも使用できます。空の場合、このトークンは自動的に生成され、後で使用されます。

例えば、以下のようなコマンドを使用して、MySQLデータベースを外部データストアとしてK3sサーバーをインストールし、トークンを設定できます:

curl -sfL https://get.k3s.io | sh -s - server \
  --token=SECRET \
  --datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"
  --tls-san=<FIXED_IP> # オプション、固定登録アドレスを使用する場合に必要

データストアエンドポイントの形式はデータベースの種類によって異なります。詳細については、データストアエンドポイントの形式のセクションを参照してください。

サーバーノードを起動する際のTLS証明書の設定については、データストア設定ガイドを参照してください。

単一サーバーインストールで利用可能なインストールオプションは、高可用性インストールでも利用可能です。詳細については、設定オプションのドキュメントを参照してください。

デフォルトでは、サーバーノードはスケジュール可能であり、ワークロードが起動される可能性があります。ユーザーワークロードが実行されない専用のコントロールプレーンを持ちたい場合は、テイントを使用できます。node-taintパラメータを使用してノードにテイントを設定できます。例えば、--node-taint CriticalAddonsOnly=true:NoExecuteのように設定します。

すべてのサーバーノードでk3s serverプロセスを起動したら、k3s kubectl get nodesを使用してクラスターが正常に起動していることを確認してください。サーバーノードがReady状態で表示されるはずです。

3. オプション:追加のサーバーノードの参加

ステップ2の同じコマンドを使用して追加のサーバーノードを参加させることができます。この場合、最初のノードのトークンを使用する必要があります。

最初のサーバーノードが--token CLIフラグまたはK3S_TOKEN変数なしで起動された場合、クラスターに既に参加している任意のサーバーからトークン値を取得できます:

cat /var/lib/rancher/k3s/server/token

追加のサーバーノードはトークンを使用して追加できます:

curl -sfL https://get.k3s.io | sh -s - server \
  --token=SECRET \
  --datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"

すべてのサーバーノードで同じでなければならないいくつかの設定フラグがあります:

  • ネットワーク関連のフラグ:--cluster-dns--cluster-domain--cluster-cidr--service-cidr

  • 特定のコンポーネントのデプロイを制御するフラグ:--disable-helm-controller--disable-kube-proxy--disable-network-policyおよび--disableに渡される任意のコンポーネント

  • 機能関連のフラグ:--secrets-encryption

このトークンのコピーを保持しておくことを確認してください。バックアップからの復元やノードの追加時に必要です。以前は、外部SQLデータストアを使用する際にトークンの使用が強制されていませんでした。

4. オプション:固定登録アドレスの設定

エージェントノードは登録するためのURLが必要です。これは任意のサーバーノードのIPまたはホスト名で構いませんが、多くの場合、それらは時間とともに変わる可能性があります。例えば、スケーリンググループをサポートするクラウドでクラスターを実行している場合、ノードは時間とともに作成および破棄され、最初のサーバーノードセットから異なるIPに変更される可能性があります。時間とともに変わらない安定したエンドポイントをサーバーノードの前に設定するのが最善です。このエンドポイントは、以下のような方法で設定できます:

  • レイヤー4(TCP)ロードバランサー

  • ラウンドロビンDNS

  • 仮想またはエラスティックIPアドレス

例としての設定については、クラスターのロードバランサーを参照してください。

このエンドポイントはKubernetes APIにアクセスするためにも使用できます。例えば、https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/[kubeconfig]ファイルを特定のノードではなくこのエンドポイントを指すように変更できます。

このような構成で証明書エラーを回避するために、サーバーを--tls-san YOUR_IP_OR_HOSTNAME_HEREオプションで設定する必要があります。このオプションはTLS証明書のSubject Alternative Nameに追加のホスト名またはIPを追加し、IPとホスト名の両方でアクセスしたい場合は複数回指定できます。

5. オプション:エージェントノードの参加

K3sサーバーノードはデフォルトでスケジュール可能であるため、HA K3sクラスターにはエージェントノードは必須ではありません。ただし、アプリケーションやサービスを実行するための専用のエージェントノードを持ちたい場合があります。

HAクラスターにエージェントノードを参加させる方法は、単一サーバークラスターにエージェントノードを参加させる方法と同じです。エージェントが登録するURL(サーバーIPのいずれかまたは固定登録アドレス)と使用するトークンを指定するだけです。

K3S_TOKEN=SECRET k3s agent --server https://server-or-fixed-registration-address:6443