高可用性

このセクションでは、高可用性(HA)RKE2クラスターのインストール方法について説明します。HA RKE2クラスターは次のように構成されます:

  • クラスターに他のノードが登録できるように、サーバーノードの前に配置される*固定登録アドレス*。

  • etcd、Kubernetes API、およびその他のコントロールプレーンサービスを実行する*サーバーノード*の奇数個(推奨は3個)。

  • アプリやサービスを実行するために指定されたゼロまたはそれ以上の*エージェントノード*。

なぜ奇数のサーバーノードが必要なのか?

etcdが過半数を維持するために、etcdクラスターは奇数のサーバーノードで構成されなければなりません。n台のサーバーを持つクラスターの場合、過半数は(n/2)+1です。奇数サイズのクラスターにノードを追加すると、常に過半数に必要なノードの数が増加します。奇数サイズのクラスターにノードを追加することは、マシンが多くなるため良いように見えますが、耐障害性は悪化します。同じ数のノードが故障しても過半数を失うことはありませんが、故障する可能性のあるノードが増えます。

rke2 production setup

エージェントは固定登録アドレスを通じて登録します。ただし、RKE2がkubeletを起動し、Kubernetes api-serverに接続する必要がある場合、`rke2 agent`プロセスを通じて行います。これはクライアント側のロードバランサーとして機能します。

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

  1. 固定登録アドレスを設定する

  2. 最初のサーバーノードを起動する

  3. 追加のサーバーノードを参加させる

  4. エージェントノードに参加する

1.固定登録アドレスを設定する

最初のサーバーノード以降のサーバーノードとすべてのエージェントノードは、登録するためのURLが必要です。これは、サーバーノードのいずれかのIPまたはホスト名である可能性がありますが、ノードが作成されて破棄されるにつれて、これらは時間とともに変わることがあります。したがって、サーバーノードの前に安定したエンドポイントを持つべきです。

このエンドポイントは、例えば次のようないくつかの方法で設定できます:

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

  • Round-robin DNS

  • 仮想または弾力的IPアドレス

このエンドポイントは、Kubernetes APIにアクセスするためにも使用できます。したがって、たとえば、特定のノードではなく、これを指すように kubeconfigファイルを変更できます。

`rke2 server`プロセスは、新しいノードが登録するためにポート`9345`でリスンしていることに注意してください。Kubernetes APIは、通常通りポート`6443`で提供されます。ロードバランサーをそれに応じて構成してください。

2.最初のサーバーノードを起動する

最初のサーバーノードは、他のサーバーまたはエージェントノードがクラスターに接続する際に登録する秘密トークンを確立します。

トークンとして独自の事前共有シークレットを指定するには、起動時に`token`引数を設定してください。

事前共有シークレットを指定しない場合、RKE2はシークレットを生成し、`/var/lib/rancher/rke2/server/node-token`に配置します。

固定登録アドレスでの証明書エラーを回避するために、`tls-san`パラメータを設定してサーバーを起動する必要があります。このオプションは、サーバーのTLS証明書に追加のホスト名またはIPをサブジェクト代替名として追加し、IPとホスト名の両方でアクセスしたい場合はリストとして指定できます。

最初のサーバーのRKE2設定ファイルの例:

RKE2設定ファイルは手動で作成する必要があります。特権ユーザーとして`touch /etc/rancher/rke2/config.yaml`を実行することでそれを行うことができます。

token: my-shared-secret
tls-san:
  - my-kubernetes-domain.com
  - another-kubernetes-domain.com

2a。オプション:サーバーノードのテイントを考慮してください。

デフォルトでは、サーバーノードはスケジュール可能であり、そのためワークロードを起動できます。ユーザーのワークロードが実行されない専用のコントロールプレーンを持ちたい場合は、テイントを使用できます。`node-taint`パラメータを使用すると、テイントを持つノードを構成できます。ここに、設定ファイルにノードテイントを追加する例があります:

node-taint:
  - "CriticalAddonsOnly=true:NoExecute"

NGINX IngressおよびMetrics Serverアドオンは、すべてのノードが`CriticalAddonsOnly`でテイントされている場合、展開されません。サーバーノードがそのようにテイントされている場合、これらのアドオンは、未テイントのエージェントノードがクラスターに追加されるまで保留のままになります。

3.追加のサーバーノードを起動する

追加のサーバーノードは最初のノードと同様に起動されますが、最初のサーバーノードに正常に接続できるように`server`および`token`パラメータを指定する必要があります。

一致する構成

サーバーノードで重要なフラグを一致させることが重要です。例えば、最初のサーバーノードでフラグ`cluster-cidr: 10.200.0.0/16`を使用する場合、他のサーバーノードで設定しないと、ノードは参加できなくなります。次のようなエラーが表示されます:failed to validate server configuration: critical configuration value mismatch. サーバーノードで同一に設定する必要があるフラグについての詳細は、サーバー構成を参照してください。

追加のサーバーノード用のRKE2設定ファイルの例:

server: https://my-kubernetes-domain.com:9345
token: my-shared-secret
tls-san:
  - my-kubernetes-domain.com
  - another-kubernetes-domain.com

前述のように、サーバーノードの合計は奇数でなければなりません。

ディスク上にetcdデータストアが見つかった場合、そのノードが初期化済みであるか、すでにクラスターに参加しているため、設定`server: <XXX>`は無視されます。

4.クラスターが機能していることを確認してください。

すべてのサーバーノードで`rke2 server`プロセスを起動したら、クラスターが正しく立ち上がったことを確認してください:

/var/lib/rancher/rke2/bin/kubectl get nodes \
  --kubeconfig /etc/rancher/rke2/rke2.yaml

サーバーノードが準備完了状態にあることが確認できるはずです。

デフォルトでは、`kubectl`コマンドはルートユーザのアクセスを必要としますが、`RKE2_KUBECONFIG_MODE`オーバーライドが提供されている場合は除きます。詳細については、クラスターアクセスページをお読みください。

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

RKE2サーバーノードはデフォルトでスケジューラブルであるため、HA RKE2サーバークラスターの最小ノード数は3つのサーバーノードと0のエージェントノードです。アプリやサービスを実行するために指定されたノードを追加するには、エージェントノードをクラスターに参加させてください。

HAクラスターにエージェントノードを参加させることは、単一サーバークラスターにエージェントノードを参加させることと同じです。エージェントが登録すべきURLと、使用すべきトークンを指定するだけで済みます。

server: https://my-kubernetes-domain.com:9345
token: my-shared-secret