ネットワーク設定
OpenShift Container Platform における一般的なネットワーク設定プロセス
概要
第1章 チューニングプラグインを使用してシステムコントロールとインターフェイス属性を設定する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で実行時にカーネルパラメーターとインターフェイス属性を変更するには、Container Network Interface (CNI) メタプラグインのチューニングを使用できます。このプラグインはメインの CNI プラグインと連携して動作し、プロミスキャスモード、オールマルチキャストモード、MTU、MAC アドレスなどの sysctl やインターフェイス属性を変更できます。
1.1. チューニング CNI を使用してシステム制御を設定する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でインターフェイスレベルのネットワーク sysctl を設定するには、ネットワークアタッチメント定義でチューニング CNI メタプラグインを使用できます。ICMP リダイレクトパケットの受信と送信を有効にするには、net.ipv4.conf.IFNAME.accept_redirects sysctl を設定してください。
手順
次の内容を含む、
tuning-example.yamlなどのネットワークアタッチメント定義を作成します。apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <name> namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "<name>", "plugins": [{ "type": "<main_CNI_plugin>" }, { "type": "tuning", "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" } } ] }ここでは、以下のようになります。
metadata.name- 作成する追加のネットワーク割り当ての名前を指定します。名前は指定された namespace 内で一意である必要があります。
metadata.namespace- オブジェクトが関連付けられている namespace を指定します。
spec.config.cniVersion- CNI 仕様のバージョンを指定します。
spec.config.name- 設定の名前を指定します。設定名をネットワークアタッチメント定義の名前の値と一致させることを推奨します。
spec.config.plugins.type- 設定するメイン CNI プラグインの名前を指定します。
spec.config.plugins.tuning.sysctl-
設定する sysctl を指定します。インターフェイス名は
IFNAMEトークンで表され、ランタイム時にインターフェイスの実際の名前に置き換えられます。
ネットワーク接続定義の例
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: tuningnad namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "tuningnad", "plugins": [{ "type": "bridge" }, { "type": "tuning", "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" } } ] }'以下のコマンドを実行して YAML を適用します。
$ oc apply -f tuning-example.yaml出力例
networkattachmentdefinition.k8.cni.cncf.io/tuningnad created次のようなネットワークアタッチメント定義を使用して、
examplepod.yamlなどの Pod を作成します。apiVersion: v1 kind: Pod metadata: name: tunepod namespace: default annotations: k8s.v1.cni.cncf.io/networks: tuningnad spec: containers: - name: podexample image: centos command: ["/bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 runAsGroup: 3000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefaultここでは、以下のようになります。
metadata.annotations.k8s.v1.cni.cncf.io/networks-
設定された
NetworkAttachmentDefinitionの名前を指定します。 spec.containers.securityContext.runAsUser- コンテナーを実行するユーザー ID を指定します。
spec.containers.securityContext.runAsGroup- コンテナーの実行に使用するプライマリーグループ ID を指定します。
spec.containers.securityContext.allowPrivilegeEscalation-
Pod が特権昇格を許可するよう要求できるかどうかを指定します。指定しない場合、デフォルトで true に設定されます。このブール値は、
no_new_privsフラグがコンテナープロセスに設定されるかどうかを直接制御します。 spec.containers.securityContext.capabilities- 完全なルートアクセス権限を与えずに、特権的な操作を指定します。このポリシーにより、すべての機能が Pod から削除されます。
spec.securityContext.runAsNonRoot: true- UID が 0 以外のユーザーでコンテナーが実行されるように指定します。
spec.securityContext.seccompProfile- Pod またはコンテナーワークロードのデフォルトの seccomp プロファイルを指定します。
以下のコマンドを実行して yaml を適用します。
$ oc apply -f examplepod.yaml次のコマンドを実行して、Pod が作成されていることを確認します。
$ oc get pod出力例
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47s次のコマンドを実行して、Pod にログインします。
$ oc rsh tunepod設定された sysctl フラグの値を確認します。たとえば、次のコマンドを実行して、値
net.ipv4.conf.net1.accept_redirectsを見つけます。sh-4.4# sysctl net.ipv4.conf.net1.accept_redirects予想される出力
net.ipv4.conf.net1.accept_redirects = 1
1.2. チューニング CNI を使用してオールマルチキャストモードを有効にする リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のネットワークインターフェイスでオールマルチキャストモードを有効にするには、ネットワークアタッチメント定義でチューニング Container Network Interface (CNI) メタプラグインを使用できます。有効にすると、インターフェイスはネットワーク上のすべてのマルチキャストパケットを受信します。
手順
次の内容を含む、
tuning-example.yamlなどのネットワークアタッチメント定義を作成します。apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <name> namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "<name>", "plugins": [{ "type": "<main_CNI_plugin>" }, { "type": "tuning", "allmulti": true } } ] }ここでは、以下のようになります。
<name>- 作成する追加のネットワーク割り当ての名前を指定します。名前は指定された namespace 内で一意である必要があります。
default- オブジェクトが関連付けられている namespace を指定します。
0.4.0- CNI 仕様のバージョンを指定します。
< 名前 >- 設定の名前を指定します。設定の名前は、ネットワークアタッチメント定義の名前の値と一致させてください。
"<main_CNI_plugin>"- 設定するメイン CNI プラグインの名前を指定します。
" チューニング "- CNI メタプラグインの名前を指定します。
" 真実 "- インターフェイスのオールマルチキャストモードを指定します。有効にすると、ネットワーク上のすべてのマルチキャストパケットがそのインターフェイスで受信されます。
ネットワーク接続定義の例
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: setallmulti namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "setallmulti", "plugins": [ { "type": "bridge" }, { "type": "tuning", "allmulti": true } ] }'次のコマンドを実行して、YAML ファイルで指定された設定を適用します。
$ oc apply -f tuning-allmulti.yaml出力例
networkattachmentdefinition.k8s.cni.cncf.io/setallmulti created次の
examplepod.yamlサンプルファイルで指定されているものと同様のネットワークアタッチメント定義を使用して Pod を作成します。apiVersion: v1 kind: Pod metadata: name: allmultipod namespace: default annotations: k8s.v1.cni.cncf.io/networks: setallmulti spec: containers: - name: podexample image: centos command: ["/bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 runAsGroup: 3000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefaultここでは、以下のようになります。
metadata.annotations.k8s.v1.cni.cncf.io/networks-
設定された
NetworkAttachmentDefinitionの名前を指定します。 spec.containers.securityContext.runAsUser- コンテナーを実行するユーザー ID を指定します。
spec.containers.securityContext.runAsGroup- コンテナーの実行に使用するプライマリーグループ ID を指定します。
spec.containers.securityContext.allowPrivilegeEscalation-
Pod が特権昇格を許可するよう要求できるかどうかを指定します。指定しない場合、デフォルトで true に設定されます。このブール値は、
no_new_privsフラグがコンテナープロセスに設定されるかどうかを直接制御します。 spec.containers.securityContext.capabilities- 完全なルートアクセス権限を与えずに、特権的な操作を指定します。このポリシーにより、すべての機能が Pod から削除されます。
spec.containers.securityContext.runAsNonRoot: true- UID が 0 以外のユーザーでコンテナーが実行されるように指定します。
spec.containers.securityContext.seccompProfile- Pod またはコンテナーワークロードのデフォルトの seccomp プロファイルを指定します。
次のコマンドを実行して、YAML ファイルで指定された設定を適用します。
$ oc apply -f examplepod.yaml次のコマンドを実行して、Pod が作成されていることを確認します。
$ oc get pod出力例
NAME READY STATUS RESTARTS AGE allmultipod 1/1 Running 0 23s次のコマンドを実行して、Pod にログインします。
$ oc rsh allmultipod次のコマンドを実行して、Pod に関連付けられているすべてのインターフェイスをリスト表示します。
sh-4.4# ip link出力例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8901 qdisc noqueue state UP mode DEFAULT group default link/ether 0a:58:0a:83:00:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0 3: net1@if24: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether ee:9b:66:a4:ec:1d brd ff:ff:ff:ff:ff:ff link-netnsid 0ここでは、以下のようになります。
eth0@if22- プライマリーインターフェイスを指定します。
net1@if24- 全マルチキャストモード (ALLMULTI フラグ) をサポートするネットワーク接続定義で設定されたセカンダリーインターフェイスを指定します。
第2章 ノードポートサービス範囲の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でクラスターノードのポート要件を満たすには、インストール時にノードポートのサービス範囲を設定するか、インストール後に拡張することができます。新しい設定では、デフォルトの範囲である 30000-32768 を 維持したまま、その範囲を両側に拡張できます。
Red Hat は、デフォルトのポート範囲 30000 - 32768 以外でテストを実行していません。デフォルトのポート範囲外の範囲は、拡張されたノードポート範囲がクラスターに影響を与えないことを確認するためにテストを行ってください。特に、以下の点を確認してください。
- ホストプロセスですでに使用されているポートと重複しない
- ホストネットワーキングで設定済みの Pod ですでに使用されているポートと重複しない
範囲を拡張したところポート割り当ての問題が発生した場合は、新しいクラスターを作成し、必要な範囲を設定します。
ノードのポート範囲を拡張し、OpenShift Container Platform API サーバーとのポート競合のために OpenShift CLI (oc) が動作しなくなった場合は、新しいクラスターを作成する必要があります。
2.1. ノードのポート範囲の拡張 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターのインストール後にノードポート範囲を拡張するには、oc patch コマンドを使用して serviceNodePortRange パラメーターを更新します。範囲は左右どちらにも拡張できますが、インストール後に縮小することはできません。
Red Hat は、デフォルトのポート範囲 30000 - 32768 以外でテストを実行していません。デフォルトのポート範囲外の範囲は、拡張されたノードポート範囲がクラスターに影響を与えないことを確認するためにテストを行ってください。範囲を拡張したところポート割り当ての問題が発生した場合は、新しいクラスターを作成し、必要な範囲を設定します。
serviceNodePortRange パラメーターを拡張する場合は、パラメーターに設定する値がカーネルの一時ポート範囲 net.ipv4.ip_local_port_range と重複しないようにしてください。
OVN-Kubernetes は、送信 Pod トラフィックにおける送信元ネットワークアドレス変換 (SNAT) の送信元ポート選択に、この一時的な範囲を使用します。SNAT の送信元ポートがノードのポート番号と一致する場合、戻りトラフィックが誤ってルーティングされ、断続的な送信 TCP 接続タイムアウトが発生する可能性があります。
詳細は、関連情報 セクションの安全な sysctl と安全でない sysctl を参照してください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 -
クラスターインフラストラクチャーが拡張範囲内にあるポートへのアクセスを許可していることを確認している。たとえば、ノードのポート範囲を
30000-32900に拡張する場合、ファイアウォールまたはパケットフィルタリングの設定で、30000-32900のポート範囲 (両端の値を含む) を許可する必要があります。
手順
クラスターが Pod のトラフィックを管理するために使用する
network.config.openshift.ioオブジェクト内のserviceNodePortRangeパラメーターの範囲を拡張するには、次のコマンドを入力します。$ oc patch network.config.openshift.io cluster --type=merge -p \ '{ "spec": { "serviceNodePortRange": "<port_range>" } }'ここでは、以下のようになります。
<port_range>-
拡張範囲を指定します。例:
30000-32900。
ヒント次の YAML を適用してノードのポート範囲を更新することもできます。
apiVersion: config.openshift.io/v1 kind: Network metadata: name: cluster spec: serviceNodePortRange: "<port_range>" # ...出力例
network.config.openshift.io/cluster patched
検証
更新された設定がアクティブであることを確認するには、次のコマンドを入力します。更新の適用には数分かかる場合があります。
$ oc get configmaps -n openshift-kube-apiserver config \ -o jsonpath="{.data['config\.yaml']}" | \ grep -Eo '"service-node-port-range":["[[:digit:]]+-[[:digit:]]+"]'出力例
"service-node-port-range":["30000-32900"]
第3章 クラスターネットワーク範囲の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でクラスターネットワークの範囲を拡張して、より多くのノードと IP アドレスをサポートするには、クラスターのインストール後にクラスターネットワークの CIDR マスクを変更できます。この手順には OVN-Kubernetes ネットワークプラグインが必要であり、追加ノード用に IP アドレス空間をより多く確保できます。
たとえば、クラスターをデプロイし、クラスターネットワーク範囲として 10.128.0.0/19 を指定し、ホスト接頭辞 23 を指定した場合、16 ノードに制限されます。クラスターの CIDR マスクを /14 に変更することで、これを 510 ノードに拡張できます。
クラスターネットワークの IP アドレス範囲を変更する場合、次の制限が適用されます。
- 指定する CIDR マスクサイズは、現在設定されている CIDR マスクサイズより常に小さくする必要があります。これは、インストールされたクラスターにノードを追加することによってのみ IP スペースを増やすことができるためです。
- ホスト接頭辞は変更できません
- オーバーライドされたデフォルトゲートウェイで設定された Pod は、クラスターネットワークの拡張後に再作成する必要があります。
3.1. クラスターネットワークの IP アドレス範囲の拡張 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でクラスターネットワークの IP アドレス範囲を拡張してより多くのノードをサポートするには、oc patch コマンドを使用してクラスターネットワークの CIDR マスクを変更できます。
この変更には、クラスター全体に新しい Operator 設定を展開する必要があり、反映されるまでに最大 30 分かかる場合があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin 権限を持つユーザー特権でクラスターにログインしました。 - クラスターが OVN-Kubernetes ネットワークプラグインを使用していることを確認しました。
手順
クラスターのクラスターネットワーク範囲とホスト接頭辞を取得するには、次のコマンドを入力します。
$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.clusterNetwork}"出力例
[{"cidr":"10.217.0.0/22","hostPrefix":23}]クラスターネットワークの IP アドレス範囲を拡張するには、次のコマンドを入力します。前のコマンドの出力から返された CIDR IP アドレス範囲とホスト接頭辞を使用します。
$ oc patch Network.config.openshift.io cluster --type='merge' --patch \ '{ "spec":{ "clusterNetwork": [ {"cidr":"<network>/<cidr>","hostPrefix":<prefix>} ], "networkType": "OVNKubernetes" } }'ここでは、以下のようになります。
<network>-
前の手順で取得した
cidrフィールドのネットワーク部分を指定します。この値は変更できません。 <cidr>-
ネットワーク接頭辞長を指定します。たとえば、
14です。この値を前の手順の出力の値よりも小さい数値に変更して、クラスターネットワークの範囲を拡大します。 <prefix>-
クラスターの現在のホスト接頭辞を指定します。この値は、前の手順で取得した
hostPrefixフィールドの値と同じである必要があります。
コマンドの例
$ oc patch Network.config.openshift.io cluster --type='merge' --patch \ '{ "spec":{ "clusterNetwork": [ {"cidr":"10.217.0.0/14","hostPrefix": 23} ], "networkType": "OVNKubernetes" } }'出力例
network.config.openshift.io/cluster patched設定がアクティブであることを確認するには、以下のコマンドを入力します。この変更が有効になるまで、最大 30 分かかる場合があります。
$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.clusterNetwork}"出力例
[{"cidr":"10.217.0.0/14","hostPrefix":23}]
第4章 IP フェイルオーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で仮想 IP アドレスの可用性を高め、ノード障害発生時にもサービスへのアクセスを維持するには、Keepalived を使用して IP フェイルオーバーを設定できます。
IP フェイルオーバーは Keepalived を使用して、一連のホストで外部からアクセスできる仮想 IP (VIP) アドレスのセットをホストします。各仮想 IP アドレスは、一度に 1 つのホストによってのみサービスされます。Keepalived は Virtual Router Redundancy Protocol (VRRP) を使用して、(一連のホストの) どのホストがどの VIP を提供するかを判別します。ホストが利用不可の場合や Keepalived が監視しているサービスが応答しない場合は、VIP は一連のホストの別のホストに切り換えられます。したがって、VIP はホストが利用可能である限り常に提供されます。
セットのすべての VIP はセットから選択されるノードによって提供されます。単一のノードが使用可能な場合は、仮想 IP が提供されます。ノード上で VIP を明示的に配布する方法がないため、VIP のないノードがある可能性も、多数の VIP を持つノードがある可能性もあります。ノードが 1 つのみ存在する場合は、すべての VIP がそのノードに配置されます。
管理者は、すべての仮想 IP アドレスが次の要件を満たしていることを確認する必要があります。
- 設定されたホストでクラスター外からアクセスできる。
- クラスター内でこれ以外の目的で使用されていない。
各ノードの Keepalived は、必要とされるサービスが実行中であるかどうかを判別します。実行中の場合、VIP がサポートされ、Keepalived はネゴシエーションに参加してどのノードが VIP を提供するかを決定します。これに参加するノードは、このサービスが VIP の監視ポートでリッスンしている、またはチェックが無効にされている必要があります。
セット内の各仮想 IP は、異なるノードによってサービスされる可能性があります。
IP フェイルオーバーは各 VIP のポートをモニターし、ポートがノードで到達可能かどうかを判別します。ポートが到達不能な場合、VIP はノードに割り当てられません。ポートが 0 に設定されている場合、このチェックは抑制されます。check スクリプトは必要なテストを実行します。
Keepalived を実行するノードが check スクリプトを渡す場合、ノードの VIP はプリエンプションストラテジーに応じて、その優先順位および現在のマスターの優先順位に基づいて master 状態になることができます。
クラスター管理者は OPENSHIFT_HA_NOTIFY_SCRIPT 変数を介してスクリプトを提供できます。このスクリプトは、ノードの VIP の状態が変更されるたびに呼び出されます。Keepalived は VIP を提供する場合は master 状態を、別のノードが VIP を提供する場合は backup 状態を、または check スクリプトが失敗する場合は fault 状態を使用します。notify スクリプトは、状態が変更されるたびに新規の状態で呼び出されます。
OpenShift Container Platform で IP フェイルオーバーのデプロイメント設定を作成できます。IP フェイルオーバーのデプロイメント設定は VIP アドレスのセットを指定し、それらの提供先となるノードのセットを指定します。クラスターには複数の IP フェイルオーバーのデプロイメント設定を持たせることができ、それぞれが固有な VIP アドレスの独自のセットを管理します。IP フェイルオーバー設定の各ノードは IP フェイルオーバー Pod として実行され、この Pod は Keepalived を実行します。
VIP を使用してホストネットワークを持つ Pod にアクセスする場合、アプリケーション Pod は IP フェイルオーバー Pod を実行しているすべてのノードで実行されます。これにより、いずれの IP フェイルオーバーノードもマスターになり、必要時に VIP を提供することができます。アプリケーション Pod が IP フェイルオーバーのすべてのノードで実行されていない場合、一部の IP フェイルオーバーノードが VIP を提供できないか、一部のアプリケーション Pod がトラフィックを受信できなくなります。この不一致を防ぐために、IP フェイルオーバーとアプリケーション Pod の両方に同じセレクターとレプリケーション数を使用します。
VIP を使用してサービスにアクセスしている間は、アプリケーション Pod が実行されている場所に関係なく、すべてのノードでサービスに到達できるため、任意のノードをノードの IP フェイルオーバーセットに含めることができます。いずれの IP フェイルオーバーノードも、いつでもマスターにすることができます。サービスは外部 IP およびサービスポートを使用するか、NodePort を使用することができます。NodePort のセットアップは権限付きの操作で実行されます。
サービス定義で外部 IP を使用する場合、VIP は外部 IP に設定され、IP フェイルオーバーのモニタリングポートはサービスポートに設定されます。ノードポートを使用する場合、ポートはクラスター内のすべてのノードで開かれ、サービスは、現在 VIP にサービスを提供しているあらゆるノードからのトラフィックの負荷を分散します。この場合、IP フェイルオーバーのモニタリングポートはサービス定義で NodePort に設定されます。
サービス VIP の可用性が高い場合でも、パフォーマンスに影響が出る可能性があります。Keepalived は、各 VIP が設定内の一部のノードによってサービスされることを確認し、他のノードに VIP がない場合でも、複数の VIP が同じノードに配置される可能性があります。IP フェイルオーバーによって複数の VIP が同じノードに配置されると、VIP のセット全体で外部から負荷分散される戦略が妨げられる可能性があります。
ExternalIP を使用する場合は、ExternalIP 範囲と同じ仮想 IP 範囲を持つように IP フェイルオーバーを設定できます。また、モニタリングポートを無効にすることもできます。この場合、すべての VIP がクラスター内の同じノードに表示されます。どのユーザーでも、ExternalIP を使用してサービスをセットアップし、高可用性を実現できます。
クラスター内の VIP の最大数は 254 です。
4.1. IP フェイルオーバーの環境変数 リンクのコピーリンクがクリップボードにコピーされました!
IP フェイルオーバー環境変数リファレンスには、仮想 IP アドレス、監視ポート、ネットワークインターフェイスなど、OpenShift Container Platform で IP フェイルオーバーを設定するために使用できるすべての変数がリスト表示されています。
| 変数名 | デフォルト | 説明 |
|---|---|---|
|
|
|
IP フェイルオーバー Pod は、各仮想 IP (VIP) のこのポートに対して TCP 接続を開こうとします。接続が設定されると、サービスは実行中であると見なされます。このポートが |
|
|
IP フェイルオーバーが Virtual Router Redundancy Protocol (VRRP) トラフィックの送信に使用するインターフェイス名。デフォルト値は
クラスターが OVN-Kubernetes ネットワークプラグインを使用する場合は、パケットロスを回避するためにこの値を | |
|
|
|
作成するレプリカの数。これは、IP フェイルオーバーデプロイメント設定の |
|
|
レプリケートする IP アドレス範囲のリスト。これは指定する必要があります。例: | |
|
|
|
仮想ルーター ID の設定に使用されるオフセット値。異なるオフセット値を使用すると、複数の IP フェイルオーバー設定が同じクラスター内に存在できるようになります。デフォルトのオフセットは |
|
|
VRRP に作成するグループの数。これが設定されていない場合、グループは | |
|
| INPUT |
iptables チェーンの名前であり、 |
|
| アプリケーションが動作していることを確認するために定期的に実行されるスクリプトの Pod ファイルシステム内の完全パス名。 | |
|
|
| check スクリプトが実行される期間 (秒単位)。 |
|
| 状態が変更されるたびに実行されるスクリプトの Pod ファイルシステム内の完全パス名。 | |
|
|
|
新たな優先度の高いホストを処理するためのストラテジー。 |
4.2. クラスター内の IP フェイルオーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターで IP フェイルオーバーを設定し、仮想 IP アドレスの高可用性を実現するには、選択したノードで Keepalived を実行するデプロイメントを作成し、サービスを監視して、ノードが利用不能になった場合に VIP をフェイルオーバーさせることができます。
IP フェイルオーバーのデプロイメントにより、使用される制約またはラベルに一致する各ノードでフェイルオーバー Pod が実行されるようになります。Keepalived を実行する Pod は、エンドポイントを監視し、最初のノードがサービスまたはエンドポイントに到達できない場合に、Virtual Router Redundancy Protocol (VRRP) を使用して仮想 IP(仮想 IP) をあるノードから別のノードにフェイルオーバーすることができます。
実稼働環境で使用する場合は、少なくとも 2 つのノードを選択し、選択したノードの数に相当する replicas を設定する selector を設定します。
前提条件
-
cluster-admin特権を持つユーザーとしてクラスターにログインしました。 - プルシークレットを作成しました。
Red Hat OpenStack Platform (RHOSP) のみ:
- 対象環境に RHOSP クライアント (RHCOS のドキュメントを参照) をインストールしました。
-
RHOSP
openrc.shrc ファイル (RHCOS ドキュメント) をダウンロードしました。
手順
IP フェイルオーバーのサービスアカウントを作成します。
$ oc create sa ipfailoverhostNetworkの Security Context Constraints (SCC) を更新します。$ oc adm policy add-scc-to-user privileged -z ipfailover$ oc adm policy add-scc-to-user hostnetwork -z ipfailoverRed Hat OpenStack Platform (RHOSP) のみ: フェイルオーバー仮想 IP アドレスが RHOSP ポートに到達できるように、次の手順を実行します。
RHOSP CLI を使用して、RHOSP クラスターの
allowed_address_pairsパラメーターのデフォルトの RHOSP API および仮想 IP アドレスを表示します。$ openstack port show <cluster_name> -c allowed_address_pairs出力例
*Field* *Value* allowed_address_pairs ip_address='192.168.0.5', mac_address='fa:16:3e:31:f9:cb' ip_address='192.168.0.7', mac_address='fa:16:3e:31:f9:cb'RHOSP CLI で次のコマンドを入力して、IP フェイルオーバーのデプロイメントに別の仮想 IP アドレスを設定し、RHOSP のポートでそのアドレスに到達できるようにします。デフォルトの RHOSP API および仮想 IP アドレスを、IP フェイルオーバーのデプロイメントのフェイルオーバー仮想 IP アドレスとして設定しないでください。
1.1.1.1フェイルオーバー IP アドレスを RHOSP ポートの許可されたアドレスとして追加する例$ openstack port set <cluster_name> --allowed-address ip-address=1.1.1.1,mac-address=fa:fa:16:3e:31:f9:cb- デプロイメントの IP フェイルオーバーを設定するためのデプロイメント YAML ファイルを作成します。後の手順の「IP フェイルオーバー設定のデプロイメント YAML の例」を参照してください。
IP フェイルオーバーのデプロイメントで次の仕様を指定して、フェイルオーバー仮想 IP アドレスを
OPENSHIFT_HA_VIRTUAL_IPS環境変数に渡します。OPENSHIFT_HA_VIRTUAL_IPSに1.1.1.1仮想 IP アドレスを追加する例apiVersion: apps/v1 kind: Deployment metadata: name: ipfailover-keepalived # ... spec: env: - name: OPENSHIFT_HA_VIRTUAL_IPS value: "1.1.1.1" # ...
IP フェイルオーバーを設定するためのデプロイメント YAML ファイルを作成します。
注記Red Hat OpenStack Platform (RHOSP) の場合、デプロイメント YAML ファイルを再作成する必要はありません。このファイルは、以前の手順ですでに作成されています。
IP フェイルオーバー設定のデプロイメント YAML の例
apiVersion: apps/v1 kind: Deployment metadata: name: ipfailover-keepalived labels: ipfailover: hello-openshift spec: strategy: type: Recreate replicas: 2 selector: matchLabels: ipfailover: hello-openshift template: metadata: labels: ipfailover: hello-openshift spec: serviceAccountName: ipfailover privileged: true hostNetwork: true nodeSelector: node-role.kubernetes.io/worker: "" containers: - name: openshift-ipfailover image: registry.redhat.io/openshift4/ose-keepalived-ipfailover-rhel9:v4.20 ports: - containerPort: 63000 hostPort: 63000 imagePullPolicy: IfNotPresent securityContext: privileged: true volumeMounts: - name: lib-modules mountPath: /lib/modules readOnly: true - name: host-slash mountPath: /host readOnly: true mountPropagation: HostToContainer - name: etc-sysconfig mountPath: /etc/sysconfig readOnly: true - name: config-volume mountPath: /etc/keepalive env: - name: OPENSHIFT_HA_CONFIG_NAME value: "ipfailover" - name: OPENSHIFT_HA_VIRTUAL_IPS value: "1.1.1.1-2" - name: OPENSHIFT_HA_VIP_GROUPS value: "10" - name: OPENSHIFT_HA_NETWORK_INTERFACE value: "ens3" #The host interface to assign the VIPs - name: OPENSHIFT_HA_MONITOR_PORT value: "30060" - name: OPENSHIFT_HA_VRRP_ID_OFFSET value: "10" - name: OPENSHIFT_HA_REPLICA_COUNT value: "2" #Must match the number of replicas in the deployment - name: OPENSHIFT_HA_USE_UNICAST value: "false" #- name: OPENSHIFT_HA_UNICAST_PEERS #value: "10.0.148.40,10.0.160.234,10.0.199.110" - name: OPENSHIFT_HA_IPTABLES_CHAIN value: "INPUT" #- name: OPENSHIFT_HA_NOTIFY_SCRIPT # value: /etc/keepalive/mynotifyscript.sh - name: OPENSHIFT_HA_CHECK_SCRIPT value: "/etc/keepalive/mycheckscript.sh" - name: OPENSHIFT_HA_PREEMPTION value: "preempt_delay 300" - name: OPENSHIFT_HA_CHECK_INTERVAL value: "2" livenessProbe: initialDelaySeconds: 10 exec: command: - pgrep - keepalived volumes: - name: lib-modules hostPath: path: /lib/modules - name: host-slash hostPath: path: / - name: etc-sysconfig hostPath: path: /etc/sysconfig # config-volume contains the check script # created with `oc create configmap keepalived-checkscript --from-file=mycheckscript.sh` - configMap: defaultMode: 0755 name: keepalived-checkscript name: config-volume imagePullSecrets: - name: openshift-pull-secretここでは、以下のようになります。
IP フェイルオーバーキープ- IP フェイルオーバーデプロイメントの名前を指定します。
OPENSHIFT_HA_VIRTUAL_IPS-
複製する IP アドレス範囲のリストを指定します。これは指定する必要があります。例:
1.2.3.4-6,1.2.3.9 OPENSHIFT_HA_VIP_GROUPS-
VRRP 用に作成するグループ数を指定します。これが設定されていない場合、グループは
OPENSHIFT_HA_VIP_GROUPS変数で指定されている仮想 IP 範囲ごとに作成されます。 OPENSHIFT_HA_NETWORK_INTERFACE-
IP フェイルオーバーが VRRP トラフィックを送信するために使用するインターフェイス名を指定します。デフォルトで
eth0が使用されます。 OPENSHIFT_HA_MONITOR_PORT-
IP フェイルオーバー Pod が、各仮想 IP 上のこのポートへの TCP 接続を開こうとすることを指定します。接続が設定されると、サービスは実行中であると見なされます。このポートが
0に設定される場合、テストは常にパスします。デフォルト値は80です。 OPENSHIFT_HA_VRRP_ID_OFFSET-
仮想ルーター ID を設定する際に使用するオフセット値を指定します。異なるオフセット値を使用すると、複数の IP フェイルオーバー設定が同じクラスター内に存在できるようになります。デフォルトのオフセットは
10で、許可される範囲は0から255までです。 OPENSHIFT_HA_REPLICA_COUNT-
作成するレプリカの数を指定します。これは、IP フェイルオーバー設定の
spec.replicas の値と一致する必要があります。デフォルト値は2です。 OPENSHIFT_HA_USE_UNICAST-
VRRP でユニキャストモードを使用するかどうかを指定します。デフォルト値は
falseです。 OPENSHIFT_HA_UNICAST_PEERS-
ユニキャストピアの IP アドレスのリストを指定します。
OPENSHIFT_HA_USE_UNICASTがtrueに設定されている場合は、これを提供する必要があります。 OPENSHIFT_HA_IPTABLES_CHAIN-
VRRP トラフィックを許可するための
iptablesルールを自動的に追加するiptablesチェーンの名前を指定します。この値が設定されていない場合、iptablesルールは追加されません。チェーンが存在しない場合は作成されず、Keepalived はユニキャストモードで動作します。デフォルトはINPUTです。 OPENSHIFT_HA_NOTIFY_SCRIPT- 状態が変化するたびに実行されるスクリプトの、Pod ファイルシステム内の完全なパス名を指定します。
OPENSHIFT_HA_CHECK_SCRIPT- アプリケーションが正常に動作していることを確認するために定期的に実行されるスクリプトの、Pod ファイルシステム内の完全なパス名を指定します。
OPENSHIFT_HA_PREEMPTION-
優先度の高い新しいホストを処理するためのストラテジーを指定します。デフォルト値は
preempt_delay 300で、優先順位の低いマスターが VIP を保持する場合に、Keepalived インスタンスが VIP を 5 分後に引き継ぎます。 OPENSHIFT_HA_CHECK_INTERVAL-
チェックスクリプトが実行される期間を秒単位で指定します。デフォルト値は
2です。 openshift-pull-secret- IP フェイルオーバーデプロイメントに使用するプルシークレットの名前を指定します。デプロイメントを作成する前にプルシークレットを作成します。作成しない場合には、デプロイメントの作成時にエラーが発生します。
4.3. check スクリプトおよび notify スクリプトの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で IP フェイルオーバーのヘルスモニタリングをカスタマイズし、仮想 IP の状態が変更されたときに通知を受け取るには、ConfigMap オブジェクトを使用してチェックおよび通知スクリプトを設定できます。
チェックおよび通知スクリプトは、IP フェイルオーバー Pod 内で実行され、ホストファイルシステムではなく Pod のファイルシステムを使用します。ホストファイルシステムは、/hosts マウントパスの下から Pod にアクセスできます。check または notify スクリプトを設定する場合は、スクリプトへの完全パスを指定する必要があります。
各 IP フェイルオーバー Pod は、Pod が実行されているノード上の 1 つ以上の仮想 IP(仮想 IP) アドレスを制御する Keepalived デーモンを管理します。Keepalived は、ノード上の各仮想 IP の状態を追跡します。VIP は、マスター、バックアップ、または 障害の いずれかになります。
チェックおよび通知スクリプトの完全なパス名は、Keepalived の設定ファイル /etc/keepalived/keepalived.conf に追加され、Keepalived が起動するたびに読み込まれます。以下のセクションで説明するように、ConfigMap オブジェクトを使用してスクリプトを Pod に追加します。
- Check script
Keepalived は、ユーザーが指定したオプションのチェックスクリプトを定期的に実行することで、アプリケーションの状態を監視します。たとえば、このスクリプトは要求を発行し、応答を検証することで web サーバーをテストします。チェックスクリプトを指定しない場合、Keepalived は TCP 接続をテストするデフォルトのスクリプトを実行します。モニターポートが
0に設定されている場合、このデフォルトテストは抑制されます。チェックスクリプトがゼロ以外の値を返した場合、ノードは
バックアップ状態に入り、ノードが保持しているすべての仮想 IP が再割り当てされます。- Notify script
クラスター管理者として、仮想 IP の状態が変更されるたびに Keepalived が呼び出す通知スクリプトをオプションで指定できます。Keepalived は、通知スクリプトに以下のパラメーターを渡します。
-
1 ドル-グループまたはインスタンス -
2 ドル—グループまたはインスタンスの名前 -
$3— 新しい状態:マスター、バックアップ、または障害
-
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。
手順
必要なスクリプトを作成し、それを保持する
ConfigMapオブジェクトを作成します。スクリプトには入力引数は指定されず、OKの場合は0を、failの場合は1を返す必要があります。チェックスクリプト
mycheckscript.sh:#!/bin/bash # Whatever tests are needed # E.g., send request and verify response exit 0以下のコマンドを実行して
ConfigMapオブジェクトを作成します。$ oc create configmap mycustomcheck --from-file=mycheckscript.shスクリプトを Pod に追加します。マウントされた
ConfigMapオブジェクトファイルのdefaultMode は、ocコマンドを使用するか、IP フェイルオーバー設定を編集することによって実行できる必要があります。以下のコマンドを実行して、スクリプトを Pod に追加してください。
0755(10 進数で493)という値が一般的です。以下に例を示します。$ oc set env deploy/ipfailover-keepalived \ OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.sh$ oc set volume deploy/ipfailover-keepalived --add --overwrite \ --name=config-volume \ --mount-path=/etc/keepalive \ --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'注記oc set envコマンドは空白を区別します。=記号の両側に空白を入れることはできません。または、以下のコマンドを実行して
ipfailover-keepalived の設定を編集します。$ oc edit deploy ipfailover-keepalivedipfailover-keepalived の設定例spec: containers: - env: - name: OPENSHIFT_HA_CHECK_SCRIPT value: /etc/keepalive/mycheckscript.sh ... volumeMounts: - mountPath: /etc/keepalive name: config-volume dnsPolicy: ClusterFirst ... volumes: - configMap: defaultMode: 0755 name: customrouter name: config-volume ...ここでは、以下のようになります。
spec.container.env.name-
OPENSHIFT_HA_CHECK_SCRIPT環境変数がマウントされたスクリプトファイルを指すように指定します。 spec.container.volumeMounts-
マウントポイントを作成する
spec.container.volumeMountsフィールドを指定します。 spec.volumes-
config map を参照するための新しい
spec.volumesフィールドを指定します。 spec.volumes.configMap.defaultMode-
ファイルに対する実行権限を指定します。読み取られる場合は 10 進数 (
493) で表示されます。
-
変更を保存し、エディターを終了します。これにより
、ipfailover-keepalived の設定が再起動されます。
4.4. VRRP プリエンプションの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でノードが復旧する際の仮想 IP プリエンプション動作を制御するには、OPENSHIFT_HA_PREEMPTION 変数を設定して、優先度の高い仮想 IP が引き継ぐまでの遅延時間を設定したり、プリエンプションを完全に無効にしたりできます。
ノード上の仮想 IP(仮想 IP) が 障害 状態から復旧した場合、現在 マスター 状態にある仮想 IP よりも優先度が低い場合は、バックアップ 状態に移行します。
OPENSHIFT_HA_PREEMPTION 変数には 2 つのオプションがあります。
-
nopreempt: 設定されている場合、マスターロールは優先度の低い仮想 IP から優先度の高い仮想 IP に移行しません。 -
preempt_delay 300: この設定を行うと、Keepalived はマスターロールを優先度の高い仮想 IP に移動する前に 300 秒間待機します。
次の例では、OPENSHIFT_HA_PREEMPTION の 値が preempt_delay 300 に設定されています。
手順
プリエンプションを指定するには、
oc edit deploy ipfailover-keepalivedを入力し、ルーターのデプロイメント設定を編集します。$ oc edit deploy ipfailover-keepalived# ... spec: containers: - env: - name: OPENSHIFT_HA_PREEMPTION value: preempt_delay 300 #...
4.5. 複数の IP フェイルオーバーインスタンスのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で複数の IP フェイルオーバーインスタンスをデプロイする場合、各 Keepalived デーモンは仮想 IP アドレスに固有の VRRP ID を割り当てます。OPENSHIFT_HA_VRRP_ID_OFFSET 変数を設定して、異なる IP フェイルオーバー設定間で VRRP ID の範囲が重複するのを防ぎます。
IP フェイルオーバー設定によって作成される各 IP フェイルオーバー Pod (ノードまたはレプリカごとに 1 つの Pod) は、Keepalived デーモンを実行します。複数の IP フェイルオーバー設定が存在する場合、追加の Pod が作成され、それらの Keepalived デーモンが共同で Virtual Router Redundancy Protocol (VRRP) のネゴシエーションに参加します。この交渉によって、各仮想 IP(仮想 IP) をどのノードが担当するかが決定されます。
Keepalived は、各仮想 IP に対して一意の内部 vrrp-id を割り当てます。VRRP ネゴシエーション中、これらの vrrp-id 値は、対応する仮想 IP にサービスを提供するノードを選択するために使用されます。
IP フェイルオーバー Pod は、OPENSHIFT_HA_VRRP_ID_OFFSET で指定された値から開始して、IP フェイルオーバー設定で定義された仮想 IP に vrrp-id 値を順次割り当てます。有効な vrrp-id の 値の範囲は 1-255 です。
複数の IP フェイルオーバー設定を展開する場合は、設定されたオフセットが追加の仮想 IP のための十分なスペースを確保し、vrrp-id の 範囲が設定間で重複しないようにしてください。
4.6. 254 を超えるアドレスに関する IP フェイルオーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で 254 を超える仮想 IP アドレスの IP フェイルオーバーを設定するには、OPENSHIFT_HA_VIP_GROUPS 変数を使用して複数のアドレスをグループ化できます。OPENSHIFT_HA_VIP_GROUPS 変数を使用すると、IP フェイルオーバーを設定する際に、VRRP インスタンスごとの仮想 IP 数を変更したり、各 VRRP インスタンスで使用可能な仮想 IP グループの数を定義したりできます。
VIP の作成により、VRRP フェイルオーバーの発生時の広範囲の VRRP の割り当てが作成され、これはクラスター内のすべてのホストがローカルにサービスにアクセスする場合に役立ちます。たとえば、サービスが ExternalIP で公開されている場合などがこれに含まれます。
フェイルオーバーのルールとして、ルーターなどのサービスは特定の 1 つのホストに制限しません。代わりに、サービスは、IP フェイルオーバーの発生時にサービスが新規ホストに再作成されないように各ホストに複製可能な状態にする必要があります。
OpenShift Container Platform のヘルスチェックを使用している場合、IP フェイルオーバーおよびグループの性質上、グループ内のすべてのインスタンスはチェックされません。そのため、Kubernetes ヘルスチェック を使用してサービスが有効であることを確認する必要があります。
前提条件
-
cluster-admin権限を持つユーザーとしてクラスターにログインしている。
手順
各グループに割り当てられた IP アドレスの数を変更するには、
OPENSHIFT_HA_VIP_GROUPS変数の値を変更します。次に例を示します。IP フェイルオーバー設定の
DeploymentYAML の例... spec: env: - name: OPENSHIFT_HA_VIP_GROUPS value: "3" ...この例では、
OPENSHIFT_HA_VIP_GROUPS変数は3に設定されています。仮想 IP が 7 人いる環境では、3 つのグループが作成され、最初のグループに 3 人の仮想 IP が割り当てられ、残りの 2 つのグループにはそれぞれ 2 人の仮想 IP が割り当てられます。注記OPENSHIFT_HA_VIP_GROUPSで設定されたグループの数が、フェイルオーバーに設定された IP アドレスの数より少ない場合、グループには複数の IP アドレスが含まれ、すべてのアドレスが 1 つのユニットとして移動します。
4.7. ExternalIP の高可用性 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の非クラウドクラスターにおける 外部 IP の高可用性は、IP フェイルオーバーと 外部 IP の自動割り当てを組み合わせることで、ノード障害発生時にもサービスへのアクセスが維持されるようにします。外部 IP の 自動割り当てと IP フェイルオーバーの両方に同じ CIDR 範囲を使用することで、これを設定できます。
ExternalIP の高可用性を設定するには、クラスターネットワーク設定の spec.ExternalIP.autoAssignCIDRs 範囲を指定し、その同じ範囲を使用して IP フェイルオーバー設定を作成します。
IP フェイルオーバーはクラスター全体で最大 255 個の仮想 IP をサポートできるため、spec.ExternalIP.autoAssignCIDRs は /24 以下にする必要があります。
4.8. IP フェイルオーバーの削除 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターから IP フェイルオーバーを削除し、iptables ルールと仮想 IP アドレスをクリーンアップするには、デプロイメントとサービスアカウントを削除してから、設定済みの各ノードでクリーンアップジョブを実行します。
IP フェイルオーバーが最初に設定されている場合、クラスターのワーカーノードは、Keepalived 用に 224.0.0.18 のマルチキャストパケットを明示的に許可する iptables ルールを使用して変更されます。ノードが変更されるため、IP フェイルオーバーを削除するには、ジョブを実行して iptables ルールを削除し、Keepalived が使用する仮想 IP アドレスを削除する必要があります。
手順
オプション: config map として保存されるチェックおよび通知スクリプトを特定し、削除します。
IP フェイルオーバーの Pod が config map をボリュームとして使用するかどうかを決定します。
$ oc get pod -l ipfailover \ -o jsonpath="\ {range .items[?(@.spec.volumes[*].configMap)]} {'Namespace: '}{.metadata.namespace} {'Pod: '}{.metadata.name} {'Volumes that use config maps:'} {range .spec.volumes[?(@.configMap)]} {'volume: '}{.name} {'configMap: '}{.configMap.name}{'\n'}{end} {end}"出力例
Namespace: default Pod: keepalived-worker-59df45db9c-2x9mn Volumes that use config maps: volume: config-volume configMap: mycustomcheck前述の手順でボリュームとして使用される config map の名前が提供されている場合は、config map を削除します。
$ oc delete configmap <configmap_name>
IP フェイルオーバーの既存デプロイメントを特定します。
$ oc get deployment -l ipfailover出力例
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE default ipfailover 2/2 2 2 105dデプロイメントを削除します。
$ oc delete deployment <ipfailover_deployment_name>ipfailoverサービスアカウントを削除します。$ oc delete sa ipfailoverIP フェイルオーバーの設定時に追加された IP テーブルルールを削除するジョブを実行します。
以下の例のような内容で
remove-ipfailover-job.yamlなどのファイルを作成します。apiVersion: batch/v1 kind: Job metadata: generateName: remove-ipfailover- labels: app: remove-ipfailover spec: template: metadata: name: remove-ipfailover spec: containers: - name: remove-ipfailover image: registry.redhat.io/openshift4/ose-keepalived-ipfailover-rhel9:v4.20 command: ["/var/lib/ipfailover/keepalived/remove-failover.sh"] nodeSelector: kubernetes.io/hostname: <host_name> restartPolicy: Never-
nodeSelectorは、古い IP フェイルオーバーデプロイメントで使用されていたセレクターと同じである可能性があります。 - IP フェイルオーバー用に設定されたクラスター内の各ノードのジョブを実行し、毎回ホスト名を置き換えます。
-
ジョブを実行します。
$ oc create -f remove-ipfailover-job.yaml出力例
job.batch/remove-ipfailover-2h8dm created
検証
ジョブが IP フェイルオーバーの初期設定を削除していることを確認します。
$ oc logs job/remove-ipfailover-2h8dm出力例
remove-failover.sh: OpenShift IP Failover service terminating. - Removing ip_vs module ... - Cleaning up ... - Releasing VIPs (interface eth0) ...
第5章 クラスター全体のプロキシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターが、インターネットへの直接アクセスが拒否された場合に HTTP または HTTPS プロキシーを使用できるようにするには、既存のクラスターの場合は Proxy オブジェクトを変更してクラスター全体のプロキシー設定を設定するか、新しいクラスターの場合は install-config.yaml ファイルでプロキシー設定を設定します。
サポート対象プラットフォーム上のクラスターに対してクラスター全体の Egress プロキシーを有効にすると、Red Hat Enterprise Linux CoreOS (RHCOS) は status.noProxy パラメーターに、サポート対象プラットフォーム上に存在する install-config.yaml ファイルの networking.machineNetwork[].cidr、networking.clusterNetwork[].cidr、networking.serviceNetwork[] フィールドの値を入力します。
インストール後のタスクとして、networking.clusterNetwork[].cidr の値を変更できますが、networking.machineNetwork[].cidr および networking.serviceNetwork[] の値は変更できません。詳細は、「クラスターネットワーク範囲の設定」を参照してください。
Amazon Web Services (AWS)、Google Cloud、Microsoft Azure、および Red Hat OpenStack Platform (RHOSP) へのインストールの場合、status.noProxy パラメーターには、インスタンスメタデータのエンドポイント (169.254.169.254) も設定されます。
RHCOS によって Proxy オブジェクトの status: セグメントに追加される値の例
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
# ...
networking:
clusterNetwork:
- cidr: <ip_address_from_cidr>
hostPrefix: 23
network type: OVNKubernetes
machineNetwork:
- cidr: <ip_address_from_cidr>
serviceNetwork:
- 172.30.0.0/16
# ...
status:
noProxy:
- localhost
- .cluster.local
- .svc
- 127.0.0.1
- <api_server_internal_url>
# ...
ここでは、以下のようになります。
<CIDR からの IP アドレス >-
Pod の IP アドレスが割り当てられる IP アドレスブロックを指定します。デフォルト値は
10.128.0.0/14で、ホストの接頭辞は/23です。 <CIDR からの IP アドレス >-
マシンの IP アドレスブロックを指定します。デフォルト値は
10.0.0.0/16です。 <CIDR からの IP アドレス >-
サービス用の IP アドレスブロックを指定します。デフォルト値は
172.30.0.0/16です。 <api_server_internal_url>-
oc get infrastructures.config.openshift.io cluster -o jsonpath='{.status.etcdDiscoveryDomain}'コマンドを実行すると、内部 API サーバーの URL を見つけることができます。
使用しているインストールタイプに networking.machineNetwork[].cidr フィールドの設定が含まれていない場合は、ノード間のトラフィックがプロキシーをバイパスできるようにするために、.status.noProxy フィールドにマシンの IP アドレスを手動で含める必要があります。
5.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
クラスターがアクセスする必要のあるサイト を確認し、プロキシーをバイパスする必要があるかどうかを判断します。デフォルトで、すべてのクラスターシステムの Egress トラフィック (クラスターをホストするクラウドのクラウドプロバイダー API に対する呼び出しを含む) はプロキシーされます。システム全体のプロキシーは、ユーザーのワークロードではなく、システムコンポーネントにのみ影響を与えます。必要に応じて、Proxy オブジェクトの spec.noProxy パラメーターにサイトを追加してプロキシーをバイパスします。
5.2. クラスター全体のプロキシーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターでクラスター全体の Egress プロキシーを有効にするには、Proxy オブジェクトを変更して HTTP および HTTPS プロキシー設定を設定し、プロキシーをバイパスするドメインを指定します。
プロキシーが設定されていない状態でクラスターをインストールまたはアップグレードすると、Proxy オブジェクトは生成されますが、その spec が nil になります。以下に例を示します。
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec:
trustedCA:
name: ""
status:
cluster という名前の Proxy オブジェクトのみがサポートされ、追加のプロキシーを作成することはできません。
クラスター管理者は、cluster Proxy オブジェクトを変更することで、OpenShift Container Platform のプロキシーを設定できます。
クラスターのクラスター全体のプロキシー機能を有効にし、Proxy オブジェクトファイルを保存すると、Machine Config Operator (MCO) によってクラスター内のすべてのノードが再起動され、各ノードがクラスターの外部にある接続にアクセスできるようになります。これらのノードを手動で再起動する必要はありません。
前提条件
- クラスター管理者の権限がある。
-
OpenShift Container Platform
ocCLI ツールをインストールした。
手順
HTTPS 接続のプロキシーに必要な追加の CA 証明書が含まれる config map を作成します。
注記プロキシーのアイデンティティー証明書が Red Hat Enterprise Linux CoreOS (RHCOS) トラストバンドルの認証局によって署名されている場合は、この手順をスキップできます。
user-ca-bundle.yamlというファイルを作成し、PEM でエンコードされた証明書の値を指定します。apiVersion: v1 data: ca-bundle.crt: |1 <MY_PEM_ENCODED_CERTS>2 kind: ConfigMap metadata: name: user-ca-bundle3 namespace: openshift-config4 ここでは、以下のようになります。
data.ca-bundle.crt-
ca-bundle.crtという名前でなければならないデータキーを指定します。 <MY_PEM_ENCODED_CERTS>- プロキシーのアイデンティティー証明書に署名するために使用される、PEM エンコードされた 1 つ以上の X.509 証明書を指定します。
ユーザー CA バンドル-
Proxyオブジェクトから参照される config map 名を指定します。 openshift-config- config map が存在する必要のある名前空間を指定します。
次のコマンドを入力して、
user-ca-bundle.yamlファイルから config map を作成します。$ oc create -f user-ca-bundle.yaml
oc editコマンドを使用してProxyオブジェクトを変更します。$ oc edit proxy/clusterプロキシーに必要なフィールドを設定します。
apiVersion: config.openshift.io/v1 kind: Proxy metadata: name: cluster spec: httpProxy: http://<username>:<pswd>@<ip>:<port>1 httpsProxy: https://<username>:<pswd>@<ip>:<port>2 noProxy: example.com3 readinessEndpoints: - http://www.google.com4 - https://www.google.com trustedCA: name: user-ca-bundle5 ここでは、以下のようになります。
httpProxy-
クラスター外部からの HTTP 接続を作成する際に使用するプロキシー URL を指定します。URL スキームは
httpである必要があります。 httpsProxy-
クラスター外部で HTTPS 接続を作成する際に使用するプロキシー URL を指定します。URL スキームは
httpまたはhttpsである必要があります。URL スキームをサポートするプロキシーの URL を指定します。たとえば、プロキシーがhttpsを使用するように設定されていても、httpしかサポートしていない場合、ほとんどのプロキシーはエラーを報告します。このエラーメッセージはログに反映されず、代わりにネットワーク接続エラーのように見える場合があります。クラスターからのhttps接続をリッスンするプロキシーを使用する場合は、プロキシーが使用する CA と証明書を受け入れるようにクラスターを設定する必要がある場合があります。 noProxyプロキシーを除外する宛先ドメイン名、ドメイン、IP アドレス (またはその他のネットワーク CIDR)、およびポート番号をコンマ区切りで指定します。ポート番号は IPv6 アドレスを設定する場合にのみサポートされることに注意してください。IPv4 アドレスを設定する場合、ポート番号はサポートされません。
サブドメインのみと一致するように、ドメインの前に
.を付けます。たとえば、.y.comはx.y.comに一致しますが、y.comには一致しません。*を使用し、すべての宛先のプロキシーをバイパスします。noproxyフィールドにドメインアドレスを含める必要がある場合は、noproxyフィールドにその FQDN または接頭辞が一致するサブドメインを明示的に指定する必要があります。ドメインをカプセル化する IP アドレスまたは CIDR 範囲は使用できません。なぜなら、クラスターは DNS が IP アドレスを返すのを待たずにルート接続を割り当て、実行されているリクエストを明示的にチェックするからです。たとえば、noproxyフィールドに10.0.0.0/24などの CIDR ブロック値がある場合、フィールドがhttps://10.0.0.11にアクセスしようとすると、アドレスが正常にマッチします。しかし、A レコードのエントリーが10.0.0.11であるhttps://exampleserver.externaldomain.comにアクセスしようとすると、失敗します。noproxyフィールドに.externaldomain.comという追加の値が必要です。インストール設定の
networking.machineNetwork[].cidrフィールドで定義されたネットワークに含まれていないコンピュートノードをスケールアップする場合は、接続の問題を防ぐために、そのノードをこのリストに追加する必要があります。httpProxyまたはhttpsProxyフィールドのいずれも設定されていない場合に、このフィールドは無視されます。readinessEndpoints-
クラスター外部の 1 つ以上の URL を指定し、
httpProxyおよびhttpsProxy の値を status に書き込む前に、準備状況チェックを実行します。 trustedCA-
HTTPS 接続のプロキシーに必要な追加の CA 証明書を含む、
openshift-config名前空間内の config map への参照を指定します。ここで参照する前に config map が存在している必要があります。このフィールドは、プロキシーのアイデンティティー証明書が RHCOS 信頼バンドルからの認証局によって署名されない限り必要になります。
- 変更を適用するためにファイルを保存します。
5.3. クラスター全体のプロキシーの削除 リンクのコピーリンクがクリップボードにコピーされました!
cluster プロキシーオブジェクトは削除できません。OpenShift Container Platform クラスターからクラスター全体のプロキシー設定を削除するには、oc edit コマンドを使用して Proxy オブジェクトからすべての spec フィールドを削除します。
前提条件
- クラスター管理者のパーミッション。
-
OpenShift Container Platform
ocCLI ツールがインストールされている。
手順
oc editコマンドを使用してプロキシーを変更します。$ oc edit proxy/clusterプロキシーオブジェクトからすべての
specフィールドを削除します。以下に例を示します。apiVersion: config.openshift.io/v1 kind: Proxy metadata: name: cluster spec: {}- 変更を適用するためにファイルを保存します。
5.4. クラスター全体のプロキシー設定の検証 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でクラスター全体のプロキシー設定が正しく機能していることを確認するには、Proxy オブジェクトの状態を確認し、Machine Config Operator ログをレビューして、システムコンポーネントが外部リクエストをプロキシー経由でルーティングしていることを確認します。
前提条件
- クラスター管理者の権限がある。
-
OpenShift Container Platform
ocCLI ツールがインストールされている。
手順
ocコマンドを使用してプロキシー設定のステータスを確認します。$ oc get proxy/cluster -o yaml-
出力内のプロキシーフィールドを検証して、設定と一致していることを確認します。具体的には、
spec.httpProxy、spec.httpsProxy、spec.noProxy、およびspec.trustedCAフィールドを確認します。 Proxyオブジェクトのステータスを検査します。$ oc get proxy/cluster -o jsonpath='{.status}'出力例
{ status: httpProxy: http://user:xxx@xxxx:3128 httpsProxy: http://user:xxx@xxxx:3128 noProxy: .cluster.local,.svc,10.0.0.0/16,10.128.0.0/14,127.0.0.1,169.254.169.254,172.30.0.0/16,localhost,test.no-proxy.com }Machine Config Operator (MCO) のログをチェックして、設定の変更が正常に適用されたことを確認します。
$ oc logs -n openshift-machine-config-operator $(oc get pods -n openshift-machine-config-operator -l k8s-app=machine-config-operator -o name)- 必要に応じて、プロキシー設定が適用され、ノードが再起動されたことを示すメッセージを確認します。
外部リクエストを行うコンポーネント (Cluster Version Operator (CVO) など) のログをチェックして、システムコンポーネントがプロキシーを使用していることを確認します。
$ oc logs -n openshift-cluster-version $(oc get pods -n openshift-cluster-version -l k8s-app=machine-config-operator -o name)- 外部リクエストがプロキシー経由でルーティングされたことを示すログエントリーを確認します。
第6章 カスタム PKI の設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスター内の内部コンポーネント間の安全な通信を確保するには、組織独自の認証局 (CA) 証明書をクラスター全体のトラストストアに追加できます。
カスタム CA 証明書をクラスター全体のトラストストアに追加するには、次の 2 つの方法があります。
-
クラスターのインストール中に、CA 証明書を
install-config.yamlファイルに追加します。 -
実行中のクラスターで、CA 証明書を含む
ConfigMapオブジェクトを作成して、そのオブジェクトをクラスターのProxyオブジェクトで参照します。
クラスタープロキシーオブジェクトは、クラスター全体の信頼ストアを管理するためのメカニズムです。このガイドでは、CA を追加するタスクのみに焦点を当てています。Egress プロキシーも設定する必要がある場合、詳細な手順は「クラスター全体のプロキシーの設定」の章を参照してください。
6.1. クラスターのインストール中にカスタム CA を追加する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターの初期インストール時にカスタム認証局 (CA) を追加するには、CA 証明書を install-config.yaml ファイルに追加します。インストール時に CA 証明書を追加することで、インストール後にクラスターが CA を信頼するようになります。
以下の手順では、additionalTrustBundle パラメーターを使用します。出力プロキシーも設定している場合は、プロキシー設定とともにこのパラメーターを install-config.yaml ファイルに追加できます。使用可能なプロキシー設定の詳細は、「クラスター全体のプロキシーの設定」の章を参照してください。
前提条件
-
クラスターインストール用の
install-config.yamlファイルにアクセスできる。 - カスタム CA 証明書は PEM エンコード形式で利用できる。
手順
-
install-config.yamlファイルを開きます。 PEM でエンコードされた CA 証明書に
additionalTrustBundleパラメーターを追加します。apiVersion: v1 baseDomain: my.domain.com metadata: name: my-cluster additionalTrustBundle: | -----BEGIN CERTIFICATE----- <MY_PEM_ENCODED_CA_CERT> -----END CERTIFICATE-----ここでは、以下のようになります。
additionalTrustBundle-
クラスターが信頼するカスタム CA 証明書を指定します。インストールプログラムは証明書を使用して、
openshift-confignamespace にuser-ca-bundleConfigMapオブジェクトを生成します。
-
install-config.yamlファイルを保存し、クラスターのインストールを続行します。
6.2. 実行中のクラスターにカスタム CA を追加する リンクのコピーリンクがクリップボードにコピーされました!
実行中の OpenShift Container Platform クラスターにカスタム CA 証明書を追加するには、証明書を含む ConfigMap オブジェクトを作成し、それをクラスターの Proxy オブジェクトで参照します。
クラスター Proxy オブジェクトを変更すると、Machine Config Operator (MCO) は変更を適用するためにすべてのノードのローリングリブートを開始します。これは想定された動作であり、手動による介入は必要ありません。
この手順では、Proxy オブジェクトの trustedCA フィールドを使用します。同時に Egress プロキシー設定も設定または変更する必要がある場合は、「クラスター全体のプロキシーの設定」の章で詳細な手順を参照してください。
前提条件
- cluster-admin 特権がある。
-
OpenShift CLI (
oc) がインストールされている。 - カスタム CA 証明書は PEM エンコード形式で利用できる。
手順
CA 証明書を使用して
ConfigMapオブジェクトを作成します。-
ConfigMapオブジェクトを定義するために、custom-ca.yamlという名前の YAML ファイルを作成します。 以下の内容をファイルに追加します。
apiVersion: v1 kind: ConfigMap metadata: name: custom-ca-bundle namespace: openshift-config data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- <MY_PEM_ENCODED_CA_CERT> -----END CERTIFICATE-----ここでは、以下のようになります。
metadata.name-
Proxyオブジェクトから参照するConfigMapオブジェクトの名前を指定します。 metadata.namespace-
ConfigMapオブジェクトの名前空間を指定します。 data.ca-bundle.crt- 証明書バンドルのデータキーを指定します。
-
以下のコマンドを実行して、マニフェストを適用し、クラスター内に
ConfigMapオブジェクトを作成します。$ oc apply -f custom-ca.yamlクラスター
Proxyオブジェクト内のConfigMapオブジェクトを参照します。次のコマンドを実行して、クラスターの
プロキシーオブジェクトを更新し、先ほど作成したConfigMapオブジェクトを参照するようにします。$ oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":{"name":"custom-ca-bundle"}}}'このコマンドを実行すると、Machine Config Operator (MCO) が変更を検出し、クラスター内の全ノードに信頼された新規 CA の配布を開始します。
6.3. カスタム CA 設定の検証 リンクのコピーリンクがクリップボードにコピーされました!
カスタム CA 証明書が OpenShift Container Platform クラスター全体のトラストバンドルに正常に追加されたことを確認するには、trusted-ca-bundle ConfigMap オブジェクトの内容を表示し、証明書が含まれていることを確認します。
前提条件
-
openshift-config namespace 内の
ConfigMapオブジェクトを表示する権限がある。 -
OpenShift CLI (
oc) がインストールされている。
手順
クラスター全体の CA トラストバンドルの内容を表示するには、次のコマンドを実行します。
$ oc get configmap trusted-ca-bundle -n openshift-config -o yaml-
YAML 出力で、
data.ca-bundle.crtフィールドを調べます。このフィールドには、クラスターのすべての信頼済み証明書が含まれます。 追加した PEM エンコードされた証明書が証明書のリストに含まれていることを確認します。出力の構造は、以下のようになります。
kind: ConfigMap metadata: name: trusted-ca-bundle namespace: openshift-config data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- <A_SYSTEM_CA_CERTIFICATE> -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- <ANOTHER_SYSTEM_CA_CERTIFICATE> -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- <YOUR_CUSTOM_CA_CERTIFICATE_SHOULD_BE_HERE> -----END CERTIFICATE-----出力に証明書が存在する場合は、クラスターはカスタム PKI を信頼します。
6.4. Operator を使用した証明書の挿入 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、Operator を使用した証明書の注入により、カスタム認証局 (CA) がシステム証明書とマージされ、マージされたバンドルが要求元の Operator に注入されます。この機能を使用すると、Operator は手動で証明書バンドルを管理することなく、カスタム証明書を信頼できるようになります。
config.openshift.io/inject-trusted-cabundle="true" ラベルを config map に追加すると、そこに格納されている既存データが削除されます。Cluster Network Operator は config map の所有権を取得し、ca-bundle をデータとしてのみ受け入れます。service.beta.openshift.io/inject-cabundle=true アノテーションまたは同様の設定を使用して service-ca.crt を保存するには、別の config map を使用する必要があります。同じ config map に config.openshift.io/inject-trusted-cabundle="true" ラベルと service.beta.openshift.io/inject-cabundle=true アノテーションを追加すると、問題が発生する可能性があります。
Operator は、以下のラベルの付いた空の ConfigMap を作成してこの挿入を要求します。
config.openshift.io/inject-trusted-cabundle="true"
空の ConfigMap の例:
apiVersion: v1
data: {}
kind: ConfigMap
metadata:
labels:
config.openshift.io/inject-trusted-cabundle: "true"
name: ca-inject
namespace: apache
ここでは、以下のようになります。
metadata.name- 空の ConfigMap 名を指定します。
Operator は、この ConfigMap をコンテナーのローカル信頼ストアにマウントします。
信頼された CA 証明書の追加は、証明書が Red Hat Enterprise Linux CoreOS (RHCOS) 信頼バンドルに含まれない場合にのみ必要になります。
証明書の挿入は Operator に制限されません。Cluster Network Operator は、空の ConfigMap が config.openshift.io/inject-trusted-cabundle=true ラベルを使用して作成される場合に、すべての namespace で証明書を挿入できます。
ConfigMap はすべての namespace に置くことができますが、ConfigMap はカスタム CA を必要とする Pod 内の各コンテナーに対してボリュームとしてマウントされる必要があります。以下に例を示します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-example-custom-ca-deployment
namespace: my-example-custom-ca-ns
spec:
...
spec:
...
containers:
- name: my-container-that-needs-custom-ca
volumeMounts:
- name: trusted-ca
mountPath: /etc/pki/ca-trust/extracted/pem
readOnly: true
volumes:
- name: trusted-ca
configMap:
name: ca-inject
items:
- key: ca-bundle.crt
path: tls-ca-bundle.pem
ここでは、以下のようになります。
ボリューム.アイテム.キー- ConfigMap のキーを指定します。
ボリュームアイテムパス- ConfigMap のパスを指定します。