2 ノード OpenShift クラスターのインストール


OpenShift Container Platform 4.21

OpenShift Container Platform を 2 つのノードにインストールする

概要

このドキュメントでは、OpenShift Container Platform を 2 つのノードにインストールする方法について説明します。

第1章 Two-Node with Arbiter

2 つのコントロールプレーンノードと 1 つのローカル arbiter ノードを備えた OpenShift Container Platform クラスターは、コンパクトでコスト効果の高い OpenShift Container Platform トポロジーです。arbiter ノードは完全な etcd データを保存し、etcd クォーラムを維持してスプリットブレインを防止します。arbiter ノードは、追加のコントロールプレーンコンポーネント kube-apiserver および kube-controller-manager は実行せず、ワークロードも実行しません。

2 つのコントロールプレーンノードと 1 つのローカル arbiter ノードが含まれるクラスターをインストールするには、arbiter ロールを少なくとも 1 つのノードに割り当て、クラスターのコントロールプレーンノード数を 2 に設定します。OpenShift Container Platform では現在 arbiter ノードの数に制限はありませんが、ハードウェアリソースの使用を最小限に抑えるために、arbiter ノードは通常のデプロイメントには 1 つだけ含めます。

インストール後に、2 つのコントロールプレーンノードと 1 つのローカル arbiter ノードを備えたクラスターに arbiter ノードを追加できますが、標準のマルチノードクラスターには追加できません。ローカルノード arbiter を持つ 2 ノード OpenShift クラスターと標準トポロジー間で変換することもできません。

以下の方法のいずれかを使用して、2 つのコントロールプレーンノードと 1 つのローカル arbiter ノードを持つクラスターをインストールできます。

注記

arbiter を備えたクラスターの場合、マシン間の接続性に関するネットワーク要件は通常のクラスターと同じです。詳細は、ネットワーク接続要件 を参照してください。

第2章 Two-node with Fencing

2.1. フェンシング機能を備えた 2 ノード OpenShift クラスターのインストール準備

重要

フェンシング機能を備えた 2 ノード OpenShift クラスターは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

フェンシング機能を備えた 2 ノード OpenShift クラスターは、ハードウェアのフットプリントを削減しながら、高可用性 (HA) を実現します。この構成は、完全な 3 ノードのコントロールプレーンクラスターをデプロイすることが現実的ではない分散環境またはエッジ環境向けに設計されています。

2 ノードクラスターにはコンピュートノードは含まれません。2 台のコントロールプレーンマシンが、クラスターの管理に加えて、ユーザーワークロードを実行します。

フェンシングは Pacemaker によって管理されます。Pacemaker は、ノードのベースボード管理コンソール (BMC) を使用して応答しないノードを隔離できます。応答しないノードがフェンスされた後、残りのノードは、リソース破損のリスクを負うことなく、クラスターの操作を安全に継続できます。

注記

フェンシング機能を備えた 2 ノード OpenShift クラスターは、user-provisioned infrastructure 方式または installer-provisioned infrastructure 方式のいずれかを使用してデプロイできます。

フェンシング機能を備えた 2 ノード OpenShift クラスターには、次のホストが必要です。

Expand
表2.1 最低限必要なホスト
ホスト説明

2 台のコントロールプレーンマシン

コントロールプレーンマシンは、コントロールプレーンを設定する Kubernetes および OpenShift Container Platform サービスを実行します。

1 台の一時的なブートストラップマシン

ブートストラップマシンは、コントロールプレーンマシンに OpenShift Container Platform クラスターをデプロイするために必要です。クラスターのインストール後にブートストラップマシンを削除できます。

ブートストラップおよびコントロールプレーンマシンでは、Red Hat Enterprise Linux CoreOS (RHCOS) をオペレーティングシステムとして使用する必要があります。RHCOS をインストールしてブートストラッププロセスを開始する手順は、RHCOS のインストールおよび OpenShift Container Platform ブートストラッププロセスの開始 を参照してください。

注記

RHCOS を使用するための要件は、user-provisioned infrastructure デプロイメントにのみ適用されます。installer-provisioned infrastructure デプロイメントの場合、ブートストラップおよびコントロールプレーンマシンがインストールプログラムによって自動的にプロビジョニングされるため、RHCOS を手動でインストールする必要はありません。

それぞれのクラスターマシンは、以下の最小要件を満たしている必要があります。

Expand
表2.2 最小リソース要件
マシンオペレーティングシステムCPU [1]RAMStorage1 秒あたりの入出力 (IOPS) [1]

ブートストラップ

RHCOS

4

16 GB

120 GB

300

コントロールプレーン

RHCOS

4

16 GB

120 GB

300

  1. 1 つの CPU は、同時マルチスレッド (SMT) またはハイパースレッディングが有効にされていない場合に 1 つの物理コアと同等です。これが有効にされている場合、(コアごとのスレッド x コア数) x ソケット数 = CPU という数式を使用して対応する比率を計算します。
  2. OpenShift Container Platform と Kubernetes は、ディスクのパフォーマンスの影響を受けるため、特にコントロールプレーンノードの etcd には、より高速なストレージが推奨されます。多くのクラウドプラットフォームでは、ストレージサイズと IOPS が連動してスケーリングされるため、十分なパフォーマンスを得るには、ストレージボリュームを過剰に割り当てる必要がある場合がある点に注意してください。

2.1.2. ユーザーによってプロビジョニングされる DNS の要件

OpenShift Container Platform のデプロイメントでは、内部通信、証明書の検証、および自動ノード検出の目的で、クラスターコンポーネントが特定の DNS 名前解決基準を満たしていることを確認する必要があります。

以下は、必要なクラスターコンポーネントのリストです。

  • Kubernetes API
  • OpenShift Container Platform のアプリケーションワイルドカード
  • ブートストラップマシンおよびコントロールプレーンマシン

Kubernetes API、ブートストラップマシン、コントロールプレーンマシンには、逆引き DNS 解決も必要です。

DNS A/AAAA または CNAME レコードは名前解決に使用され、PTR レコードは逆引き名前解決に使用されます。ホスト名が DHCP によって提供されていない場合は、Red Hat Enterprise Linux CoreOS (RHCOS) は逆引きレコードを使用してすべてのノードのホスト名を設定するため、逆引きレコードは重要です。さらに、逆引きレコードは、OpenShift Container Platform が動作するために必要な証明書署名要求 (CSR) を生成するために使用されます。

注記

各クラスターノードにホスト名を提供するために DHCP サーバーを使用することが推奨されます。詳細は、user-provisioned infrastructure に関する DHCP の推奨事項 のセクションを参照してください。

以下の DNS レコードは、user-provisioned OpenShift Container Platform クラスターに必要で、これはインストール前に設定されている必要があります。各レコードで、<cluster_name> はクラスター名で、<base_domain> は、install-config.yaml ファイルに指定するベースドメインです。完全な DNS レコードは <component>.<cluster_name>.<base_domain>. の形式を取ります。

Expand
表2.3 必要な DNS レコード
コンポーネントレコード説明

Kubernetes API

api.<cluster_name>.<base_domain>.

API ロードバランサーを特定するための DNS A/AAAA または CNAME レコード、および DNS PTR レコード。これらのレコードは、クラスター外のクライアントおよびクラスター内のすべてのノードで解決できる必要があります。

api-int.<cluster_name>.<base_domain>.

API ロードバランサーを内部的に識別するための DNS A/AAAA または CNAME レコード、および DNS PTR レコード。これらのレコードは、クラスター内のすべてのノードで解決できる必要があります。

重要

API サーバーは、Kubernetes に記録されるホスト名でワーカーノードを解決できる必要があります。API サーバーがノード名を解決できない場合、プロキシーされる API 呼び出しが失敗し、Pod からログを取得できなくなる可能性があります。

ルート

*.apps.<cluster_name>.<base_domain>.

アプリケーション Ingress ロードバランサーを参照するワイルドカード DNS A/AAAA または CNAME レコード。アプリケーション Ingress ロードバランサーは、Ingress コントローラー Pod を実行するマシンをターゲットにします。デフォルトでは、Ingress Controller Pod はコンピュートノード上で実行されます。2 ノードクラスターや 3 ノードクラスターなど、専用のコンピュートノードがないクラスタートポロジーでは、コントロールプレーンノードにもワーカーラベルが付けられるため、Ingress Pod はコントロールプレーンノードでスケジュールされます。これらのレコードは、クラスター外のクライアントおよびクラスター内のすべてのノードで解決できる必要があります。

たとえば、console-openshift-console.apps.<cluster_name>.<base_domain> は、OpenShift Container Platform コンソールへのワイルドカードルートとして使用されます。

ブートストラップマシン

bootstrap.<cluster_name>.<base_domain>.

ブートストラップマシンを識別するための DNS A / AAAA または CNAME レコード、および DNS PTR レコード。これらのレコードは、クラスター内のノードで解決できる必要があります。

コントロールプレーンマシン

<control_plane><n>.<cluster_name>.<base_domain>.

コントロールプレーンノードの各マシンを特定するための DNS A/AAAA または CNAME レコードおよび DNS PTR レコード。これらのレコードは、クラスター内のノードで解決できる必要があります。

注記

OpenShift Container Platform 4.4 以降では、DNS 設定で etcd ホストおよび SRV レコードを指定する必要はありません。

ヒント

dig コマンドを使用して、名前および逆引き名前解決を確認することができます。検証手順の詳細は、user-provisioned infrastructure の DNS 解決の検証 のセクションを参照してください。

2.1.2.1. user-provisioned クラスターの DNS 設定の例

A レコードと PTR レコードの設定例が、user-provisioned infrastructure に OpenShift Container Platform をデプロイするための DNS 要件をどのように満たしているかを理解するには、DNS 設定例を参照してください。

ここに掲載されている DNS 設定例は参考用であり、特定の DNS 解決を選択する際の助言を意図したものではありません。

これらの例では、クラスター名は ocp4 で、ベースドメインは example.com です。

注記

フェンシング機能を備えた 2 ノードクラスターでは、コントロールプレーンマシンもスケジュール可能なワーカーノードになります。したがって、DNS 設定には、その 2 つのコントロールプレーンノードのみを含める必要があります。後でコンピュートマシンを追加する場合は、標準のユーザープロビジョニングインストール方式と同様に、対応する A レコードと PTR レコードを指定してください。

BIND ゾーンファイルの以下の例は、user-provisioned クラスターの名前解決の DNS A レコードの例を示しています。

注記

この例では、同じロードバランサーが Kubernetes API およびアプリケーションの Ingress トラフィックに使用されます。実稼働のシナリオでは、API およびアプリケーション Ingress ロードバランサーを個別にデプロイし、それぞれのロードバランサーインフラストラクチャーを分離してスケーリングすることができます。

$TTL 1W
@	IN	SOA	ns1.example.com.	root (
			2019070700	; serial
			3H		; refresh (3 hours)
			30M		; retry (30 minutes)
			2W		; expiry (2 weeks)
			1W )		; minimum (1 week)
	IN	NS	ns1.example.com.
	IN	MX 10	smtp.example.com.
;
;
ns1.example.com.		IN	A	192.168.1.5
smtp.example.com.		IN	A	192.168.1.5
;
helper.example.com.		IN	A	192.168.1.5
helper.ocp4.example.com.	IN	A	192.168.1.5
;
api.ocp4.example.com.		IN	A	192.168.1.5
api-int.ocp4.example.com.	IN	A	192.168.1.5
;
*.apps.ocp4.example.com.	IN	A	192.168.1.5
;
bootstrap.ocp4.example.com.	IN	A	192.168.1.96
;
control-plane0.ocp4.example.com.	IN	A	192.168.1.97
control-plane1.ocp4.example.com.	IN	A	192.168.1.98
;
;
;EOF

各項目の説明:

api.ocp4.example.com.
Kubernetes API の名前解決を提供します。レコードは API ロードバランサーの IP アドレスを参照します。
api-int.ocp4.example.com.
Kubernetes API の名前解決を提供します。レコードは API ロードバランサーの IP アドレスを参照し、内部クラスター通信に使用されます。
*.apps.ocp4.example.com.
ワイルドカードルートの名前解決を提供します。レコードは、アプリケーション Ingress ロードバランサーの IP アドレスを参照します。アプリケーション Ingress ロードバランサーは、Ingress コントローラー Pod を実行するマシンをターゲットにします。
bootstrap.ocp4.example.com
ブートストラップマシンの名前解決を提供します。
control-plane0.ocp4.example.com
コントロールプレーンマシンの名前解決を提供します。

以下の BIND ゾーンファイルの例では、user-provisioned クラスターの逆引き名前解決の PTR レコードの例を示しています。

$TTL 1W
@	IN	SOA	ns1.example.com.	root (
			2019070700	; serial
			3H		; refresh (3 hours)
			30M		; retry (30 minutes)
			2W		; expiry (2 weeks)
			1W )		; minimum (1 week)
	IN	NS	ns1.example.com.
;
5.1.168.192.in-addr.arpa.	IN	PTR	api.ocp4.example.com.
5.1.168.192.in-addr.arpa.	IN	PTR	api-int.ocp4.example.com.
;
96.1.168.192.in-addr.arpa.	IN	PTR	bootstrap.ocp4.example.com.
;
97.1.168.192.in-addr.arpa.	IN	PTR	control-plane0.ocp4.example.com.
98.1.168.192.in-addr.arpa.	IN	PTR	control-plane1.ocp4.example.com.
;
;
;EOF

各項目の説明:

api.ocp4.example.com.
Kubernetes API の逆引き DNS 解決を提供します。PTR レコードは、API ロードバランサーのレコード名を参照します。
api-int.ocp4.example.com.
Kubernetes API の逆引き DNS 解決を提供します。PTR レコードは、API ロードバランサーのレコード名を参照し、内部クラスター通信に使用されます。
bootstrap.ocp4.example.com.
ブートストラップマシンの逆引き DNS 解決を提供します。
control-plane0.ocp4.example.com.
コントロールプレーンマシン向けに、ebootstrap.ocp4.example.com.verse DNS 解決を提供します。
注記

PTR レコードは、OpenShift Container Platform アプリケーションのワイルドカードには必要ありません。

2.1.3. インストーラーによってプロビジョニングされる DNS の要件

クライアントは、baremetal ネットワーク経由で OpenShift Container Platform クラスターのノードにアクセスします。ネットワーク管理者は、正規名の拡張がクラスター名であるサブドメインまたはサブゾーンを設定する必要があります。

<cluster_name>.<base_domain>

以下に例を示します。

test-cluster.example.com

OpenShift Container Platform には、クラスターメンバーシップ情報を使用して A/AAAA レコードを生成する機能が含まれます。これにより、ノード名が IP アドレスに解決されます。ノードが API に登録されると、クラスターは CoreDNS-mDNS を使用せずにこれらのノード情報を分散できます。これにより、マルチキャスト DNS に関連付けられたネットワークトラフィックがなくなります。

CoreDNS を正しく機能させるには、アップストリームの DNS サーバーへの TCP 接続と UDP 接続の両方が必要です。アップストリームの DNS サーバーが OpenShift Container Platform クラスターノードから TCP 接続と UDP 接続の両方を受信できることを確認します。

OpenShift Container Platform のデプロイメントでは、以下のコンポーネントに DNS 名前解決が必要です。

  • Kubernetes API
  • OpenShift Container Platform のアプリケーションワイルドカード Ingress API

A/AAAA レコードは名前解決に使用され、PTR レコードは逆引き名前解決に使用されます。Red Hat Enterprise Linux CoreOS (RHCOS) は、逆引きレコードまたは DHCP を使用して、すべてのノードのホスト名を設定します。

installer-provisioned installation には、クラスターメンバーシップ情報を使用して A/AAAA レコードを生成する機能が含まれています。これにより、ノード名が IP アドレスに解決されます。各レコードで、<cluster_name> はクラスター名で、<base_domain> は、install-config.yaml ファイルに指定するベースドメインです。完全な DNS レコードは <component>.<cluster_name>.<base_domain>. の形式を取ります。

Expand
表2.4 必要な DNS レコード
コンポーネントレコード説明

Kubernetes API

api.<cluster_name>.<base_domain>.

A/AAAA レコードと PTR レコード。API ロードバランサーを識別します。これらのレコードは、クラスター外のクライアントおよびクラスター内のすべてのノードで解決できる必要があります。

ルート

*.apps.<cluster_name>.<base_domain>.

ワイルドカード A/AAAA レコードは、アプリケーションの Ingress ロードバランサーを参照します。アプリケーション Ingress ロードバランサーは、Ingress コントローラー Pod を実行するノードをターゲットにします。Ingress Controller Pod は、デフォルトでワーカーノードで実行されます。これらのレコードは、クラスター外のクライアントおよびクラスター内のすべてのノードで解決できる必要があります。

たとえば、console-openshift-console.apps.<cluster_name>.<base_domain> は、OpenShift Container Platform コンソールへのワイルドカードルートとして使用されます。

ヒント

dig コマンドを使用して、DNS 解決を確認できます。

2.1.4. フェンシング機能を備えた 2 ノードクラスター用の Ingress ロードバランサーの設定

フェンシング機能を備えた 2 ノード OpenShift クラスターをインストールする前に、外部 Ingress ロードバランサー (LB) を設定する必要があります。Ingress LB は、コントロールプレーンノードで実行される Ingress Controller Pod に、外部アプリケーショントラフィックを転送します。どちらのノードも能動的にトラフィックを受信できます。

前提条件

  • フェンシングが有効な 2 台のコントロールプレーンノードがある。
  • ロードバランサーから両方のコントロールプレーンノードへのネットワーク接続がある。
  • api.<cluster_name>.<base_domain> および *.apps.<cluster_name>.<base_domain> の DNS レコードを作成した。
  • エンドポイントのヘルスチェックをサポートする外部ロードバランサーがある。

手順

  1. 次のポートのトラフィックを転送するようにロードバランサーを設定します。

    • 6443: Kubernetes API サーバー
    • 80 および 443: アプリケーション Ingress

      両方のコントロールプレーンノードにトラフィックを転送する必要があります。

  2. ロードバランサーのヘルスチェックを設定します。応答するノードにのみロードバランサーがトラフィックを送信するように、バックエンドのエンドポイントを監視する必要があります。
  3. 両方のコントロールプレーンノードにトラフィックを転送するようにロードバランサーを設定します。次の例は、2 台のコントロールプレーンノードを設定する方法を示しています。

    frontend api_frontend
        bind *:6443
        mode tcp
        default_backend api_backend
    
    backend api_backend
        mode tcp
        balance roundrobin
        server cp0 <cp0_ip>:6443 check
        server cp1 <cp1_ip>:6443 check
    
    frontend ingress_frontend
        bind *:80
        bind *:443
        mode tcp
        default_backend ingress_backend
    
    backend ingress_backend
        mode tcp
        balance roundrobin
        server cp0 <cp0_ip>:80 check
        server cp1 <cp1_ip>:80 check
        server cp0 <cp0_ip>:443 check
        server cp1 <cp1_ip>:443 check
  4. ロードバランサーの設定を確認します。

    1. 外部クライアントから、次のコマンドを実行します。

      $ curl -k https://api.<cluster_name>.<base_domain>:6443/version
    2. 外部クライアントから、次のコマンドを実行してアプリケーションルートにアクセスします。

      $ curl https://<app>.<cluster_name>.<base_domain>

コントロールプレーンノードを 1 台シャットダウンすることで、ロードバランサーがそのノードへのトラフィックの送信を停止する一方で、他方のノードがリクエストの処理し続けることを確認できます。

2.1.5. カスタマイズした br-ex ブリッジのマニフェストオブジェクトの作成

インストール後にクラスターのネットワーク設定を変更するには、マニフェストオブジェクトを作成する必要があります。このマニフェストにより、クラスターの外部ネットワーク接続を管理する br-ex ブリッジを設定します。

このマニフェストを作成する手順は、「カスタマイズした br-ex ブリッジのマニフェストファイルの作成」を参照してください。

2.2. フェンシング機能を備えた 2 ノード OpenShift クラスターのインストール

重要

フェンシング機能を備えた 2 ノード OpenShift クラスターは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

フェンシング機能を備えた 2 ノード OpenShift クラスターは、installer-provisioned infrastructure または user-provisioned infrastructure インストール方式のいずれかを使用してデプロイできます。次の例は、両方式の install-config.yaml 設定のサンプルを示しています。

次の install-config.yaml 設定は、installer-provisioned infrastructure 方式を使用してフェンシング機能を備えた 2 ノード OpenShift クラスターをデプロイするためのテンプレートとして使用できます。

注記

問題が発生した場合にクラスターを復元できるように、続行する前に etcd のバックアップを実行してください。

サンプル install-config.yaml 設定

apiVersion: v1
baseDomain: example.com
compute:
- name: worker
  replicas: 0
controlPlane:
  name: master
  replicas: 2
  fencing:
    credentials:
      - hostname: <control_0_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
        certificateVerification: Disabled
      - hostname: <control_1_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
        certificateVerification: Enabled
metadata:
  name: <cluster_name>
featureSet: TechPreviewNoUpgrade
platform:
  baremetal:
    apiVIPs:
      - <api_ip>
    ingressVIPs:
      - <wildcard_ip>
    hosts:
      - name: <control_0_hostname>
        role: master
        bmc:
          address: <bmc_address>
          username: <bmc_username>
          password: <bmc_password>
        bootMACAddress: <boot_mac>
      - name: <control_1_hostname>
        role: master
        bmc:
          address: <bmc_address>
          username: <bmc_username>
          password: <bmc_password>
        bootMACAddress: <boot_mac>
pullSecret: '<pull_secret>'
sshKey: '<ssh_public_key>'

  • compute.replicas: 2 ノードのフェンシングクラスターにはワーカーノードが含まれていないため、このフィールドを 0 に設定します。
  • controlPlane.replicas: 2 ノードのフェンシングデプロイメントの場合は、このフィールドを 2 に設定します。
  • fencing.credentials.hostname: 各コントロールプレーンノードのベースボード管理コンソール (BMC) の認証情報を指定します。これらの認証情報はノードのフェンシングに必要であり、スプリットブレインシナリオを防ぎます。
  • fencing.credentials.certificateVerification: Redfish URL が自己署名証明書を使用する場合、このフィールドを Disabled に設定します。自己署名証明書の使用は、内部でホストされているエンドポイントでは一般的です。有効な CA 署名証明書を使用している URL の場合は、このフィールドを Enabled に設定します。
  • metadata.name: クラスター名は、ホスト名と DNS レコードの接頭辞として使用されます。
  • featureSet: 2 ノード OpenShift クラスターのデプロイを有効にするには、このフィールドを TechPreviewNoUpgrade に設定します。
  • platform.baremetal.apiVIPs および platform.baremetal.ingressVIPs: API および Ingress エンドポイントの仮想 IP。これらの IP に、すべてのノードと外部クライアントからアクセスできることを確認してください。
  • pullSecret: クラスターコンポーネントのコンテナーイメージをプルするために必要な認証情報を含めます。
  • sshKey: インストール後にクラスターノードにアクセスするための SSH 公開鍵。

次の install-config.yaml 設定は、user-provisioned infrastructure 方式を使用してフェンシング機能を備えた 2 ノード OpenShift クラスターをデプロイするためのテンプレートとして使用できます。

注記

問題が発生した場合にクラスターを復元できるように、続行する前に etcd のバックアップを実行してください。

サンプル install-config.yaml 設定

apiVersion: v1
baseDomain: example.com
compute:
- name: worker
  replicas: 0
controlPlane:
  name: master
  replicas: 2
  fencing:
    credentials:
      - hostname: <control_0_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
      - hostname: <control_1_hostname>
        address: https://<redfish-api-url>
        username: <username>
        password: <password>
metadata:
  name: <cluster_name>
featureSet: TechPreviewNoUpgrade
platform:
  none: {}
pullSecret: '<pull_secret>'
sshKey: '<ssh_public_key>'

  • compute.replicas: 2 ノードのフェンシングクラスターにはワーカーノードが含まれていないため、このフィールドを 0 に設定します。
  • controlPlane.replicas: 2 ノードのフェンシングデプロイメントの場合は、このフィールドを 2 に設定します。
  • fencing.credentials.hostname: 各コントロールプレーンノードの BMC の認証情報を指定します。
  • metadata.name: クラスター名は、ホスト名と DNS レコードの接頭辞として使用されます。
  • featureSet: 2 ノード OpenShift クラスターのデプロイを有効にします。
  • platform.none user-provisioned infrastructure デプロイメントの場合、プラットフォームを none に設定します。ベアメタルホストは、インストールプログラムの外部で事前にプロビジョニングされます。
  • pullSecret: クラスターコンポーネントのコンテナーイメージをプルするために必要な認証情報を含めます。
  • sshKey: インストール後にクラスターノードにアクセスするための SSH 公開鍵。

2.3. インストール後のトラブルシューティングと回復

重要

フェンシング機能を備えた 2 ノード OpenShift クラスターは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

次のセクションは、フェンシング機能を備えた 2 ノード OpenShift クラスターで発生した問題からの回復に役立ちます。

2.3.1. 自動回復が利用できない場合の中断イベントからの手動回復

中断イベントによってフェンシングが正しく機能しなくなった場合は、手動で回復手順を実行する必要がある場合があります。このような場合、コントロールプレーンノードで直接コマンドを実行してクラスターを回復できます。主な回復シナリオは 4 つあり、次の順序で試行する必要があります。

  1. フェンシングシークレットの更新: ベースボード管理コンソール (BMC) の認証情報が正しくないか古くなっている場合は更新します。
  2. シングルノード障害からの回復: 1 台のコントロールプレーンノードのみがダウンした場合に機能を復元します。
  3. 完全なノード障害からの回復: 両方のコントロールプレーンノードがダウンした場合に機能を復元します。
  4. 回復できないコントロールプレーンノードの置き換え: ノードを置き換えてクラスターの機能を復元します。

前提条件

  • コントロールプレーンノードへの管理アクセス権がある。
  • SSH を使用してノードに接続できる。
注記

問題が発生した場合にクラスターを復元できるように、続行する前に etcd のバックアップを実行してください。

手順

  1. フェンシングシークレットを更新します。

    1. Cluster API が利用できない場合は、いずれかのクラスターノードで次のコマンドを実行して、フェンシングシークレットを更新します。

      $ sudo pcs stonith update <node_name>_redfish username=<user_name> password=<password>

      Cluster API が回復した後、または Cluster API がすでに使用可能な場合は、次のステップで説明するように、クラスター内のフェンシングシークレットを更新して、同期が取れた状態にします。

    2. 次のコマンドを実行して、コントロールプレーンノードの既存のフェンシングシークレットのユーザー名とパスワードを編集します。

      $ oc project openshift-etcd
      $ oc edit secret <node_name>-fencing

      フェンシングシークレットを更新した後にクラスターが回復した場合、それ以上の操作は必要ありません。問題が解決しない場合は、次のステップに進みます。

  2. シングルノード障害からの回復:

    1. 次のコマンドを実行して初期診断情報を収集します。

      $ sudo pcs status --full

      このコマンドを実行すると、現在のクラスターとリソースの状態が詳細に表示されます。出力を使用して、フェンシングまたは etcd の起動に関する問題を特定できます。

    2. 必要に応じて、次の追加の診断コマンドを実行します。

      次のコマンドを実行して、クラスター上のリソースをリセットし、Pacemaker にそれらのリソースを新規に起動するように指示します。

      $ sudo pcs resource cleanup

      次のコマンドを実行して、ノード上のすべての Pacemaker アクティビティーを確認します。

      $ sudo journalctl -u pacemaker

      次のコマンドを実行して、etcd リソースの起動の問題を診断します。

      $ sudo journalctl -u pacemaker | grep podman-etcd
    3. 次のコマンドを実行して、ノードのフェンシング設定を表示します。

      $ sudo pcs stonith config <node_name>_redfish

      フェンシングが必要であるが機能していない場合は、Redfish フェンシングエンドポイントにアクセスできることを確認し、認証情報が正しいことを確認します。

    4. フェンシングが動作しているにもかかわらず etcd が起動しない場合は、次のコマンドを実行してバックアップから etcd を復元します。

      $ sudo cp -r /var/lib/etcd-backup/* /var/lib/etcd/
      $ sudo chown -R etcd:etcd /var/lib/etcd

      回復が成功した場合、それ以上の操作は必要ありません。問題が解決しない場合は、次のステップに進みます。

  3. 完全なノード障害からの回復:

    1. 両方のコントロールプレーンノードの電源をオンにします。

      Pacemaker が自動的に起動し、両方のノードがオンラインであることを検出すると回復操作を開始します。回復が期待どおりに開始しない場合は、前のステップで説明した診断コマンドを使用して問題を調査します。

    2. 次のコマンドを実行して、クラスター上のリソースをリセットし、Pacemaker にそれらのリソースを新規に起動するように指示します。

      $ sudo pcs resource cleanup
    3. 次のコマンドを実行して、リソースの起動順序を確認します。

      $ sudo pcs status --full
    4. 次のコマンドを実行して、kubelet が失敗した場合に Pacemaker サービスジャーナルを調べます。

      $ sudo journalctl -u pacemaker
      $ sudo journalctl -u kubelet
    5. 同期していない etcd を処理します。

      一方のノードの etcd がより最新のものである場合、Pacemaker は遅れているノードをフェンスし、そのノードを learner ノードとして起動しようと試みます。このプロセスが停止した場合は、次のコマンドを実行して、Redfish フェンシングエンドポイントと認証情報を確認してください。

      $ sudo pcs stonith config

      回復が成功した場合、それ以上の操作は必要ありません。問題が解決しない場合は、次のステップで説明するように、手動で回復を実行します。

  4. いずれかのノードが回復不能な場合にイベントから手動で回復する必要がある場合は、「2 ノード OpenShift クラスターのコントロールプレーンノードの置き換え」の手順に従ってください。

    クラスターが 1 台のノードを失うと、クラスターがデグレードモードになります。この状態になると、Pacemaker が自動的にクォーラムのブロックを解除し、クラスターが残りのノードで一時的に動作できるようにします。

    両方のノードに障害が発生した場合は、Pacemaker が通常のクラスター操作を再開できるように、両方のノードを再起動してクォーラムを再確立する必要があります。

    2 つのノードのうち 1 つしか再起動できない場合は、ノードの置き換え手順に従って、残りのノードでクォーラムを手動で再確立します。

    それでも手動での回復が必要な状況で、その回復作業にも失敗した場合は、must-gather レポートと SOS レポートを収集し、バグを報告してください。

検証

コントロールプレーンノードと etcd の両方が正しく動作していることを確認する方法は、「フェンシング機能を備えた 2 ノード OpenShift クラスターでの etcd の健全性検証」を参照してください。

2 ノード OpenShift クラスター内の障害が発生したコントロールプレーンノードを置き換えることができます。置き換え用のノードでは、障害が発生したノードと同じホスト名と IP アドレスを使用する必要があります。

前提条件

  • 障害を免れ、正常に動作しているコントロールプレーンノード 1 台ある。
  • マシンが実行中でないこと、またはノードが準備完了状態でないことを確認した。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • 障害が発生したノードのホスト名と IP アドレスがわかっている。
注記

問題が発生した場合にクラスターを復元できるように、続行する前に etcd のバックアップを実行してください。

手順

  1. 次のコマンドを実行してクォーラムの状態を確認します。

    $ sudo pcs quorum status

    出力例

    Quorum information
    ------------------
    Date:             Fri Oct  3 14:15:31 2025
    Quorum provider:  corosync_votequorum
    Nodes:            2
    Node ID:          1
    Ring ID:          1.16
    Quorate:          Yes
    
    Votequorum information
    ----------------------
    Expected votes:   2
    Highest expected: 2
    Total votes:      2
    Quorum:           1
    Flags:            2Node Quorate WaitForAll
    
    Membership information
    ----------------------
        Nodeid      Votes    Qdevice Name
             1          1         NR master-0 (local)
             2          1         NR master-1

    1. クォーラムが失われた状態で、1 台のコントロールプレーンノードがまだ実行されている場合は、次のコマンドを実行して、障害を免れたノードでクォーラムを手動で復元します。

      $ sudo pcs quorum unblock
    2. 1 台のノードでのみ障害が発生した場合は、次のコマンドを実行して、障害を免れたノードで etcd が実行されていることを確認します。

      $ sudo pcs resource status etcd
    3. etcd が実行されていない場合は、次のコマンドを実行して etcd を再起動します。

      $ sudo pcs resource cleanup etcd

      それでも etcd が起動しない場合は、フェンシングをスキップして、障害を免れたノードで etcd を手動で強制的に起動します。

      重要

      このコマンドを実行する前に、置き換え対象のノードがアクセス不能であることを確認してください。そうしないと、etcd が破損する危険があります。

      $ sudo pcs resource debug-stop etcd
      $ sudo OCF_RESKEY_CRM_meta_notify_start_resource='etcd' pcs resource debug-start etcd

      回復後、etcd は障害を免れたノード上で正常に実行されている必要があります。

  2. 次のコマンドを実行して、障害が発生したノードの etcd シークレットを削除します。

    $ oc project openshift-etcd
    $ oc delete secret etcd-peer-<node_name>
    $ oc delete secret etcd-serving-<node_name>
    $ oc delete secret etcd-serving-metrics-<node_name>
    注記

    障害が発生したノードを置き換えるには、まずその etcd シークレットを削除する必要があります。etcd が稼働している間は、API サーバーがこれらのコマンドに応答するまでに時間がかかる場合があります。

  3. 障害が発生したノードのリソースを削除します。

    1. BareMetalHost (BMH) オブジェクトがある場合は、次のコマンドを実行してオブジェクトをリスト表示し、置き換え対象のホストを特定します。

      $ oc get bmh -n openshift-machine-api
    2. 次のコマンドを実行して、障害が発生したノードの BMH オブジェクトを削除します。

      $ oc delete bmh/<bmh_name> -n openshift-machine-api
    3. 次のコマンドを実行して、Machine オブジェクトをリスト表示し、置き換え対象のノードに紐付いているオブジェクトを特定します。

      $ oc get machines.machine.openshift.io -n openshift-machine-api
    4. 次のコマンドを実行して、Machine オブジェクトからマシンハッシュ値を含むラベルを取得します。

      $ oc get machines.machine.openshift.io/<machine_name> -n openshift-machine-api \
        -o jsonpath='Machine hash label: {.metadata.labels.machine\.openshift\.io/cluster-api-cluster}{"\n"}'

      <machine_name> は、クラスター内の Machine オブジェクトの名前に置き換えます。たとえば、ostest-bfs7w-ctrlplane-0 です。

      新しい Machine オブジェクトをプロビジョニングするには、このラベルが必要です。

    5. 次のコマンドを実行して、障害が発生したノードの Machine オブジェクトを削除します。

      $ oc delete machines.machine.openshift.io/<machine_name>-<failed nodename> -n openshift-machine-api
      注記

      Machine オブジェクトを削除すると、ノードオブジェクトも自動的に削除されます。

  4. 同じ名前と IP アドレスを使用して、障害が発生したホストを再作成します。

    重要

    この手順を実行する必要があるのは、元のノードを作成するために installer-provisioned infrastructure または Machine API を使用している場合だけです。障害が発生したベアメタルコントロールプレーンノードの置き換えについては、「ベアメタル上の正常でない etcd メンバーの置き換え」を参照してください。

    1. BMH オブジェクトと Machine オブジェクトを削除します。ノードオブジェクトは、マシンコントローラーによって自動的に削除されます。
    2. 次のサンプル設定を使用して新しいマシンをプロビジョニングします。

      Machine オブジェクトの設定例

      apiVersion: machine.openshift.io/v1beta1
      kind: Machine
      metadata:
        annotations:
          metal3.io/BareMetalHost: openshift-machine-api/{bmh_name}
        finalizers:
        - machine.machine.openshift.io
        labels:
          machine.openshift.io/cluster-api-cluster: {machine_hash_label}
          machine.openshift.io/cluster-api-machine-role: master
          machine.openshift.io/cluster-api-machine-type: master
        name: {machine_name}
        namespace: openshift-machine-api
      spec:
        authoritativeAPI: MachineAPI
        metadata: {}
        providerSpec:
          value:
            apiVersion: baremetal.cluster.k8s.io/v1alpha1
            customDeploy:
              method: install_coreos
            hostSelector: {}
            image:
              checksum: ""
              url: ""
            kind: BareMetalMachineProviderSpec
            metadata:
              creationTimestamp: null
            userData:
              name: master-user-data-managed

      • metadata.annotations.metal3.io/BareMetalHost: {bmh_name} は、置き換え対象のホストに関連付けられている BMH オブジェクトの名前に置き換えます。
      • labels.machine.openshift.io/cluster-api-cluster: {machine_hash_label} は、削除したマシンから取得したラベルに置き換えます。
      • metadata.name: {machine_name} は、削除したマシンの名前に置き換えます。
    3. 次のコマンドを実行して、新しい BMH オブジェクトと BMC 認証情報を保存するシークレットを作成します。

      cat <<EOF | oc apply -f -
      apiVersion: v1
      kind: Secret
      metadata:
        name: <secret_name>
        namespace: openshift-machine-api
      data:
        password: <password>
        username: <username>
      type: Opaque
      ---
      apiVersion: metal3.io/v1alpha1
      kind: BareMetalHost
      metadata:
        name: {bmh_name}
        namespace: openshift-machine-api
      spec:
        automatedCleaningMode: disabled
        bmc:
          address: <redfish_url>/{uuid}
          credentialsName: <name>
          disableCertificateVerification: true
        bootMACAddress: {boot_mac_address}
        bootMode: UEFI
        externallyProvisioned: false
        online: true
        rootDeviceHints:
          deviceName: /dev/disk/by-id/scsi-<serial_number>
        userData:
          name: master-user-data-managed
          namespace: openshift-machine-api
      EOF
      • metadata.name: シークレットの名前を指定します。
      • metadata.name: {bmh_name} は、削除した BMH オブジェクトの名前に置き換えます。
      • bmc.address: {uuid} は、作成したノードの UUID に置き換えます。
      • bmc.credentialsName: name は、作成したシークレットの名前に置き換えます。
      • bootMACAddress: プロビジョニングネットワークインターフェイスの MAC アドレスを指定します。これは、プロビジョニング中に Ironic と通信するときにノードが自身を識別するために使用する MAC アドレスです。
  5. 次のコマンドを実行して、新しいノードが Provisioned 状態になっていることを確認します。

    $ oc get bmh -o wide

    このコマンドの出力で、STATUS 列の値が Provisioned である必要があります。

    注記

    プロビジョニングプロセスが完了するまでに 10 - 20 分かかる場合があります。

  6. 次のコマンドを実行して、両方のコントロールプレーンノードが Ready 状態であることを確認します。

    $ oc get nodes

    このコマンドの出力で、両ノードの STATUS 列の値が Ready である必要があります。

  7. 次のコマンドを実行して、Machine API による管理を防ぐために、BMH オブジェクトに detached アノテーションを適用します。

    $ oc annotate bmh <bmh_name> -n openshift-machine-api baremetalhost.metal3.io/detached='' --overwrite
  8. 次のコマンドを実行して、置き換え用のノードを Pacemaker クラスターに再度参加させます。

    注記

    置き換え対象のノードではなく、障害を免れたコントロールプレーンノードで次のコマンドを実行してください。

    $ sudo pcs cluster node remove <node_name>
    $ sudo pcs cluster node add <node_name> addr=<node_ip> --start --enable
  9. 次のコマンドを実行して、障害が発生したノードの古いジョブを削除します。

    $ oc project openshift-etcd
    $ oc delete job tnf-auth-job-<node_name>
    $ oc delete job tnf-after-setup-job-<node_name>

検証

コントロールプレーンノードと etcd の両方が正しく動作していることを確認する方法は、「フェンシング機能を備えた 2 ノード OpenShift クラスターでの etcd の健全性検証」を参照してください。

2.3.5. フェンシング機能を備えた 2 ノード OpenShift クラスターでの etcd の健全性検証

ノードの回復または保守手順を完了したら、コントロールプレーンノードと etcd の両方が正しく動作していることを確認します。

前提条件

  • cluster-admin 権限を持つユーザーとしてクラスターにアクセスできる。
  • SSH 経由で少なくとも 1 台のコントロールプレーンノードにアクセスできる。

手順

  1. 次のコマンドを実行して、ノード全体のステータスを確認します。

    $ oc get nodes

    このコマンドにより、両方のコントロールプレーンノードが Ready 状態であることを確認します。この状態は、ノードがスケジューリング対象のワークロードを受け入れ可能であることを示しています。

  2. 次のコマンドを実行して、cluster-etcd-operator のステータスを確認します。

    $ oc describe co/etcd

    cluster-etcd-operator は、etcd 設定の健全性を管理および報告します。ステータスの確認は、継続中の問題やデグレード状態を特定するのに役立ちます。

  3. 次のコマンドを実行して、etcd メンバーのリストを確認します。

    $ oc rsh -n openshift-etcd <etcd_pod> etcdctl member list -w table

    このコマンドは、現在の etcd メンバーとそのロールを表示します。learner としてマークされているノードを探します。これは、そのノードが投票権を持つメンバーになるプロセス中であることを示しています。

  4. いずれかのコントロールプレーンノードで次のコマンドを実行して、Pacemaker リソースのステータスを確認します。

    $ sudo pcs status --full

    このコマンドにより、Pacemaker によって管理されるすべてのリソースの詳細な説明が提供されます。次の条件が満たされていることを確認する必要があります。

    • 両方のノードがオンラインである。
    • kubelet および etcd リソースが実行されている。
    • フェンシングが両方のノードに対して正しく設定されている。
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る