26.4. Ingress Controller エンドポイント公開戦略の設定
endpointPublishingStrategy
は Ingress コントローラーエンドポイントを他のネットワークに公開し、ロードバランサーの統合を有効にし、他のシステムへのアクセスを提供するために使用されます。
Red Hat OpenStack Platform (RHOSP)では、クラウドプロバイダーがヘルスモニターを作成するように設定されている場合にのみ、LoadBalancerService
エンドポイントの公開ストラテジーがサポートされます。RHOSP 16.2 の場合、このストラテジーは Amphora Octavia プロバイダーを使用する場合にのみ可能です。
詳細は、RHOSP インストールドキュメントの「RHOSP Cloud Controller Manager オプションの設定」セクションを参照してください。
26.4.1. Ingress Controller エンドポイントの公開ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
NodePortService
エンドポイント公開ストラテジー
NodePortService
エンドポイント公開ストラテジーは、Kubernetes NodePort サービスを使用して Ingress Controller を公開します。
この設定では、Ingress Controller のデプロイメントはコンテナーのネットワークを使用します。NodePortService
はデプロイメントを公開するために作成されます。特定のノードポートは OpenShift Container Platform によって動的に割り当てられますが、静的ポートの割り当てをサポートするために、管理対象の NodePortService
のノードポートフィールドへの変更が保持されます。
図26.3 NodePortService の図
前述の図では、OpenShift Container Platform Ingress NodePort エンドポイントの公開戦略に関する以下のような概念を示しています。
- クラスターで利用可能なノードにはすべて、外部からアクセス可能な独自の IP アドレスが割り当てられています。クラスター内で動作するサービスは、全ノードに固有の NodePort にバインドされます。
-
たとえば、クライアントが、図に示す IP アドレス
10.0.128.4
に接続してダウンしているノードに接続した場合に、ノードポートは、サービスを実行中で利用可能なノードにクライアントを直接接続します。このシナリオでは、ロードバランシングは必要ありません。イメージが示すように、10.0.128.4
アドレスがダウンしており、代わりに別の IP アドレスを使用する必要があります。
Ingress Operator は、サービスの .spec.ports[].nodePort
フィールドへの更新を無視します。
デフォルトで、ポートは自動的に割り当てられ、各種の統合用のポート割り当てにアクセスできます。ただし、既存のインフラストラクチャーと統合するために静的ポートの割り当てが必要になることがありますが、これは動的ポートに対応して簡単に再設定できない場合があります。静的ノードポートとの統合を実行するには、マネージドのサービスリソースを直接更新できます。
詳細は、NodePort
に関する Kubernetes サービスのドキュメント を参照してください。
HostNetwork
エンドポイント公開ストラテジー
HostNetwork
エンドポイント公開ストラテジーは、Ingress Controller がデプロイされるノードポートで Ingress Controller を公開します。
HostNetwork
エンドポイント公開ストラテジーを持つ Ingress Controller には、ノードごとに 1 つの Pod レプリカのみを設定できます。n のレプリカを使用する場合、それらのレプリカをスケジュールできる n 以上のノードを使用する必要があります。各 Pod レプリカは、スケジュールされているノードホストでポート 80
および 443
を要求するので、同じノードで別の Pod がそれらのポートを使用している場合は、レプリカをノードにスケジュールすることはできません。
HostNetwork
オブジェクトには、オプションのバインディングポートのデフォルト値が httpPort: 80
、httpsPort: 443
、statsPort: 1936
の hostNetwork
フィールドがあります。ネットワークに異なるバインディングポートを指定することで、HostNetwork
ストラテジーに対して、同じノードに複数の Ingress Controller をデプロイできます。
例
26.4.1.1. Ingress Controller エンドポイント公開スコープの内部への設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者がクラスターをプライベートに指定せずに新しいクラスターをインストールすると、scope
がExternal
に設定されたデフォルトの Ingress Controller が作成されます。クラスター管理者は、External
スコープの Ingress Controller をInternal
に変更できます。
前提条件
-
oc
CLI がインストールされている。
手順
External
スコープの Ingress Controller をInternal
に変更するには、次のコマンドを入力します。oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Controller のステータスを確認するには、次のコマンドを入力します。
oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ステータス状態が
Progressing
の場合は、さらにアクションを実行する必要があるかどうかを示します。たとえば、ステータスの状態によっては、次のコマンドを入力して、サービスを削除する必要があることを示している可能性があります。oc -n openshift-ingress delete services/router-default
$ oc -n openshift-ingress delete services/router-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスを削除すると、Ingress Operator はサービスを
Internal
として再作成します。
26.4.1.2. Ingress Controller エンドポイント公開スコープの外部への設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者がクラスターをプライベートに指定せずに新しいクラスターをインストールすると、scope
がExternal
に設定されたデフォルトの Ingress Controller が作成されます。
Ingress Controller のスコープは、インストール中またはインストール後にInternal
になるように設定でき、クラスター管理者はInternal
の Ingress Controller をExternal
に変更できます。
一部のプラットフォームでは、サービスを削除して再作成する必要があります。
スコープを変更すると、場合によっては数分間、Ingress トラフィックが中断される可能性があります。これが該当するのは、サービスを削除して再作成する必要があるプラットフォームです。理由は、この手順により、OpenShift Container Platform が既存のサービスロードバランサーのプロビジョニングを解除して新しいサービスロードバランサーをプロビジョニングし、DNS を更新する可能性があるためです。
前提条件
-
oc
CLI がインストールされている。
手順
Internal
スコープの入力コントローラーをExternal
に変更するには、次のコマンドを入力します。oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
$ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Controller のステータスを確認するには、次のコマンドを入力します。
oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ステータス状態が
Progressing
の場合は、さらにアクションを実行する必要があるかどうかを示します。たとえば、ステータスの状態によっては、次のコマンドを入力して、サービスを削除する必要があることを示している可能性があります。oc -n openshift-ingress delete services/router-default
$ oc -n openshift-ingress delete services/router-default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスを削除すると、Ingress Operator はサービスを
External
として再作成します。
26.4.1.3. Ingress Controller への単一の NodePort サービスの追加 リンクのコピーリンクがクリップボードにコピーされました!
プロジェクトごとに NodePort
タイプの サービス
を作成する代わりに、カスタム Ingress コントローラーを作成して NodePortService
エンドポイント公開ストラテジーを使用できます。ポートの競合を防ぐには、Ingress シャーディングを介して HostNetwork
Ingress コントローラーがすでにあるノードにルートのセットを適用する場合に、Ingress コントローラーのこの設定を検討してください。
プロジェクトごとに NodePort
タイプの サービス
を設定する前に、次の考慮事項をお読みください。
- Nodeport Ingress Controller ドメインのワイルドカード DNS レコードを作成する必要があります。Nodeport Ingress Controller ルートには、ワーカーノードのアドレスからアクセスできます。ルートに必要な DNS レコードの詳細は、「user-provisioned DNS 要件」を参照してください。
-
サービスのルートを公開し、カスタム Ingress コントローラードメインの the-
hostname
引数を指定する必要があります。 -
アプリケーション Pod にアクセスできるように、ルートで
NodePort
-typeサービス
に割り当てられたポートを追加する必要があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 - ワイルドカード DNS レコードが作成されている。
手順
Ingress Controller のカスタムリソース (CR) ファイルを作成します。
IngressController
オブジェクトの情報を定義する CR ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
IngressController
CR のカスタム名
を指定します。- 2
- Ingress Controller が提供する DNS の名前。たとえば、デフォルトの Ingresscontroller ドメインは
apps.ipi-cluster.example.com
であるため、<custom_ic_domain_name
> をnodeportsvc.ipi-cluster.example.com
として指定します。 - 3
- カスタム Ingress Controller を含むノードのラベルを指定します。
- 4
- namespace のセットのラベルを指定します。<
key>:<value> をキーと値のペアのマップに置き換えます
。ここで、<key
> は新規ラベルの一意の名前で、<value
> はその値になります。例:ingresscontroller: custom-ic
oc label node
コマンドを使用してラベルをノードに追加します。oc label node <node_name> <key>=<value>
$ oc label node <node_name> <key>=<value>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- ここで
、<value
> はIngressController
CR のnodePlacement
セクションで指定されたキーと値のペアと一致する必要があります。
IngressController
オブジェクトを作成します。oc create -f <ingress_controller_cr>.yaml
$ oc create -f <ingress_controller_cr>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IngressController
CR 用に作成されたサービスのポートを見つけます。oc get svc -n openshift-ingress
$ oc get svc -n openshift-ingress
Copy to Clipboard Copied! Toggle word wrap Toggle overflow router-nodeport-custom-ic3
サービスのポート80:32432/TCP
を示す出力例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-internal-default ClusterIP 172.30.195.74 <none> 80/TCP,443/TCP,1936/TCP 223d router-nodeport-custom-ic3 NodePort 172.30.109.219 <none> 80:32432/TCP,443:31366/TCP,1936:30499/TCP 155m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-internal-default ClusterIP 172.30.195.74 <none> 80/TCP,443/TCP,1936/TCP 223d router-nodeport-custom-ic3 NodePort 172.30.109.219 <none> 80:32432/TCP,443:31366/TCP,1936:30499/TCP 155m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいプロジェクトを作成するために、次のコマンドを入力します。
oc new-project <project_name>
$ oc new-project <project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しい namespace にラベルを付けるために、次のコマンドを入力します。
oc label namespace <project_name> <key>=<value>
$ oc label namespace <project_name> <key>=<value>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- ここで
、<key>=<value
> は Ingress コントローラー CR のnamespaceSelector
セクションの値と一致する必要があります。
クラスター内に新しいアプリケーションを作成します。
oc new-app --image=<image_name>
$ oc new-app --image=<image_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <
image_name>
の例はquay.io/openshifttest/hello-openshift:multiarch
です。
Pod がサービスを使用してアプリケーションをクラスター外の公開できるように、サービスの
Route
オブジェクトを作成します。oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name>
$ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記カスタム Ingress コントローラーのドメイン名を the-
hostname
引数に指定する必要があります。これを行わない場合、Ingress Operator がデフォルトの Ingress Controller を使用してクラスターのすべてのルートを提供します。ルートに
Admitted
ステータスがあり、カスタム Ingress コントローラーのメタデータが含まれていることを確認します。oc get route/hello-openshift -o json | jq '.status.ingress'
$ oc get route/hello-openshift -o json | jq '.status.ingress'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトの
IngressController
CR を更新して、デフォルトの Ingress コントローラーがNodePort
タイプのサービス
を管理しないようにします。他のすべてのクラスタートラフィックは、引き続きデフォルトの Ingress Controller によって監視します。oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
$ oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを入力して、DNS エントリーがクラスターの内外にルーティングできることを確認します。このコマンドは、この手順の前の
oc label node
コマンド実行からラベルを受け取ったノードの IP アドレスを出力します。dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
$ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターが DNS 解決に外部 DNS サーバーの IP アドレスを使用していることを確認するために、次のコマンドを入力してクラスターの接続を確認します。
curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port>
$ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Hello OpenShift!
Hello OpenShift!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow