7.2. Ingress クラスタートラフィックの設定


7.2.1. Ingress クラスタートラフィックの設定の概要

OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする以下の方法を提供します。

以下の方法が推奨されます。以下は、これらの方法の優先される順です。

  • HTTP/HTTPS を使用する場合は Ingress Controller を使用する。
  • HTTPS 以外の TLS で暗号化されたプロトコルを使用する場合、たとえば、SNI ヘッダーを使用する TLS の場合は、Ingress Controller を使用します。
  • それ以外の場合は、ロードバランサー、外部 IP、または NodePort を使用します。
Expand
方法目的

Ingress Controller の使用

HTTP/HTTPS トラフィックおよび HTTPS 以外の TLS で暗号化されたプロトコル (TLS と SNI ヘッダーの使用など) へのアクセスを許可します。

ロードバランサーサービスを使用した外部 IP の自動割り当て

プールから割り当てられた IP アドレスを使用した非標準ポートへのトラフィックを許可します。ほとんどのクラウドプラットフォームは、ロードバランサーの IP アドレスでサービスを開始する方法を提供します。

MetalLB および MetalLB Operator について

マシンネットワーク上のプールから特定の IP アドレスまたはアドレスへのトラフィックを許可します。ベアメタルインストールまたはベアメタルのようなプラットフォームの場合、MetalLB は、ロードバランサーの IP アドレスを使用してサービスを開始する方法を提供します。

外部 IP のサービスへの手動割り当て

特定の IP アドレスを使用した非標準ポートへのトラフィックを許可します。

NodePort の設定

クラスターのすべてのノードでサービスを公開します。

7.2.1.1. 比較: 外部 IP アドレスへのフォールトトレランスアクセス

外部 IP アドレスへのアクセスを提供する通信メソッドの場合、IP アドレスへのフォールトトレランスアクセスは別の考慮事項となります。以下の機能は、外部 IP アドレスへのフォールトトレランスアクセスを提供します。

IP フェイルオーバー
IP フェイルオーバーはノードセットの仮想 IP アドレスのプールを管理します。これは、Keepalived および Virtual Router Redundancy Protocol (VRRP) で実装されます。IP フェイルオーバーはレイヤー 2 のメカニズムのみで、マルチキャストに依存します。マルチキャストには、一部のネットワークに欠点がある場合があります。
MetalLB
MetalLB にはレイヤー 2 モードがありますが、マルチキャストは使用されません。レイヤー 2 モードには、1 つのノードで外部 IP アドレスのトラフィックをすべて転送する欠点があります。
外部 IP アドレスの手動割り当て
クラスターを、外部 IP アドレスをサービスに割り当てるために使用される IP アドレスブロックで設定できます。デフォルトでは、この機能は無効にされています。この機能は柔軟性がありますが、クラスターまたはネットワーク管理者に最大の負担をかけます。クラスターは、外部 IP 宛てのトラフィックを受信する準備ができていますが、各顧客は、トラフィックをノードにルーティングする方法を決定する必要があります。

7.2.2. サービスの ExternalIP の設定

クラスター管理者は、トラフィックをクラスター内のサービスに送信できるクラスター外の IP アドレスブロックを指定できます。

この機能は通常、ベアメタルハードウェアにインストールされているクラスターに最も役立ちます。

7.2.2.1. 前提条件

  • ネットワークインフラストラクチャーは、外部 IP アドレスのトラフィックをクラスターにルーティングする必要があります。

7.2.2.2. ExternalIP について

非クラウド環境の場合、OpenShift Container Platform は、Service オブジェクトの spec.externalIPs[] パラメーターで外部 IP アドレスを指定するための ExternalIP 機能の使用をサポートしています。ExternalIP で設定されたサービスは、type=NodePort を持つサービスと同様に機能し、トラフィックは負荷分散のためにローカルノードに送信されます。

重要

クラウド環境の場合、クラウドの自動デプロイメントのためにロードバランサーサービスを使用し、サービスのエンドポイントをターゲットに設定します。

パラメーターの値を指定すると、OpenShift Container Platform はサービスに追加の仮想 IP アドレスを割り当てます。IP アドレスは、クラスターに定義したサービスネットワークの外部に存在することができます。

警告

ExternalIP はデフォルトで無効になっているため、ExternalIP 機能を有効にすると、外部 IP アドレスへのクラスター内トラフィックがそのサービスに送信されるため、サービスにセキュリティーリスクが生じる可能性があります。この設定は、クラスターユーザーが外部リソース宛ての機密トラフィックをインターセプトできることを意味します。

MetalLB 実装または IP フェイルオーバーデプロイメントのいずれかを使用して、次の方法で ExternalIP リソースをサービスに接続できます。

外部 IP の自動割り当て
OpenShift Container Platform は、spec.type=LoadBalancer を設定して Service オブジェクトを作成する際に、IP アドレスを autoAssignCIDRs CIDR ブロックから spec.externalIPs[] 配列に自動的に割り当てます。この設定では、OpenShift Container Platform はロードバランサーサービスタイプのクラウドバージョンを実装し、サービスに IP アドレスを割り当てます。自動割り当てはデフォルトでは無効になっており、クラスター管理者が「ExternalIP の設定」セクションの説明に従い設定する必要があります。
外部 IP の手動割り当て
OpenShift Container Platform は Service オブジェクトの作成時に spec.externalIPs[] 配列に割り当てられた IP アドレスを使用します。別のサービスによってすでに使用されている IP アドレスを指定することはできません。

MetalLB 実装または IP フェイルオーバーデプロイメントのいずれかを使用して外部 IP アドレスブロックをホストした後、外部 IP アドレスブロックがクラスターにルーティングされるようにネットワークインフラストラクチャーを設定する必要があります。この設定は、ノードからのネットワークインターフェイスに IP アドレスが設定されていないことを意味します。トラフィックを処理するには、静的な Address Resolution Protocol (ARP) エントリーなどの方法を使用して、ルーティングと外部 IP へのアクセスを設定する必要があります。

OpenShift Container Platform は以下の機能を追加して Kubernetes の ExternalIP 機能を拡張します。

  • 設定可能なポリシーでの、ユーザーによる外部 IP アドレスの使用の制限
  • 要求時の外部 IP アドレスのサービスへの自動割り当て

7.2.2.3. 関連情報

7.2.2.4. ExternalIP の設定

OpenShift Container Platform での外部 IP アドレスの使用は、cluster という名前の Network.config.openshift.io カスタムリソース (CR) の以下のパラメーターで制御されます。

  • spec.externalIP.autoAssignCIDRs は、サービスの外部 IP アドレスを選択する際にロードバランサーによって使用される IP アドレスブロックを定義します。OpenShift Container Platform は、自動割り当て用の単一 IP アドレスブロックのみをサポートします。手動で ExternalIP をサービスに割り当てる場合は、数に限りのある共有 IP アドレスのポートスペースを管理する必要があるため、この設定はそ手動で設定するよりも少ない手順で行えます。自動割り当てを有効にすると、spec.type=LoadBalancer が設定された Service オブジェクトに外部 IP アドレスが割り当てられます。
  • spec.externalIP.policy は、IP アドレスを手動で指定する際に許容される IP アドレスブロックを定義します。OpenShift Container Platform は、spec.externalIP.autoAssignCIDRs パラメーターで定義した IP アドレスブロックにポリシールールを適用しません。

ルーティングが正しく行われると、設定された外部 IP アドレスブロックからの外部トラフィックは、サービスが公開する TCP ポートまたは UDP ポートを介してサービスのエンドポイントに到達できます。

重要

クラスター管理者は、externalIP へのルーティングを設定する必要があります。割り当てる IP アドレスブロックがクラスター内の 1 つ以上のノードで終了することを確認する必要もあります。詳細は、Kubernetes External IPs を参照してください。

OpenShift Container Platform は IP アドレスの自動および手動割り当ての両方をサポートしており、それぞれのアドレスは 1 つのサービスの最大数に割り当てられることが保証されます。この設定により、ポートが他のサービスで公開されているかにかかわらず、各サービスはそれぞれ選択したポートを公開できます。

注記

OpenShift Container Platform の autoAssignCIDRs で定義された IP アドレスブロックを使用するには、ホストのネットワークに必要な IP アドレスの割り当ておよびルーティングを設定する必要があります。

以下の YAML は、外部 IP アドレスが設定されたサービスを説明しています。

spec.externalIPs[] が設定された Service オブジェクトの例

apiVersion: v1
kind: Service
metadata:
  name: http-service
spec:
  clusterIP: 172.30.163.110
  externalIPs:
  - 192.168.132.253
  externalTrafficPolicy: Cluster
  ports:
  - name: highport
    nodePort: 31903
    port: 30102
    protocol: TCP
    targetPort: 30102
  selector:
    app: web
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.168.132.253
# ...
Copy to Clipboard Toggle word wrap

7.2.2.5. 外部 IP アドレスの割り当ての制限

クラスター管理者は、IP アドレスブロックを指定してサービスの IP アドレスを許可または拒否できます。制限は、cluster-admin 権限を持たないユーザーにのみ適用されます。クラスター管理者は、サービスの spec.externalIPs[] フィールドを任意の IP アドレスに常に設定できます。

policy オブジェクトの spec.ExternalIP.policy パラメーターに Classless Inter-Domain Routing (CIDR) アドレスブロックを指定して、IP アドレスポリシーを設定します。

policy オブジェクトとその CIDR パラメーターの JSON 形式の例

{
  "policy": {
    "allowedCIDRs": [],
    "rejectedCIDRs": []
  }
}
Copy to Clipboard Toggle word wrap

ポリシーの制限を設定する際に、以下のルールが適用されます。

  • policy{} に設定されている場合、spec.ExternalIPs[] を使用して Service オブジェクトを作成すると、サービスが失敗します。これは、OpenShift Container Platform のデフォルト設定です。policy: null の場合も同じ動作になります。
  • policy が設定され、policy.allowedCIDRs[] または policy.rejectedCIDRs[] のいずれかが設定される場合、以下のルールが適用されます。

    • allowedCIDRs[]rejectedCIDRs[] の両方が設定される場合、rejectedCIDRs[]allowedCIDRs[] よりも優先されます。
    • allowedCIDRs[] が設定される場合、spec.ExternalIPs[] が設定されている Service オブジェクトの作成は、指定された IP アドレスが許可される場合にのみ正常に実行されます。
    • rejectedCIDRs[] が設定される場合、spec.ExternalIPs[] が設定されている Service オブジェクトの作成は、指定された IP アドレスが拒否されていない場合にのみ正常に実行されます。

7.2.2.6. ポリシーオブジェクトの例

このセクションの例では、さまざまな spec.externalIP.policy 設定を示します。

  • 以下の例のポリシーは、外部 IP アドレスが指定されたサービスを OpenShift Container Platform が作成できないようにします。

    Service オブジェクトの spec.externalIPs[] に指定された値を拒否するポリシーの例

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      externalIP:
        policy: {}
    # ...
    Copy to Clipboard Toggle word wrap

  • 以下の例では、allowedCIDRs および rejectedCIDRs フィールドの両方が設定されます。

    許可される、および拒否される CIDR ブロックの両方を含むポリシーの例

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      externalIP:
        policy:
          allowedCIDRs:
          - 172.16.66.10/23
          rejectedCIDRs:
          - 172.16.66.10/24
    # ...
    Copy to Clipboard Toggle word wrap

  • 以下の例では、policy{} に設定されます。これが設定されている場合、oc get networks.config.openshift.io -o yaml コマンドを使用して設定を表示しても policy パラメーターはコマンド出力に表示されません。policy: null の場合も同じ動作になります。

    Service オブジェクトの spec.externalIPs[] に指定された値を許可するポリシーの例

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      clusterNetwork:
      - cidr: 10.128.0.0/14
        hostPrefix: 23
      externalIP:
        policy: {}
    # ...
    Copy to Clipboard Toggle word wrap

7.2.2.7. ExternalIP アドレスブロックの設定

ExternalIP アドレスブロックの設定は、cluster という名前の Network カスタムリソース (CR) で定義されます。ネットワーク CR は config.openshift.io API グループに含まれます。

重要

クラスターのインストール時に、Cluster Version Operator (CVO) は cluster という名前のネットワーク CR を自動的に作成します。このタイプのその他の CR オブジェクトの作成はサポートされていません。

以下の YAML は ExternalIP 設定を説明しています。

cluster という名前の network.config.openshift.io CR

apiVersion: config.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  externalIP:
    autoAssignCIDRs: [] 
1

    policy: 
2

      ...
Copy to Clipboard Toggle word wrap

1
外部 IP アドレスのサービスへの自動割り当てに使用できる CIDR 形式で IP アドレスブロックを定義します。1 つの IP アドレス範囲のみが許可されます。
2
IP アドレスのサービスへの手動割り当ての制限を定義します。制限が定義されていない場合は、Service オブジェクトに spec.externalIP フィールドを指定しても許可されません。デフォルトで、制限は定義されません。

以下の YAML は、policy スタンザのフィールドを説明しています。

Network.config.openshift.io policy スタンザ

policy:
  allowedCIDRs: [] 
1

  rejectedCIDRs: [] 
2
Copy to Clipboard Toggle word wrap

1
CIDR 形式の許可される IP アドレス範囲のリスト。
2
CIDR 形式の拒否される IP アドレス範囲のリスト。
外部 IP 設定の例

外部 IP アドレスプールの予想される複数の設定が以下の例で表示されています。

  • 以下の YAML は、自動的に割り当てられた外部 IP アドレスを有効にする設定を説明しています。

    spec.externalIP.autoAssignCIDRs が設定された設定例

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      ...
      externalIP:
        autoAssignCIDRs:
        - 192.168.132.254/29
    Copy to Clipboard Toggle word wrap

  • 以下の YAML は、許可された、および拒否された CIDR 範囲のポリシールールを設定します。

    spec.externalIP.policy が設定された設定例

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      ...
      externalIP:
        policy:
          allowedCIDRs:
          - 192.168.132.0/29
          - 192.168.132.8/29
          rejectedCIDRs:
          - 192.168.132.7/32
    Copy to Clipboard Toggle word wrap

7.2.2.8. クラスターの外部 IP アドレスブロックの設定

クラスター管理者は、以下の ExternalIP を設定できます。

  • Service オブジェクトの spec.clusterIP フィールドを自動的に設定するために OpenShift Container Platform によって使用される ExternalIP アドレスブロック。
  • IP アドレスを制限するポリシーオブジェクトは Service オブジェクトの spec.clusterIP 配列に手動で割り当てられます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. オプション: 現在の外部 IP 設定を表示するには、以下のコマンドを入力します。

    $ oc describe networks.config cluster
    Copy to Clipboard Toggle word wrap
  2. 設定を編集するには、以下のコマンドを入力します。

    $ oc edit networks.config cluster
    Copy to Clipboard Toggle word wrap
  3. 以下の例のように ExternalIP 設定を変更します。

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      ...
      externalIP: 
    1
    
      ...
    Copy to Clipboard Toggle word wrap
    1
    externalIP スタンザの設定を指定します。
  4. 更新された ExternalIP 設定を確認するには、以下のコマンドを入力します。

    $ oc get networks.config cluster -o go-template='{{.spec.externalIP}}{{"\n"}}'
    Copy to Clipboard Toggle word wrap

7.2.2.9. 次のステップ

7.2.3. Ingress Controller を使用した Ingress クラスターの設定

OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法は Ingress Controller を使用します。

7.2.3.1. Ingress Controller およびルートの使用

Ingress Operator は Ingress Controller およびワイルドカード DNS を管理します。

Ingress Controller の使用は、最も一般的な、OpenShift Container Platform クラスターへの外部アクセスを許可する方法です。

Ingress Controller は外部要求を許可し、設定されたルートに基づいてそれらをプロキシー送信するよう設定されます。これは、HTTP、SNI を使用する HTTPS、SNI を使用する TLS に限定されており、SNI を使用する TLS で機能する Web アプリケーションやサービスには十分な設定です。

管理者と連携して Ingress Controller を設定します。外部要求を許可し、設定されたルートに基づいてそれらをプロキシー送信するように Ingress Controller を設定します。

管理者はワイルドカード DNS エントリーを作成してから Ingress Controller を設定できます。その後は管理者に問い合わせることなく edge Ingress Controller と連携できます。

デフォルトで、クラスター内のすべての Ingress Controller はクラスター内の任意のプロジェクトで作成されたすべてのルートを許可します。

Ingress Controller:

  • デフォルトでは 2 つのレプリカがあるので、これは 2 つのワーカーノードで実行する必要があります。
  • 追加のノードにレプリカを組み込むためにスケールアップすることができます。
注記

このセクションの手順では、クラスターの管理者が事前に行っておく必要のある前提条件があります。

7.2.3.2. 前提条件

以下の手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達できるように、クラスターネットワーク環境に対して外部ポートをセットアップします。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    $ oc adm policy add-cluster-role-to-user cluster-admin username
    Copy to Clipboard Toggle word wrap
  • 1 つ以上のマスターと 1 つ以上のノードを持つ OpenShift Container Platform クラスターと、クラスターへのネットワークアクセス権を持つクラスター外部のシステムを用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

7.2.3.3. プロジェクトおよびサービスの作成

公開するプロジェクトとサービスが存在しない場合は、プロジェクトを作成してからサービスを作成します。

プロジェクトとサービスがすでに存在する場合は、サービスを公開してルートを作成する手順に進みます。

前提条件

  • OpenShift CLI (oc) をインストールし、クラスター管理者としてログインしている。

手順

  1. oc new-project コマンドを実行して、サービス用の新しいプロジェクトを作成します。

    $ oc new-project <project_name>
    Copy to Clipboard Toggle word wrap
  2. oc new-app コマンドを使用してサービスを作成します。

    $ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
    Copy to Clipboard Toggle word wrap
  3. サービスが作成されたことを確認するには、以下のコマンドを実行します。

    $ oc get svc -n <project_name>
    Copy to Clipboard Toggle word wrap

    出力例

    NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    nodejs-ex   ClusterIP   172.30.197.157   <none>        8080/TCP   70s
    Copy to Clipboard Toggle word wrap

    注記

    デフォルトで、新規サービスには外部 IP アドレスがありません。

7.2.3.4. ルートの作成によるサービスの公開

oc expose コマンドを使用して、サービスをルートとして公開することができます。

前提条件

  • OpenShift Container Platform にログインしている。

手順

  1. 公開するサービスが置かれているプロジェクトにログインします。

    $ oc project <project_name>
    Copy to Clipboard Toggle word wrap
  2. oc expose service コマンドを実行して、ルートを公開します。

    $ oc expose service nodejs-ex
    Copy to Clipboard Toggle word wrap

    出力例

    route.route.openshift.io/nodejs-ex exposed
    Copy to Clipboard Toggle word wrap

  3. サービスが公開されていることを確認するには、curl などのツールを使用して、クラスター外からサービスにアクセスできることを確認します。

    1. ルートのホスト名を見つけるには、次のコマンドを入力します。

      $ oc get route
      Copy to Clipboard Toggle word wrap

      出力例

      NAME        HOST/PORT                        PATH   SERVICES    PORT       TERMINATION   WILDCARD
      nodejs-ex   nodejs-ex-myproject.example.com         nodejs-ex   8080-tcp                 None
      Copy to Clipboard Toggle word wrap

    2. ホストが GET 要求に応答することを確認するには、次のコマンドを入力します。

      curl コマンドの例

      $ curl --head nodejs-ex-myproject.example.com
      Copy to Clipboard Toggle word wrap

      出力例

      HTTP/1.1 200 OK
      ...
      Copy to Clipboard Toggle word wrap

7.2.3.5. OpenShift Container Platform での Ingress シャーディング

OpenShift Container Platform では、Ingress Controller はすべてのルートを提供することも、ルートのサブセットを提供することもできます。デフォルトでは、Ingress Controller は、クラスター内の任意の namespace で作成されたすべてのルートを提供します。別の Ingress Controller をクラスターに追加して、選択した特性に基づくルートのサブセットである シャード を作成することにより、ルーティングを最適化できます。ルートをシャードのメンバーとしてマークするには、ルートまたは namespace の メタデータ フィールドでラベルを使用します。Ingress Controller は、選択式 とも呼ばれる セレクター を使用して、ルートのプール全体からルートのサブセットを選択し、サービスを提供します。

Ingress シャーディングは、受信トラフィックを複数の Ingress Controller 間で負荷分散する場合に、トラフィックを分離して特定の Ingress Controller にルーティングする場合、または次のセクションで説明する他のさまざまな理由で役立ちます。

デフォルトでは、各ルートはクラスターのデフォルトドメインを使用します。ただし、代わりにルーターのドメインを使用するようにルートを設定できます。

7.2.3.6. Ingress Controller のシャーディング

Ingress シャーディング (ルーターシャーディングとも呼ばれます) を使用して、ルート、namespace、またはその両方にラベルを追加することで、一連のルートを複数のルーターに分散できます。Ingress Controller は、対応する一連のセレクターを使用して、指定されたラベルが含まれるルートのみを許可します。各 Ingress シャードは、特定の選択式を使用してフィルタリングされたルートで構成されます。

トラフィックがクラスターに送信される主要なメカニズムとして、Ingress Controller への要求が大きくなる可能性があります。クラスター管理者は、以下を実行するためにルートをシャード化できます。

  • Ingress Controller またはルーターを複数のルートに分散し、変更に対する応答を高速化する。
  • 特定のルートに、他のルートとは異なる信頼性保証を割り当てる。
  • 特定の Ingress Controller に異なるポリシーを定義することを許可します。
  • 特定のルートのみが追加機能を使用することを許可します。
  • たとえば、異なるアドレスで異なるルートを公開し、内部ユーザーおよび外部ユーザーが異なるルートを認識できるようにします。
  • Blue-Green デプロイ時に、あるバージョンのアプリケーションから別のバージョンにトラフィックを転送する。

Ingress Controller がシャーディングされると、特定のルートがグループ内の 0 個以上の Ingress Controller に受け入れられます。ルートのステータスから、Ingress Controller がルートを許可したかどうかがわかります。Ingress Controller は、ルートがシャードに固有のものである場合にのみルートを許可します。

シャーディングを使用すると、ルートのサブセットを複数の Ingress Controller に分散できます。ルートのサブセットは、重複なし (従来 のシャーディング) にすることも、重複あり (オーバーラップ シャーディング) にすることもできます。

次の表に、3 つのシャーディング方法の概要を示します。

Expand
シャーディング方法説明

namespace セレクター

Ingress Controller に namespace セレクターを追加すると、namespace セレクターに一致するラベルを持つ namespace 内のすべてのルートが Ingress シャードに追加されます。namespace 内に作成されたすべてのルートを Ingress Controller で提供する場合は、この方法を検討してください。

ルートセレクター

Ingress Controller にルートセレクターを追加すると、ルートセレクターに一致するラベルを持つすべてのルートが Ingress シャードに追加されます。ルートのサブセットのみ、または namespace 内の特定のルートのみを Ingress Controller で提供する場合は、この方法を検討してください。

namespace およびルートセレクター

namespace セレクターとルートセレクター両方の方法で Ingress Controller のスコープを指定します。namespace セレクターとルートセレクター両方の方法の柔軟性が必要な場合は、この方法を検討してください。

7.2.3.6.1. 従来のシャーディングの例

キー値が financeops に設定されたラベルセレクター spec.namespaceSelector.matchExpressions を持つ、設定済みの Ingress Controller finops-router の例:

finops-router の YAML 定義の例

apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
  name: finops-router
  namespace: openshift-ingress-operator
spec:
  namespaceSelector:
    matchExpressions:
    - key: name
      operator: In
      values:
      - finance
      - ops
Copy to Clipboard Toggle word wrap

キー値が dev に設定されたラベルセレクター spec.namespaceSelector.matchLabels.name を持つ、設定済みの Ingress Controller dev-router の例:

dev-router の YAML 定義の例

apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
  name: dev-router
  namespace: openshift-ingress-operator
spec:
  namespaceSelector:
    matchLabels:
      name: dev
Copy to Clipboard Toggle word wrap

すべてのアプリケーションルートが、それぞれ name:financename:opsname:dev などのラベルが付けられた別々の namespace にある場合は、設定によって 2 つの Ingress Controller 間でルートが効果的に分散されます。コンソール、認証、およびその他の目的の OpenShift Container Platform ルートは処理しないでください。

前のシナリオでは、シャーディングは重複するサブセットを持たないパーティション設定の特別なケースとなります。ルートは複数のルーターシャード間で分割されます。

警告

デフォルト の Ingress Controller は、namespaceSelector または routeSelector フィールドに除外対象のルートが含まれていない限り、引き続きすべてのルートを提供します。デフォルトの Ingress Controller からルートを除外する方法の詳細は、この Red Hat ナレッジベースのソリューション と「デフォルトの Ingress Controller のシャーディング」のセクションを参照してください。

7.2.3.6.2. 重複シャーディングの例

キー値が devops に設定されたラベルセレクター spec.namespaceSelector.matchExpressions を持つ、設定済みの Ingress Controller devops-router の例:

devops-router の YAML 定義の例

apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
  name: devops-router
  namespace: openshift-ingress-operator
spec:
  namespaceSelector:
    matchExpressions:
    - key: name
      operator: In
      values:
      - dev
      - ops
Copy to Clipboard Toggle word wrap

name:dev および name:ops という 名前の namespace のルートは、2 つの異なる Ingress Controller によって処理されるようになりました。この設定では、ルートのサブセットが重複しています。

重複するルートのサブセットを使用すると、より複雑なルーティングルールを作成できます。たとえば、優先度の低いトラフィックを devops-router に送信しながら、優先度の高いトラフィックを専用の finops-router に迂回させることができます。

7.2.3.6.3. デフォルトの Ingress Controller のシャーディング

新しい Ingress シャードを作成した後に、デフォルトの Ingress Controller と、新しい Ingress シャードの両方により許可されるルートが存在する場合があります。これは、デフォルトの Ingress Controller にセレクターがなく、デフォルトですべてのルートを許可するためです。

namespace セレクターまたはルートセレクターを使用して、Ingress Controller が特定のラベルが割り当てられたルートの処理を制限できます。次の手順では、namespace セレクターを使用して、デフォルトの Ingress Controller が新しく分割された financeops、および dev ルートにサービスを提供しないように制限します。これにより、Ingress シャードがさらに分離されます。

重要

OpenShift Container Platform のすべての管理ルートを同じ Ingress Controller で保持する必要があります。したがって、これらの重要なルートを除外するセレクターをデフォルトの Ingress Controller に追加することは避けてください。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • プロジェクト管理者としてログインしている。

手順

  1. 次のコマンドを実行して、デフォルトの Ingress Controller を変更します。

    $ oc edit ingresscontroller -n openshift-ingress-operator default
    Copy to Clipboard Toggle word wrap
  2. Ingress Controller を編集して、financeops、および dev ラベルのいずれかを持つルートを除外する namespaceSelector を含めます。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: default
      namespace: openshift-ingress-operator
    spec:
      namespaceSelector:
        matchExpressions:
          - key: name
            operator: NotIn
            values:
              - finance
              - ops
              - dev
    Copy to Clipboard Toggle word wrap

デフォルトの Ingress Controller では、name:financename:ops、および name:dev という名前の namespace が提供されなくなります。

7.2.3.6.4. Ingress シャーディングと DNS

クラスター管理者は、プロジェクト内のルーターごとに個別の DNS エントリーを作成します。ルーターは不明なルートを別のルーターに転送することはありません。

以下の例を考慮してください。

  • Router A はホスト 192.168.0.5 にあり、*.foo.com のルートを持つ。
  • Router B はホスト 192.168.1.9 にあり、*.example.com のルートを持つ。

個別の DNS エントリーは、*.foo.com をルーター A をホストするノードに解決し、*.example.com をルーター B をホストするノードに解決する必要があります。

  • *.foo.com A IN 192.168.0.5
  • *.example.com A IN 192.168.1.9
7.2.3.6.5. ルートラベルを使用した Ingress Controller のシャーディングの設定

ルートラベルを使用した Ingress Controller のシャーディングとは、Ingress Controller がルートセレクターによって選択される任意 namespace の任意のルートを提供することを意味します。

図7.1 ルートラベルを使用した Ingress シャーディング

Ingress Controller のシャーディングは、一連の Ingress Controller 間で着信トラフィックの負荷を分散し、トラフィックを特定の Ingress Controller に分離する際に役立ちます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。

手順

  1. router-internal.yaml ファイルを編集します。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: sharded
      namespace: openshift-ingress-operator
    spec:
      domain: <apps-sharded.basedomain.example.net> 
    1
    
      nodePlacement:
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/worker: ""
      routeSelector:
        matchLabels:
          type: sharded
    Copy to Clipboard Toggle word wrap
    1
    Ingress Controller が使用するドメインを指定します。このドメインは、デフォルトの Ingress Controller ドメインとは異なる必要があります。
  2. Ingress Controller の router-internal.yaml ファイルを適用します。

    # oc apply -f router-internal.yaml
    Copy to Clipboard Toggle word wrap

    Ingress Controller は、type: sharded というラベルのある namespace のルートを選択します。

  3. router-internal.yaml で設定されたドメインを使用して新しいルートを作成します。

    $ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
    Copy to Clipboard Toggle word wrap
7.2.3.6.6. namespace ラベルを使用した Ingress Controller のシャーディングの設定

namespace ラベルを使用した Ingress Controller のシャーディングとは、Ingress Controller が namespace セレクターによって選択される任意の namespace の任意のルートを提供することを意味します。

図7.2 namespace ラベルを使用した Ingress シャーディング

Ingress Controller のシャーディングは、一連の Ingress Controller 間で着信トラフィックの負荷を分散し、トラフィックを特定の Ingress Controller に分離する際に役立ちます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。

手順

  1. router-internal.yaml ファイルを編集します。

    $ cat router-internal.yaml
    Copy to Clipboard Toggle word wrap

    出力例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: sharded
      namespace: openshift-ingress-operator
    spec:
      domain: <apps-sharded.basedomain.example.net> 
    1
    
      nodePlacement:
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/worker: ""
      namespaceSelector:
        matchLabels:
          type: sharded
    Copy to Clipboard Toggle word wrap

    1
    Ingress Controller が使用するドメインを指定します。このドメインは、デフォルトの Ingress Controller ドメインとは異なる必要があります。
  2. Ingress Controller の router-internal.yaml ファイルを適用します。

    $ oc apply -f router-internal.yaml
    Copy to Clipboard Toggle word wrap

    Ingress Controller は、type: sharded というラベルのある namespace セレクターによって選択される namespace のルートを選択します。

  3. router-internal.yaml で設定されたドメインを使用して新しいルートを作成します。

    $ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
    Copy to Clipboard Toggle word wrap
7.2.3.6.7. Ingress Controller シャーディングのルート作成

ルートを使用すると、URL でアプリケーションをホストできます。この場合、ホスト名は設定されず、ルートは代わりにサブドメインを使用します。サブドメインを指定すると、ルートを公開する Ingress Controller のドメインが自動的に使用されます。ルートが複数の Ingress Controller によって公開されている状況では、ルートは複数の URL でホストされます。

以下の手順では、例として hello-openshift アプリケーションを使用して、Ingress Controller シャーディングのルートを作成する方法を説明します。

Ingress Controller のシャーディングは、一連の Ingress Controller 間で着信トラフィックの負荷を分散し、トラフィックを特定の Ingress Controller に分離する際に役立ちます。たとえば、Company A のトラフィックをある Ingress Controller に指定し、Company B を別の Ingress Controller に指定できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • プロジェクト管理者としてログインしている。
  • ポートを公開する Web アプリケーションと、そのポート上のトラフィックをリッスンする HTTP または TLS エンドポイントがある。
  • シャーディング用に Ingress Controller を設定している。

手順

  1. 次のコマンドを実行して、hello-openshift というプロジェクトを作成します。

    $ oc new-project hello-openshift
    Copy to Clipboard Toggle word wrap
  2. 以下のコマンドを実行してプロジェクトに Pod を作成します。

    $ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json
    Copy to Clipboard Toggle word wrap
  3. 以下のコマンドを実行して、hello-openshift というサービスを作成します。

    $ oc expose pod/hello-openshift
    Copy to Clipboard Toggle word wrap
  4. hello-openshift-route.yaml というルート定義を作成します。

    シャーディング用に作成したルートの YAML 定義

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      labels:
        type: sharded 
    1
    
      name: hello-openshift-edge
      namespace: hello-openshift
    spec:
      subdomain: hello-openshift 
    2
    
      tls:
        termination: edge
      to:
        kind: Service
        name: hello-openshift
    Copy to Clipboard Toggle word wrap

    1
    ラベルキーとそれに対応するラベル値の両方が、Ingress Controller で指定されたものと一致する必要があります。この例では、Ingress Controller にはラベルキーと値 type: sharded があります。
    2
    ルートは、subdomain フィールドの値を使用して公開されます。subdomain フィールドを指定するときは、ホスト名を未設定のままにしておく必要があります。host フィールドと subdomain フィールドの両方を指定すると、ルートは host フィールドの値を使用し、subdomain フィールドを無視します。
  5. 次のコマンドを実行し、hello-openshift-route.yaml を使用して hello-openshift アプリケーションへのルートを作成します。

    $ oc -n hello-openshift create -f hello-openshift-route.yaml
    Copy to Clipboard Toggle word wrap

検証

  • 次のコマンドを使用して、ルートのステータスを取得します。

    $ oc -n hello-openshift get routes/hello-openshift-edge -o yaml
    Copy to Clipboard Toggle word wrap

    結果の Route リソースは次のようになります。

    出力例

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      labels:
        type: sharded
      name: hello-openshift-edge
      namespace: hello-openshift
    spec:
      subdomain: hello-openshift
      tls:
        termination: edge
      to:
        kind: Service
        name: hello-openshift
    status:
      ingress:
      - host: hello-openshift.<apps-sharded.basedomain.example.net> 
    1
    
        routerCanonicalHostname: router-sharded.<apps-sharded.basedomain.example.net> 
    2
    
        routerName: sharded 
    3
    Copy to Clipboard Toggle word wrap

    1
    Ingress Controller またはルーターがルートを公開するために使用するホスト名。host フィールドの値は、Ingress Controller によって自動的に決定され、そのドメインを使用します。この例では、Ingress Controller のドメインは <apps-sharded.basedomain.example.net> です。
    2
    Ingress Controller のホスト名。
    3
    Ingress Controller の名前。この例では、Ingress Controller の名前は sharded です。
関連情報

7.2.4. Ingress Controller エンドポイント公開戦略の設定

endpointPublishingStrategy は Ingress Controller エンドポイントを他のネットワークに公開し、ロードバランサーの統合を有効にし、他のシステムへのアクセスを提供するために使用されます。

重要

Red Hat OpenStack Platform (RHOSP) では、クラウドプロバイダーがヘルスモニターを作成するように設定されている場合にのみ、LoadBalancerService エンドポイントの公開ストラテジーがサポートされます。RHOSP 16.2 の場合、このストラテジーは Amphora Octavia プロバイダーを使用する場合にのみ可能です。

詳細は、RHOSP インストールドキュメントの「RHOSP Cloud Controller Manager オプションの設定」セクションを参照してください。

7.2.4.1. Ingress Controller エンドポイントの公開ストラテジー

NodePortService エンドポイントの公開ストラテジー

NodePortService エンドポイント公開ストラテジーは、Kubernetes NodePort サービスを使用して Ingress Controller を公開します。

この設定では、Ingress Controller のデプロイメントはコンテナーのネットワークを使用します。NodePortService はデプロイメントを公開するために作成されます。特定のノードポートは OpenShift Container Platform によって動的に割り当てられますが、静的ポートの割り当てをサポートするために、管理対象の NodePortService のノードポートフィールドへの変更が保持されます。

図7.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:80httpsPort:443statsPort:1936hostNetwork フィールドがあります。ネットワークに異なるバインディングポートを指定することで、HostNetwork ストラテジーに対して、同じノードに複数の Ingress Controller をデプロイできます。

apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
  name: internal
  namespace: openshift-ingress-operator
spec:
  domain: example.com
  endpointPublishingStrategy:
    type: HostNetwork
    hostNetwork:
      httpPort: 80
      httpsPort: 443
      statsPort: 1936
Copy to Clipboard Toggle word wrap

7.2.4.1.1. Ingress Controller エンドポイント公開スコープの内部への設定

クラスター管理者がクラスターをプライベートに指定せずに新しいクラスターをインストールすると、scopeExternal に設定されたデフォルトの 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"}}}}'
    Copy to Clipboard Toggle word wrap
  • Ingress Controller のステータスを確認するには、次のコマンドを入力します。

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    Copy to Clipboard Toggle word wrap
    • ステータス状態が Progressing の場合は、さらにアクションを実行する必要があるかどうかを示します。たとえば、ステータスの状態によっては、次のコマンドを入力して、サービスを削除する必要があることを示している可能性があります。

      $ oc -n openshift-ingress delete services/router-default
      Copy to Clipboard Toggle word wrap

      サービスを削除すると、Ingress Operator はサービスを Internal として再作成します。

7.2.4.1.2. Ingress Controller エンドポイント公開スコープの外部への設定

クラスター管理者がクラスターをプライベートに指定せずに新しいクラスターをインストールすると、scopeExternal に設定されたデフォルトの 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"}}}}'
    Copy to Clipboard Toggle word wrap
  • Ingress Controller のステータスを確認するには、次のコマンドを入力します。

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    Copy to Clipboard Toggle word wrap
    • ステータス状態が Progressing の場合は、さらにアクションを実行する必要があるかどうかを示します。たとえば、ステータスの状態によっては、次のコマンドを入力して、サービスを削除する必要があることを示している可能性があります。

      $ oc -n openshift-ingress delete services/router-default
      Copy to Clipboard Toggle word wrap

      サービスを削除すると、Ingress Operator はサービスを External として再作成します。

7.2.4.1.3. Ingress Controller への単一の NodePort サービスの追加

各プロジェクトに NodePort タイプの Service を作成する代わりに、NodePortService エンドポイント公開ストラテジーを使用するカスタム Ingress Controller を作成できます。Ingress シャーディングを介して、すでに HostNetwork Ingress Controller が存在する可能性のあるノードにルートのセットを適用する場合は、ポートの競合を防ぐために、このような Ingress Controller の設定を検討してください。

各プロジェクトに NodePort タイプの Service を設定する前に、次の考慮事項を確認してください。

  • Nodeport Ingress Controller ドメインのワイルドカード DNS レコードを作成する必要があります。Nodeport Ingress Controller ルートには、ワーカーノードのアドレスからアクセスできます。ルートに必要な DNS レコードの詳細は、「user-provisioned DNS 要件」を参照してください。
  • サービス用のルートを公開し、カスタム Ingress Controller ドメインの --hostname 引数を指定する必要があります。
  • アプリケーション Pod にアクセスできるようにするには、NodePort タイプの Service に割り当てられているポートをルートに追加する必要があります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • ワイルドカード DNS レコードが作成されている。

手順

  1. Ingress Controller のカスタムリソース (CR) ファイルを作成します。

    IngressController オブジェクトの情報を定義する CR ファイルの例

    apiVersion: v1
    items:
    - apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: <custom_ic_name> 
    1
    
        namespace: openshift-ingress-operator
      spec:
        replicas: 1
        domain: <custom_ic_domain_name> 
    2
    
        nodePlacement:
          nodeSelector:
            matchLabels:
              <key>: <value> 
    3
    
        namespaceSelector:
         matchLabels:
           <key>: <value> 
    4
    
        endpointPublishingStrategy:
          type: NodePortService
    # ...
    Copy to Clipboard Toggle word wrap

    1
    IngressController CR のカスタムの name を指定します。
    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 です。
  2. oc label node コマンドを使用してノードにラベルを追加します。

    $ oc label node <node_name> <key>=<value> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <value> は、IngressController CR の nodePlacement セクションで指定したキーと値のペアと同じである必要があります。
  3. IngressController オブジェクトを作成します。

    $ oc create -f <ingress_controller_cr>.yaml
    Copy to Clipboard Toggle word wrap
  4. IngressController CR 用に作成されたサービスのポートを確認します。

    $ oc get svc -n openshift-ingress
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap

  5. 新しいプロジェクトを作成するために、次のコマンドを入力します。

    $ oc new-project <project_name>
    Copy to Clipboard Toggle word wrap
  6. 新しい namespace にラベルを付けるために、次のコマンドを入力します。

    $ oc label namespace <project_name> <key>=<value> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <key>=<value> は、Ingress Controller CR の namespaceSelector セクションの値と同じである必要があります。
  7. クラスター内に新しいアプリケーションを作成します。

    $ oc new-app --image=<image_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <image_name> の例は、quay.io/openshifttest/hello-openshift:multiarch です。
  8. サービスの Route オブジェクトを作成して、Pod がサービスを使用してアプリケーションをクラスターの外部に公開できるようにします。

    $ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name> 
    1
    Copy to Clipboard Toggle word wrap
    注記

    --hostname 引数で、カスタム Ingress Controller のドメイン名を指定する必要があります。これを行わない場合、Ingress Operator がデフォルトの Ingress Controller を使用してクラスターのすべてのルートを提供します。

  9. ルートのステータスが Admitted であり、カスタム Ingress Controller のメタデータがルートに含まれていることを確認します。

    $ oc get route/hello-openshift -o json | jq '.status.ingress'
    Copy to Clipboard Toggle word wrap

    出力例

    # ...
    {
      "conditions": [
        {
          "lastTransitionTime": "2024-05-17T18:25:41Z",
          "status": "True",
          "type": "Admitted"
        }
      ],
      [
        {
          "host": "hello-openshift.nodeportsvc.ipi-cluster.example.com",
          "routerCanonicalHostname": "router-nodeportsvc.nodeportsvc.ipi-cluster.example.com",
          "routerName": "nodeportsvc", "wildcardPolicy": "None"
        }
      ],
    }
    Copy to Clipboard Toggle word wrap

  10. デフォルトの IngressController CR を更新して、デフォルトの Ingress Controller が NodePort タイプの Service を管理しないようにします。他のすべてのクラスタートラフィックは、引き続きデフォルトの Ingress Controller によって監視します。

    $ oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
    Copy to Clipboard Toggle word wrap

検証

  1. 次のコマンドを入力して、DNS エントリーがクラスターの内外にルーティングできることを確認します。このコマンドでは、上記の手順で oc label node コマンドを実行してラベルを追加したノードの IP アドレスが出力されます。

    $ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
    Copy to Clipboard Toggle word wrap
  2. クラスターが DNS 解決に外部 DNS サーバーの IP アドレスを使用していることを確認するために、次のコマンドを入力してクラスターの接続を確認します。

    $ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port> 
    1
    Copy to Clipboard Toggle word wrap
    1 1
    <port> は、NodePort タイプの Service のノードポートです。oc get svc -n openshift-ingress コマンドの出力例の 80:32432/TCP HTTP ルートから、32432 がノードポートであることがわかります。

    出力例

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

7.2.5. ロードバランサーを使用した Ingress クラスターの設定

OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法では、ロードバランサーを使用します。

7.2.5.1. ロードバランサーを使用したトラフィックのクラスターへの送信

特定の外部 IP アドレスを必要としない場合、ロードバランサーサービスを OpenShift Container Platform クラスターへの外部アクセスを許可するよう設定することができます。

ロードバランサーサービスは固有の IP を割り当てます。ロードバランサーには単一の edge ルーター IP があります (これは仮想 IP (VIP) の場合もありますが、初期の負荷分散では単一マシンになります。

注記

プールが設定される場合、これはクラスター管理者によってではなく、インフラストラクチャーレベルで実行されます。

注記

このセクションの手順では、クラスターの管理者が事前に行っておく必要のある前提条件があります。

7.2.5.2. 前提条件

以下の手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達できるように、クラスターネットワーク環境に対して外部ポートをセットアップします。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    $ oc adm policy add-cluster-role-to-user cluster-admin username
    Copy to Clipboard Toggle word wrap
  • OpenShift Container Platform クラスターを、1 つ以上のマスターと 1 つ以上のノード、およびクラスターへのネットワークアクセスのあるクラスター外のシステムと共に用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

7.2.5.3. プロジェクトおよびサービスの作成

公開するプロジェクトとサービスが存在しない場合は、プロジェクトを作成してからサービスを作成します。

プロジェクトとサービスがすでに存在する場合は、サービスを公開してルートを作成する手順に進みます。

前提条件

  • OpenShift CLI (oc) をインストールし、クラスター管理者としてログインしている。

手順

  1. oc new-project コマンドを実行して、サービス用の新しいプロジェクトを作成します。

    $ oc new-project <project_name>
    Copy to Clipboard Toggle word wrap
  2. oc new-app コマンドを使用してサービスを作成します。

    $ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
    Copy to Clipboard Toggle word wrap
  3. サービスが作成されたことを確認するには、以下のコマンドを実行します。

    $ oc get svc -n <project_name>
    Copy to Clipboard Toggle word wrap

    出力例

    NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    nodejs-ex   ClusterIP   172.30.197.157   <none>        8080/TCP   70s
    Copy to Clipboard Toggle word wrap

    注記

    デフォルトで、新規サービスには外部 IP アドレスがありません。

7.2.5.4. ルートの作成によるサービスの公開

oc expose コマンドを使用して、サービスをルートとして公開することができます。

前提条件

  • OpenShift Container Platform にログインしている。

手順

  1. 公開するサービスが置かれているプロジェクトにログインします。

    $ oc project <project_name>
    Copy to Clipboard Toggle word wrap
  2. oc expose service コマンドを実行して、ルートを公開します。

    $ oc expose service nodejs-ex
    Copy to Clipboard Toggle word wrap

    出力例

    route.route.openshift.io/nodejs-ex exposed
    Copy to Clipboard Toggle word wrap

  3. サービスが公開されていることを確認するには、curl などのツールを使用して、クラスター外からサービスにアクセスできることを確認します。

    1. ルートのホスト名を見つけるには、次のコマンドを入力します。

      $ oc get route
      Copy to Clipboard Toggle word wrap

      出力例

      NAME        HOST/PORT                        PATH   SERVICES    PORT       TERMINATION   WILDCARD
      nodejs-ex   nodejs-ex-myproject.example.com         nodejs-ex   8080-tcp                 None
      Copy to Clipboard Toggle word wrap

    2. ホストが GET 要求に応答することを確認するには、次のコマンドを入力します。

      curl コマンドの例

      $ curl --head nodejs-ex-myproject.example.com
      Copy to Clipboard Toggle word wrap

      出力例

      HTTP/1.1 200 OK
      ...
      Copy to Clipboard Toggle word wrap

7.2.5.5. ロードバランサーサービスの作成

以下の手順を使用して、ロードバランサーサービスを作成します。

前提条件

  • 公開するプロジェクトとサービスがあること。
  • クラウドプロバイダーがロードバランサーをサポートしている。

手順

ロードバランサーサービスを作成するには、以下を実行します。

  1. OpenShift Container Platform にログインします。
  2. 公開するサービスが置かれているプロジェクトを読み込みます。

    $ oc project project1
    Copy to Clipboard Toggle word wrap
  3. コントロールプレーンノードでテキストファイルを開き、以下のテキストを貼り付け、必要に応じてファイルを編集します。

    ロードバランサー設定ファイルのサンプル

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-2 
    1
    
    spec:
      ports:
      - name: db
        port: 3306 
    2
    
      loadBalancerIP:
      loadBalancerSourceRanges: 
    3
    
      - 10.0.0.0/8
      - 192.168.0.0/16
      type: LoadBalancer 
    4
    
      selector:
        name: mysql 
    5
    Copy to Clipboard Toggle word wrap

    1
    ロードバランサーサービスの説明となる名前を入力します。
    2
    公開するサービスがリッスンしている同じポートを入力します。
    3
    特定の IP アドレスのリストを入力して、ロードバランサー経由でトラフィックを制限します。クラウドプロバイダーがこの機能に対応していない場合、このフィールドは無視されます。
    4
    タイプに Loadbalancer を入力します。
    5
    サービスの名前を入力します。
    注記

    ロードバランサーを通過するトラフィックを特定の IP アドレスに制限するには、Ingress Controller フィールド spec.endpointPublishingStrategy.loadBalancer.allowedSourceRanges を使用することを推奨します。loadBalancerSourceRanges フィールドを設定しないでください。

  4. ファイルを保存し、終了します。
  5. 以下のコマンドを実行してサービスを作成します。

    $ oc create -f <file-name>
    Copy to Clipboard Toggle word wrap

    以下に例を示します。

    $ oc create -f mysql-lb.yaml
    Copy to Clipboard Toggle word wrap
  6. 以下のコマンドを実行して新規サービスを表示します。

    $ oc get svc
    Copy to Clipboard Toggle word wrap

    出力例

    NAME       TYPE           CLUSTER-IP      EXTERNAL-IP                             PORT(S)          AGE
    egress-2   LoadBalancer   172.30.22.226   ad42f5d8b303045-487804948.example.com   3306:30357/TCP   15m
    Copy to Clipboard Toggle word wrap

    有効にされたクラウドプロバイダーがある場合、サービスには外部 IP アドレスが自動的に割り当てられます。

  7. マスターで cURL などのツールを使用し、パブリック IP アドレスを使用してサービスに到達できることを確認します。

    $ curl <public-ip>:<port>
    Copy to Clipboard Toggle word wrap

    以下に例を示します。

    $ curl 172.29.121.74:3306
    Copy to Clipboard Toggle word wrap

    このセクションの例では、クライアントアプリケーションを必要とする MySQL サービスを使用しています。Got packets out of order のメッセージと共に文字ストリングを取得する場合は、このサービスに接続していることになります。

    MySQL クライアントがある場合は、標準 CLI コマンドでログインします。

    $ mysql -h 172.30.131.89 -u admin -p
    Copy to Clipboard Toggle word wrap

    出力例

    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    
    MySQL [(none)]>
    Copy to Clipboard Toggle word wrap

7.2.6. AWS での Ingress クラスタートラフィックの設定

OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法では、AWS のロードバランサー、具体的には Network Load Balancer (NLB) またはク Classic Load Balancer (CLB) を使用します。どちらのタイプのロードバランサーもクライアントの IP アドレスをノードに転送できますが、CLB にはプロキシープロトコルのサポートが必要です。これは OpenShift Container Platform によって自動的に有効になります。

NLB を使用するように Ingress Controller を設定するには、次の 2 つの方法があります。

  1. 現在 CLB を使用している Ingress Controller を強制的に置き換える。これにより、IngressController オブジェクトが削除され、新しい DNS レコードが伝達され、NLB がプロビジョニングされている間、停止が発生します。
  2. CLB を使用する既存の Ingress Controller を編集して、NLB を使用する。これにより、IngressController オブジェクトを削除して再作成することなく、ロードバランサーが変更されます。

どちらの方法も、NLB から CLB への切り替えに使用できます。

これらのロードバランサーは、新規または既存の AWS クラスターで設定できます。

7.2.6.1. AWS での Classic Load Balancer タイムアウトの設定

OpenShift Container Platform は、特定のルートまたは Ingress Controller のカスタムタイムアウト期間を設定するためのメソッドを提供します。さらに、AWS Classic Load Balancer (CLB) には独自のタイムアウト期間があり、デフォルトは 60 秒です。

CLB のタイムアウト期間がルートタイムアウトまたは Ingress Controller タイムアウトよりも短い場合、ロードバランサーは接続を途中で終了する可能性があります。ルートと CLB の両方のタイムアウト期間を増やすことで、この問題を防ぐことができます。

7.2.6.1.1. ルートのタイムアウトの設定

Service Level Availability (SLA) で必要とされる、低タイムアウトが必要なサービスや、バックエンドでの処理速度が遅いケースで高タイムアウトが必要なサービスがある場合は、既存のルートに対してデフォルトのタイムアウトを設定することができます。

重要

OpenShift Container Platform クラスターの前にユーザー管理の外部ロードバランサーを設定した場合は、ユーザー管理の外部ロードバランサーのタイムアウト値がルートのタイムアウト値よりも高いことを確認してください。この設定により、クラスターが使用するネットワーク上でのネットワーク輻輳の問題を防ぐことができます。

前提条件

  • 実行中のクラスターでデプロイ済みの Ingress Controller が必要になります。

手順

  1. oc annotate コマンドを使用して、ルートにタイムアウトを追加します。

    $ oc annotate route <route_name> \
        --overwrite haproxy.router.openshift.io/timeout=<timeout><time_unit> 
    1
    Copy to Clipboard Toggle word wrap
    1
    サポートされる時間単位は、マイクロ秒 (us)、ミリ秒 (ms)、秒 (s)、分 (m)、時間 (h)、または日 (d) です。

    以下の例では、2 秒のタイムアウトを myroute という名前のルートに設定します。

    $ oc annotate route myroute --overwrite haproxy.router.openshift.io/timeout=2s
    Copy to Clipboard Toggle word wrap
7.2.6.1.2. Classic Load Balancer タイムアウトの設定

Classic Load Balancer (CLB) のデフォルトのタイムアウトを設定して、アイドル接続を延長できます。

前提条件

  • 実行中のクラスターにデプロイ済みの Ingress Controller がある。

手順

  1. 次のコマンドを実行して、デフォルト ingresscontroller の AWS 接続アイドルタイムアウトを 5 分に設定します。

    $ oc -n openshift-ingress-operator patch ingresscontroller/default \
        --type=merge --patch='{"spec":{"endpointPublishingStrategy": \
        {"type":"LoadBalancerService", "loadBalancer": \
        {"scope":"External", "providerParameters":{"type":"AWS", "aws": \
        {"type":"Classic", "classicLoadBalancer": \
        {"connectionIdleTimeout":"5m"}}}}}}}'
    Copy to Clipboard Toggle word wrap
  2. オプション: 次のコマンドを実行して、タイムアウトのデフォルト値を復元します。

    $ oc -n openshift-ingress-operator patch ingresscontroller/default \
        --type=merge --patch='{"spec":{"endpointPublishingStrategy": \
        {"loadBalancer":{"providerParameters":{"aws":{"classicLoadBalancer": \
        {"connectionIdleTimeout":null}}}}}}}'
    Copy to Clipboard Toggle word wrap
注記

現在のスコープがすでに設定されている場合を除き、接続タイムアウト値を変更するには scope フィールドを指定する必要があります。デフォルトのタイムアウト値に戻す場合は、scope フィールドを設定する際に再度設定する必要はありません。

OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。そのような方法の 1 つでは、Network Load Balancer (NLB) を使用します。NLB を新規または既存の AWS クラスターに設定することができます。

7.2.6.2.1. Ingress Controller を Classic Load Balancer から Network Load Balancer に切り替える

Classic Load Balancer (CLB) を使用している Ingress Controller を、AWS の Network Load Balancer (NLB) を使用する Ingress Controller に切り替えることができます。

これらのロードバランサーを切り替えても、IngressController オブジェクトは削除されません。

警告

この手順により、次の問題が発生する可能性があります。

  • 新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間続く可能性のある停止。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。
  • サービスのアノテーションの変更により、ロードバランサーリソースがリークする。

手順

  1. NLB を使用して切り替える既存の Ingress Controller を変更します。この例では、デフォルトの Ingress Controller に External スコープがあり、他のカスタマイズがないことを前提としています。

    ingresscontroller.yaml ファイルの例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      creationTimestamp: null
      name: default
      namespace: openshift-ingress-operator
    spec:
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
          providerParameters:
            type: AWS
            aws:
              type: NLB
        type: LoadBalancerService
    Copy to Clipboard Toggle word wrap

    注記

    spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.type フィールドの値を指定しない場合、Ingress Controller は、インストール時に設定されたクラスター Ingress 設定の spec.loadBalancer.platform.aws.type 値を使用します。

    ヒント

    Ingress Controller に、ドメインの変更など、更新したい他のカスタマイズがある場合は、代わりに Ingress Controller 定義ファイルを強制的に置き換えることを検討してください。

  2. 次のコマンドを実行して、Ingress Controller YAML ファイルに変更を適用します。

    $ oc apply -f ingresscontroller.yaml
    Copy to Clipboard Toggle word wrap

    Ingress Controller の更新中は、数分間の停止が予想されます。

7.2.6.2.2. Network Load Balancer の使用から Classic Load Balancer への Ingress Controller の切り替え

Network Load Balancer (NLB) を使用している Ingress Controller を、AWS の Classic Load Balancer (CLB) を使用する Ingress Controller に切り替えることができます。

これらのロードバランサーを切り替えても、IngressController オブジェクトは削除されません。

警告

この手順により、新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間続く停止が発生する可能性があります。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。

手順

  1. CLB を使用して切り替える既存の Ingress Controller を変更します。この例では、デフォルトの Ingress Controller に External スコープがあり、他のカスタマイズがないことを前提としています。

    ingresscontroller.yaml ファイルの例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      creationTimestamp: null
      name: default
      namespace: openshift-ingress-operator
    spec:
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
          providerParameters:
            type: AWS
            aws:
              type: Classic
        type: LoadBalancerService
    Copy to Clipboard Toggle word wrap

    注記

    spec.endpointPublishingStrategy.loadBalancer.providerParameters.aws.type フィールドの値を指定しない場合、Ingress Controller は、インストール時に設定されたクラスター Ingress 設定の spec.loadBalancer.platform.aws.type 値を使用します。

    ヒント

    Ingress Controller に、ドメインの変更など、更新したい他のカスタマイズがある場合は、代わりに Ingress Controller 定義ファイルを強制的に置き換えることを検討してください。

  2. 次のコマンドを実行して、Ingress Controller YAML ファイルに変更を適用します。

    $ oc apply -f ingresscontroller.yaml
    Copy to Clipboard Toggle word wrap

    Ingress Controller の更新中は、数分間の停止が予想されます。

7.2.6.2.3. Ingress Controller Classic Load Balancer の Network Load Balancer への置き換え

Classic Load Balancer (CLB) を使用している Ingress Controller は、AWS の Network Load Balancer (NLB) を使用している Ingress Controller に置き換えることができます。

警告

この手順により、次の問題が発生する可能性があります。

  • 新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間続く可能性のある停止。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。
  • サービスのアノテーションの変更により、ロードバランサーリソースがリークする。

手順

  1. 新しいデフォルトの Ingress Controller を含むファイルを作成します。以下の例では、デフォルトの Ingress Controller の範囲が External で、その他のカスタマイズをしていないことを想定しています。

    ingresscontroller.yml ファイルの例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      creationTimestamp: null
      name: default
      namespace: openshift-ingress-operator
    spec:
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
          providerParameters:
            type: AWS
            aws:
              type: NLB
        type: LoadBalancerService
    Copy to Clipboard Toggle word wrap

    デフォルトの Ingress Controller が他にカスタマイズされている場合には、それに応じてファイルを修正してください。

    ヒント

    Ingress Controller に他のカスタマイズがなく、ロードバランサータイプのみを更新する場合は、「Ingress Controller を Classic Load Balancer から Network Load Balancer に切り替える」に記載の手順に従ってください。

  2. Ingress Controller の YAML ファイルを強制的に置き換えます。

    $ oc replace --force --wait -f ingresscontroller.yml
    Copy to Clipboard Toggle word wrap

    Ingress Controller の置き換えが完了するまでお待ちください。数分間の停止が予想されます。

7.2.6.2.4. 既存 AWS クラスターでの Ingress Controller ネットワークロードバランサーの設定

AWS Network Load Balancer (NLB) がサポートする Ingress Controller を既存のクラスターに作成できます。

前提条件

  • AWS クラスターがインストールされている。
  • インフラストラクチャーリソースの PlatformStatus は AWS である必要があります。

    • PlatformStatus が AWS であることを確認するには、以下を実行します。

      $ oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.type}'
      AWS
      Copy to Clipboard Toggle word wrap

手順

既存のクラスターの AWS NLB がサポートする Ingress Controller を作成します。

  1. Ingress Controller のマニフェストを作成します。

     $ cat ingresscontroller-aws-nlb.yaml
    Copy to Clipboard Toggle word wrap

    出力例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: $my_ingress_controller
    1
    
      namespace: openshift-ingress-operator
    spec:
      domain: $my_unique_ingress_domain
    2
    
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: External
    3
    
          providerParameters:
            type: AWS
            aws:
              type: NLB
    Copy to Clipboard Toggle word wrap

    1
    $my_ingress_controller を Ingress Controller の一意の名前に置き換えます。
    2
    $my_unique_ingress_domain を、クラスター内のすべての Ingress Controller 間で一意のドメイン名に置き換えます。この変数は、DNS 名 <clustername>.<domain> のサブドメインである必要があります。
    3
    External を内部 NLB を使用するために Internal に置き換えることができます。
  2. クラスターにリソースを作成します。

    $ oc create -f ingresscontroller-aws-nlb.yaml
    Copy to Clipboard Toggle word wrap
重要

新規 AWS クラスターで Ingress Controller NLB を設定する前に、インストール設定ファイルの作成 手順を完了する必要があります。

7.2.6.2.5. 新規 AWS クラスターでの Ingress Controller ネットワークロードバランサーの設定

新規クラスターに AWS Network Load Balancer (NLB) がサポートする Ingress Controller を作成できます。

前提条件

  • install-config.yaml ファイルを作成し、これに対する変更を完了します。

手順

新規クラスターの AWS NLB がサポートする Ingress Controller を作成します。

  1. インストールプログラムが含まれるディレクトリーに切り替え、マニフェストを作成します。

    $ ./openshift-install create manifests --dir <installation_directory> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <installation_directory> については、クラスターの install-config.yaml ファイルが含まれるディレクトリーの名前を指定します。
  2. cluster-ingress-default-ingresscontroller.yaml という名前のファイルを <installation_directory>/manifests/ ディレクトリーに作成します。

    $ touch <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    <installation_directory> については、クラスターの manifests/ ディレクトリーが含まれるディレクトリー名を指定します。

    ファイルの作成後は、以下のようにいくつかのネットワーク設定ファイルが manifests/ ディレクトリーに置かれます。

    $ ls <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
    Copy to Clipboard Toggle word wrap

    出力例

    cluster-ingress-default-ingresscontroller.yaml
    Copy to Clipboard Toggle word wrap

  3. エディターで cluster-ingress-default-ingresscontroller.yaml ファイルを開き、必要な Operator 設定を記述するカスタムリソース (CR) を入力します。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      creationTimestamp: null
      name: default
      namespace: openshift-ingress-operator
    spec:
      endpointPublishingStrategy:
        loadBalancer:
          scope: External
          providerParameters:
            type: AWS
            aws:
              type: NLB
        type: LoadBalancerService
    Copy to Clipboard Toggle word wrap
  4. cluster-ingress-default-ingresscontroller.yaml ファイルを保存し、テキストエディターを終了します。
  5. オプション: manifests/cluster-ingress-default-ingresscontroller.yaml ファイルをバックアップします。インストールプログラムは、クラスターの作成時に manifests/ ディレクトリーを削除します。
7.2.6.2.6. LoadBalancerService Ingress Controller の作成時にサブネットを選択する

既存クラスター内の Ingress Controller のロードバランサーサブネットを手動で指定できます。デフォルトでは、ロードバランサーのサブネットは AWS によって自動的に検出されます。しかし、Ingress Controller でサブネットを指定すると、これがオーバーライドされ、手動で制御できるようになります。

前提条件

  • AWS クラスターがインストールされている。
  • IngressController をマッピングするサブネットの名前または ID がわかっている。

手順

  1. カスタムリソース (CR) ファイルを作成します。

    次の内容の YAML ファイル (例: sample-ingress.yaml) を作成します。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: <name>
    spec:
      domain: <domain>
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: External
      dnsManagementPolicy: Managed
    Copy to Clipboard Toggle word wrap
  2. カスタムリソース (CR) ファイルを作成します。

    YAML ファイルにサブネットを追加します。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name:  <name> 
    1
    
      namespace: openshift-ingress-operator
    spec:
      domain: <domain> 
    2
    
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: External
          providerParameters:
            type: AWS
            aws:
              type: Classic
              classicLoadBalancer: 
    3
    
                subnets:
                  ids: 
    4
    
                  - <subnet> 
    5
    
                  - <subnet>
                  - <subnet>
    dnsManagementPolicy: Managed
    Copy to Clipboard Toggle word wrap
    1
    <name> は、IngressController の名前に置き換えます。
    2
    <domain> は、IngressController によって提供される DNS 名に置き換えます。
    3
    NLB を使用する場合は、networkLoadBalancer フィールドを使用することもできます。
    4
    必要に応じて、ID でサブネットを指定する代わりに、names フィールドを使用して名前でサブネットを指定することもできます。
    5
    サブネット ID (names を使用する場合は名前) を指定します。
    重要

    アベイラビリティーゾーンごとに最大 1 つのサブネットを指定できます。外部 Ingress Controller にはパブリックサブネットだけを指定し、内部 Ingress Controller にはプライベートサブネットだけを指定してください。

  3. CR ファイルを適用します。

    1. ファイルを保存し、OpenShift CLI (oc) を使用して適用します。

      $  oc apply -f sample-ingress.yaml
      Copy to Clipboard Toggle word wrap
    2. IngressController の状態を確認して、ロードバランサーが正常にプロビジョニングされたことを確認します。

      $ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
      Copy to Clipboard Toggle word wrap
7.2.6.2.7. 既存の Ingress Controller のサブネットを更新する

OpenShift Container Platform で手動で指定したロードバランサーサブネットを使用して IngressController を更新することで、システム停止を回避し、サービスの安定性を維持し、ネットワーク設定を特定の要件に準拠させることができます。次の手順では、新しいサブネットを選択して適用し、設定の変更を検証し、ロードバランサーのプロビジョニングが成功したことを確認する方法を示します。

警告

この手順により、新しい DNS レコードの伝播、新しいロードバランサーのプロビジョニング、およびその他の要因により、数分間の停止が発生する可能性があります。この手順を適用すると、Ingress Controller ロードバランサーの IP アドレスや正規名が変更になる場合があります。

手順

手動で指定したロードバランサーサブネットを使用して IngressController を更新するには、次の手順に従います。

  1. 既存の IngressController を変更して、新しいサブネットに更新します。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name:  <name> 
    1
    
      namespace: openshift-ingress-operator
    spec:
      domain: <domain> 
    2
    
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: External
          providerParameters:
            type: AWS
            aws:
              type: Classic 
    3
    
              classicLoadBalancer: 
    4
    
                subnets:
                  ids: 
    5
    
                  - <updated_subnet> 
    6
    
                  - <updated_subnet>
                  - <updated_subnet>
    Copy to Clipboard Toggle word wrap
    1
    <name> は、IngressController の名前に置き換えます。
    2
    <domain> は、IngressController によって提供される DNS 名に置き換えます。
    3
    新しいサブネット ID (names を使用する場合は名前) を指定します。
    4
    NLB を使用する場合は、networkLoadBalancer フィールドを使用することもできます。
    5
    必要に応じて、ID でサブネットを指定する代わりに、names フィールドを使用して名前でサブネットを指定することもできます。
    6
    サブネット ID (names を使用する場合は名前) を更新します。
    重要

    アベイラビリティーゾーンごとに最大 1 つのサブネットを指定できます。外部 Ingress Controller にはパブリックサブネットだけを指定し、内部 Ingress Controller にはプライベートサブネットだけを指定してください。

  2. 次のコマンドを実行して、IngressControllerProgressing 状態を調べ、サブネットの更新を適用する方法について確認します。

    $ oc get ingresscontroller -n openshift-ingress-operator subnets -o jsonpath="{.status.conditions[?(@.type==\"Progressing\")]}" | yq -PC
    Copy to Clipboard Toggle word wrap

    出力例

    lastTransitionTime: "2024-11-25T20:19:31Z"
    message: 'One or more status conditions indicate progressing: LoadBalancerProgressing=True (OperandsProgressing: One or more managed resources are progressing: The IngressController subnets were changed from [...] to [...].  To effectuate this change, you must delete the service: `oc -n openshift-ingress delete svc/router-<name>`; the service load-balancer will then be deprovisioned and a new one created. This will most likely cause the new load-balancer to have a different host name and IP address and cause disruption. To return to the previous state, you can revert the change to the IngressController: [...]'
    reason: IngressControllerProgressing
    status: "True"
    type: Progressing
    Copy to Clipboard Toggle word wrap

  3. 更新を適用するために、次のコマンドを実行して、Ingress Controller に関連付けられているサービスを削除します。
$ oc -n openshift-ingress delete svc/router-<name>
Copy to Clipboard Toggle word wrap

検証

  • ロードバランサーが正常にプロビジョニングされたことを確認するには、次のコマンドを実行して IngressController の状態を確認します。

    $ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
    Copy to Clipboard Toggle word wrap
7.2.6.2.8. Network Load Balancer (NLB) の AWS Elastic IP (EIP) アドレスの設定

Ingress Controller の Network Load Balancer ー (NLB) に静的 IP (別名 Elastic IP) を指定できます。これは、クラスターネットワークに適切なファイアウォールルールを設定する場合に便利です。

前提条件

  • AWS クラスターがインストールされている。
  • IngressController をマッピングするサブネットの名前または ID がわかっている。

手順

  1. 以下の内容を含む YAML ファイルを作成します。

    sample-ingress.yaml

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: <name> 
    1
    
    spec:
      domain: <domain> 
    2
    
      endpointPublishingStrategy:
        loadBalancer:
          scope: External 
    3
    
          type: LoadBalancerService
          providerParameters:
            type: AWS
            aws:
              type: NLB
              networkLoadBalancer:
                subnets: 
    4
    
                  ids:
                  - <subnet_ID>
                  names:
                  - <subnet_A>
                  - <subnet_B>
                eipAllocations: 
    5
    
                - <eipalloc_A>
                - <eipalloc_B>
                - <eipalloc_C>
    Copy to Clipboard Toggle word wrap

    1
    <name> プレースホルダーを Ingress Controller の名前に置き換えます。
    2
    <domain> プレースホルダーを、Ingress Controller によって提供される DNS 名に置き換えます。
    3
    EIP を割り当てるには、スコープを値 External に設定し、インターネットに接続している必要があります。
    4
    サブネットの ID と名前を指定します。ID と名前の合計数は、割り当てられた EIP と同じである必要があります。
    5
    EIP アドレスを指定します。
    重要

    アベイラビリティーゾーンごとに最大 1 つのサブネットを指定できます。外部 Ingress Controller にはパブリックサブネットのみを提供します。サブネットごとに 1 つの EIP アドレスを関連付けることができます。

  2. 次のコマンドを入力して、CR ファイルの保存と適用を実行します。

    $  oc apply -f sample-ingress.yaml
    Copy to Clipboard Toggle word wrap

検証

  1. ロードバランサーが正常にプロビジョニングされたことを確認するために、次のコマンドを実行して IngressController の状態を確認します。

    $ oc get ingresscontroller -n openshift-ingress-operator <name> -o jsonpath="{.status.conditions}" | yq -PC
    Copy to Clipboard Toggle word wrap

7.2.7. サービスの外部 IP を使用した Ingress クラスタートラフィックの設定

MetalLB 実装または IP フェイルオーバーデプロイメントのいずれかを使用して、ExternalIP リソースをサービスに接続し、OpenShift Container Platform クラスター外部のトラフィックでそのサービスを利用できるようにすることができます。この方法で外部 IP アドレスをホストすることは、ベアメタルハードウェアにインストールされたクラスターにのみ適用されます。

トラフィックをサービスにルーティングするには、外部ネットワークインフラストラクチャーを正しく設定する必要があります。

7.2.7.1. 前提条件

  • クラスターが ExternalIP が有効にされた状態で設定されている。詳細は、サービスの ExternalIP の設定 を参照してください。

    注記

    Egress IP に同じ ExternalIP を使用しないでください。

7.2.7.2. ExternalIP のサービスへの割り当て

サービスに ExternalIP リソースを割り当てることができます。リソースをサービスに自動的に割り当てるようにクラスターを設定した場合は、ExternalIP をサービスに手動でアタッチする必要がない場合があります。

この手順の例では、IP フェイルオーバー設定を持つクラスター内のサービスに ExternalIP リソースを手動で割り当てるシナリオを使用します。

手順

  1. CLI で次のコマンドを実行して、ExternalIP リソースの互換性のある IP アドレス範囲を確認します。

    $ oc get networks.config cluster -o jsonpath='{.spec.externalIP}{"\n"}'
    Copy to Clipboard Toggle word wrap
    注記

    autoAssignCIDRs が設定されていて、ExternalIP リソースの spec.externalIPs の値を指定していないと、OpenShift Container Platform は新しい Service オブジェクトに ExternalIP を自動的に割り当てます。

  2. サービスに ExternalIP リソースを割り当てるには、次のいずれかのオプションを選択します。

    1. 新しいサービスを作成する場合は、spec.externalIPs フィールドに値を指定し、allowedCIDRs パラメーターに 1 つ以上の有効な IP アドレスの配列を指定します。

      ExternalIP リソースをサポートするサービス YAML 設定ファイルの例

      apiVersion: v1
      kind: Service
      metadata:
        name: svc-with-externalip
      spec:
        externalIPs:
          policy:
            allowedCIDRs:
            - 192.168.123.0/28
      Copy to Clipboard Toggle word wrap

    2. ExternalIP を既存のサービスに割り当てる場合は、以下のコマンドを入力します。<name> をサービス名に置き換えます。<ip_address> を有効な ExternalIP アドレスに置き換えます。コンマで区切られた複数の IP アドレスを指定できます。

      $ oc patch svc <name> -p \
        '{
          "spec": {
            "externalIPs": [ "<ip_address>" ]
          }
        }'
      Copy to Clipboard Toggle word wrap

      以下に例を示します。

      $ oc patch svc mysql-55-rhel7 -p '{"spec":{"externalIPs":["192.174.120.10"]}}'
      Copy to Clipboard Toggle word wrap

      出力例

      "mysql-55-rhel7" patched
      Copy to Clipboard Toggle word wrap

  3. ExternalIP アドレスがサービスに割り当てられていることを確認するには、以下のコマンドを入力します。新規サービスに ExternalIP を指定した場合、まずサービスを作成する必要があります。

    $ oc get svc
    Copy to Clipboard Toggle word wrap

    出力例

    NAME               CLUSTER-IP      EXTERNAL-IP     PORT(S)    AGE
    mysql-55-rhel7     172.30.131.89   192.174.120.10  3306/TCP   13m
    Copy to Clipboard Toggle word wrap

7.2.8. NodePort を使用した Ingress クラスタートラフィックの設定

OpenShift Container Platform は、クラスター内で実行されるサービスを使用してクラスター外からの通信を可能にする方法を提供します。この方法は NodePort を使用します。

7.2.8.1. NodePort を使用したトラフィックのクラスターへの送信

NodePort-type Service リソースを使用して、クラスター内のすべてのノードの特定のポートでサービスを公開します。ポートは Service リソースの .spec.ports[*].nodePort フィールドで指定されます。

重要

ノードポートを使用するには、追加のポートリソースが必要です。

NodePort は、ノードの IP アドレスの静的ポートでサービスを公開します。NodePort はデフォルトで 30000 から 32767 の範囲に置かれます。つまり、NodePort はサービスの意図されるポートに一致しないことが予想されます。たとえば、ポート 8080 はノードのポート 31020 として公開できます。

管理者は、外部 IP アドレスがノードにルーティングされることを確認する必要があります。

NodePort および外部 IP は独立しており、両方を同時に使用できます。

注記

このセクションの手順では、クラスターの管理者が事前に行っておく必要のある前提条件があります。

7.2.8.2. 前提条件

以下の手順を開始する前に、管理者は以下の条件を満たしていることを確認する必要があります。

  • 要求がクラスターに到達できるように、クラスターネットワーク環境に対して外部ポートをセットアップします。
  • クラスター管理者ロールを持つユーザーが 1 名以上いることを確認します。このロールをユーザーに追加するには、以下のコマンドを実行します。

    $ oc adm policy add-cluster-role-to-user cluster-admin <user_name>
    Copy to Clipboard Toggle word wrap
  • OpenShift Container Platform クラスターを、1 つ以上のマスターと 1 つ以上のノード、およびクラスターへのネットワークアクセスのあるクラスター外のシステムと共に用意します。この手順では、外部システムがクラスターと同じサブセットにあることを前提とします。別のサブセットの外部システムに必要な追加のネットワーク設定については、このトピックでは扱いません。

7.2.8.3. プロジェクトおよびサービスの作成

公開するプロジェクトとサービスが存在しない場合は、プロジェクトを作成してからサービスを作成します。

プロジェクトとサービスがすでに存在する場合は、サービスを公開してルートを作成する手順に進みます。

前提条件

  • OpenShift CLI (oc) をインストールし、クラスター管理者としてログインしている。

手順

  1. oc new-project コマンドを実行して、サービス用の新しいプロジェクトを作成します。

    $ oc new-project <project_name>
    Copy to Clipboard Toggle word wrap
  2. oc new-app コマンドを使用してサービスを作成します。

    $ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
    Copy to Clipboard Toggle word wrap
  3. サービスが作成されたことを確認するには、以下のコマンドを実行します。

    $ oc get svc -n <project_name>
    Copy to Clipboard Toggle word wrap

    出力例

    NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    nodejs-ex   ClusterIP   172.30.197.157   <none>        8080/TCP   70s
    Copy to Clipboard Toggle word wrap

    注記

    デフォルトで、新規サービスには外部 IP アドレスがありません。

7.2.8.4. ルートの作成によるサービスの公開

oc expose コマンドを使用して、サービスをルートとして公開することができます。

前提条件

  • OpenShift Container Platform にログインしている。

手順

  1. 公開するサービスが置かれているプロジェクトにログインします。

    $ oc project <project_name>
    Copy to Clipboard Toggle word wrap
  2. アプリケーションのノードポートを公開するには、次のコマンドを入力して、サービスのカスタムリソース定義 (CRD) を変更します。

    $ oc edit svc <service_name>
    Copy to Clipboard Toggle word wrap

    出力例

    spec:
      ports:
      - name: 8443-tcp
        nodePort: 30327 
    1
    
        port: 8443
        protocol: TCP
        targetPort: 8443
      sessionAffinity: None
      type: NodePort 
    2
    Copy to Clipboard Toggle word wrap

    1
    オプション: アプリケーションのノードポート範囲を指定します。デフォルトでは、OpenShift Container Platform は 30000-32767 範囲で使用可能なポートを選択します。
    2
    サービスタイプを定義します。
  3. オプション: サービスが公開されるノードポートで利用可能なことを確認するには、以下のコマンドを入力します。

    $ oc get svc -n myproject
    Copy to Clipboard Toggle word wrap

    出力例

    NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    nodejs-ex           ClusterIP   172.30.217.127   <none>        3306/TCP         9m44s
    nodejs-ex-ingress   NodePort    172.30.107.72    <none>        3306:31345/TCP   39s
    Copy to Clipboard Toggle word wrap

  4. オプション: oc new-app コマンドによって自動的に作成されたサービスを削除するには、以下のコマンドを入力します。

    $ oc delete svc nodejs-ex
    Copy to Clipboard Toggle word wrap

検証

  • サービスノードポートが 30000 ~ 32767 の範囲のポートで更新されていることを確認するには、次のコマンドを入力します。

    $ oc get svc
    Copy to Clipboard Toggle word wrap

    次の出力例では、更新されたポートは 30327 です。

    出力例

    NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    httpd   NodePort   172.xx.xx.xx    <none>        8443:30327/TCP   109s
    Copy to Clipboard Toggle word wrap

IngressController の IP アドレス範囲の一覧を指定できます。endpointPublishingStrategyLoadBalancerService の場合、これにより、ロードバランサーサービスへのアクセスが制限されます。

7.2.9.1. ロードバランサーの許可されるソース範囲の設定

spec.endpointPublishingStrategy.loadBalancer.allowedSourceRanges フィールドを有効にして設定できます。ロードバランサーの許可されるソース範囲を設定することで、Ingress Controller のロードバランサーへのアクセスを、指定した IP アドレス範囲のリストに制限できます。Ingress Operator はロードバランサー Service を調整し、AllowedSourceRanges に基づいて spec.loadBalancerSourceRanges フィールドを設定します。

注記

以前のバージョンの OpenShift Container Platform で spec.loadBalancerSourceRanges フィールドまたはロードバランサーサービスアノテーション service.beta.kubernetes.io/load-balancer-source-ranges をすでに設定している場合、Ingress Controller はアップグレード後に Progressing=True のレポートを開始します。.これを修正するには、spec.loadBalancerSourceRanges フィールドを上書きし、service.beta.kubernetes.io/load-balancer-source-ranges アノテーションをクリアする AllowedSourceRanges を設定します。Ingress Controller は、再び Progressing=False の報告を開始します。

前提条件

  • 実行中のクラスターにデプロイされた Ingress Controller があります。

手順

  • 次のコマンドを実行して、Ingress Controller の許可されるソース範囲 API を設定します。

    $ oc -n openshift-ingress-operator patch ingresscontroller/default \
        --type=merge --patch='{"spec":{"endpointPublishingStrategy": \
        {"type":"LoadBalancerService", "loadbalancer": \
        {"scope":"External", "allowedSourceRanges":["0.0.0.0/0"]}}}}' 
    1
    Copy to Clipboard Toggle word wrap
    1
    例の値 0.0.0.0/0 は、許可されるソース範囲を指定します。

7.2.9.2. ロードバランサーの許可されたソース範囲への移行

注釈 service.beta.kubernetes.io/load-balancer-source-ranges をすでに設定している場合は、ロードバランサーの許可されたソース範囲に移行できます。AllowedSourceRanges を設定すると、Ingress Controller は AllowedSourceRanges 値に基づいて spec.loadBalancerSourceRanges フィールドを設定し、service.beta.kubernetes.io/load-balancer-source-ranges アノテーションを設定解除します。

注記

以前のバージョンの OpenShift Container Platform で spec.loadBalancerSourceRanges フィールドまたはロードバランサーサービスアノテーション service.beta.kubernetes.io/load-balancer-source-ranges をすでに設定している場合、Ingress Controller はアップグレード後に Progressing=True のレポートを開始します。.これを修正するには、spec.loadBalancerSourceRanges フィールドを上書きし、service.beta.kubernetes.io/load-balancer-source-ranges アノテーションをクリアする AllowedSourceRanges を設定します。Ingress Controller は再び Progressing=False の報告を開始します。

前提条件

  • service.beta.kubernetes.io/load-balancer-source-ranges アノテーションを設定しました。

手順

  1. service.beta.kubernetes.io/load-balancer-source-ranges が設定されていることを確認します。

    $ oc get svc router-default -n openshift-ingress -o yaml
    Copy to Clipboard Toggle word wrap

    出力例

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/load-balancer-source-ranges: 192.168.0.1/32
    Copy to Clipboard Toggle word wrap

  2. spec.loadBalancerSourceRanges フィールドが設定されていないことを確認します。

    $ oc get svc router-default -n openshift-ingress -o yaml
    Copy to Clipboard Toggle word wrap

    出力例

    ...
    spec:
      loadBalancerSourceRanges:
      - 0.0.0.0/0
    ...
    Copy to Clipboard Toggle word wrap

  3. クラスターを OpenShift Container Platform 4.19 に更新します。
  4. 次のコマンドを実行して、ingresscontroller の許可されるソース範囲 API を設定します。

    $ oc -n openshift-ingress-operator patch ingresscontroller/default \
        --type=merge --patch='{"spec":{"endpointPublishingStrategy": \
        {"loadBalancer":{"allowedSourceRanges":["0.0.0.0/0"]}}}}' 
    1
    Copy to Clipboard Toggle word wrap
    1
    例の値 0.0.0.0/0 は、許可されるソース範囲を指定します。

7.2.10. 既存の Ingress オブジェクトのパッチ適用

オブジェクトを再作成したり、オブジェクトへのサービスを中断したりすることなく、以下の既存の Ingress オブジェクトフィールドを更新または変更できます。

  • Specifications
  • Host
  • Path
  • Backend services
  • SSL/TLS settings
  • アノテーション

7.2.10.1. Ingress オブジェクトのパッチ適用による ingressWithoutClassName アラートの解決

ingressClassName フィールドは、IngressClass オブジェクトの名前を指定します。各 Ingress オブジェクトの ingressClassName フィールドを定義する必要があります。

Ingress オブジェクトの ingressClassName フィールドを定義していない場合は、ルーティングの問題が発生する可能性があります。24 時間後、ingressWithoutClassName アラートが届き、ingressClassName フィールドを設定するように通知されます。

手順

適切なルーティングと機能性を確保するために、完了した ingressClassName フィールドを使用して Ingress オブジェクトにパッチを適用します。

  1. すべての IngressClass オブジェクトをリスト表示します。

    $ oc get ingressclass
    Copy to Clipboard Toggle word wrap
  2. 全 namespace 内の Ingress オブジェクトをすべてリスト表示します。

    $ oc get ingress -A
    Copy to Clipboard Toggle word wrap
  3. Ingress オブジェクトにパッチを適用します。

    $ oc patch ingress/<ingress_name> --type=merge --patch '{"spec":{"ingressClassName":"openshift-default"}}'
    Copy to Clipboard Toggle word wrap

    <ingress_name>Ingress オブジェクトの名前に置き換えます。このコマンドは、Ingress オブジェクトにパッチを適用して、目的の Ingress クラス名を含めます。

7.2.11. 特定のサブネットへのロードバランサーの割り当て

ロードバランサーを割り当てることで、アプリケーショントラフィックを効率的に管理できます。ネットワーク管理者は、ロードバランサーを割り当ててデプロイメントをカスタマイズし、最適なトラフィック分散、アプリケーションの高可用性、中断のないサービス、ネットワークのセグメンテーションを確保できます。

7.2.11.1. AWS 上の特定のサブネットに API および Ingress ロードバランサーを割り当てる

install-config.yaml ファイルの platform.aws.vpc.subnets セクションにおいて、Virtual Private Cloud (VPC) のサブネットを明示的に定義し、それらに特定のロールを直接を割り当てることで、AWS 上の OpenShift ロードバランサー (Ingress Controller 用を含む) のネットワーク配置を制御できます。この方法では、Ingress Controller やその他のクラスターコンポーネントなどのリソースに使用するサブネットを詳細に制御できます。

API および Ingress ロードバランサーを特定のサブネットに割り当てるには、次の手順を実行します。

前提条件

始める前に、以下を用意してください。

  • 既存の AWS Virtual Private Cloud (VPC)。
  • OpenShift クラスターで使用するために事前設定された AWS サブネット。次の点に注意してください。

    • サブネット ID のリストがある (例: subnet-0123456789abcdef0)。これらの ID は install-config.yaml ファイルで使用されます。
    • ロードバランサーやコントロールプレーンなどのその他の重要なコンポーネントの高可用性を確保するために、少なくとも 2 つのアベイラビリティーゾーン (AZ) にまたがるサブネットを使用している。
    • これらのサブネット内には、割り当てられたすべてのロールに対して使用可能な IP アドレスが十分にある。
    • ネットワーク ACL やセキュリティーグループを含むこれらのサブネットの AWS 設定では、割り当てられたすべてのロールに必要なトラフィックを許可する必要がある。Ingress Controller をホストするサブネットの場合、これには通常、必要なソースからの TCP ポート 80 と 443 が含まれます。
  • ターゲットの OpenShift バージョン用の OpenShift インストーラーバイナリー。
  • install-config.yaml ファイル。

手順

  1. install-config.yaml ファイルを準備します。

    まだ準備していない場合は、OpenShift インストーラーを使用してインストール設定ファイルを生成します。

    $ openshift-install create install-config --dir=<your_installation_directory>
    Copy to Clipboard Toggle word wrap

    このコマンドは、指定されたディレクトリーに install-config.yaml ファイルを作成します。

  2. サブネットを定義し、ロールを割り当てます。

    テキストエディターを使用して、<your_installation_directory> にある install-config.yaml ファイルを開きます。VPC サブネットと指定されたロールは、platform.aws.vpc.subnets フィールドで定義します。

    クラスターが使用する予定の AWS サブネットごとに、その idroles のリストを指定するエントリーを作成します。各ロールは、type キーを持つオブジェクトです。デフォルトの Ingress Controller のサブネットを指定するには、type: IngressControllerLB のロールを割り当てます。

    apiVersion: v1
    baseDomain: example.com 
    1
    
    metadata:
      name: my-cluster # Example cluster name
    platform:
      aws:
        region: us-east-1 
    2
    
        vpc: 
    3
    
          subnets: 
    4
    
          - id: subnet-0fcf8e0392f0910d5 # Public Subnet in AZ us-east-1a 
    5
    
            roles:
            - type: IngressControllerLB 
    6
    
            - type: BootstrapNode
          - id: subnet-0xxxxxxxxxxxxxxza # Public Subnet in another AZ for HA
            roles:
            - type: IngressControllerLB
          - id: subnet-0fcf8e0392f0910d4 # Private Subnet in AZ us-east-1a
            roles:
            - type: ClusterNode 
    7
    
          - id: subnet-0yyyyyyyyyyyyyyzb # Private Subnet in another AZ for HA
            roles:
            - type: ClusterNode
          # Add other subnet IDs and their roles as needed for your cluster architecture
    pullSecret: '...' 
    8
    
    sshKey: '...' 
    9
    Copy to Clipboard Toggle word wrap
    1
    使用中のベースドメイン。
    2
    使用中の AWS リージョン。
    3
    platform.aws の下の vpc オブジェクトには、サブネットリストが含まれます。
    4
    OpenShift が使用するすべてのサブネットオブジェクトのリスト。各オブジェクトは、サブネット ID とそのロールを定義します。
    5
    AWS サブネット ID に置き換えます。
    6
    type: IngressControllerLB ロールは、このサブネットをデフォルトの Ingress Controller の LoadBalancer 用に明示的に指定します。プライベート/内部クラスターでは、IngressControllerLB ロールを持つサブネットはプライベートである必要があります。
    7
    type: ClusterNode ロールは、コントロールプレーンとコンピュートノード用にこのサブネットを指定します。これらは通常、プライベートサブネットです。
    8
    使用中のプルシークレット。
    9
    使用中の SSH キー。

    subnets リスト内のコントロールプレーンロードバランサーのエントリーも同様のパターンに従います。

    # ... (within platform.aws.vpc.subnets list)
          - id: subnet-0fcf8e0392f0910d6 # Public Subnet for External API LB
            roles:
            - type: ControlPlaneExternalLB
          - id: subnet-0fcf8e0392f0910d7 # Private Subnet for Internal API LB
            roles:
            - type: ControlPlaneInternalLB
    # ...
    Copy to Clipboard Toggle word wrap

    デフォルトのパブリック Ingress Controller の場合、install-config.yaml ファイルで IngressControllerLB ロールが割り当てられているサブネットは、すべてパブリックサブネットである必要があります。たとえば、送信トラフィックをインターネットゲートウェイ (IGW) に誘導するルートテーブルエントリーが AWS 内に存在している必要があります。

    AZ 全体の必要なすべてのサブネット (パブリックとプライベート) をリストし、クラスターアーキテクチャーに応じて適切なロールを割り当てます。

    サブネット ID は既存の VPC 内のサブネットを定義し、オプションでその目的のロールを指定できます。どのサブネットにもロールが指定されていない場合は、サブネットのロールが自動的に決定されます。この場合、VPC には kubernetes.io/cluster/<cluster-id> タグのない他の非クラスターサブネットを含めることはできません。

    サブネットにロールを指定する場合、各サブネットに少なくとも 1 つのロールが割り当てられている必要があり、ClusterNodeBootstrapNodeIngressControllerLBControlPlaneExternalLB、および ControlPlaneInternalLB のロールが少なくとも 1 つのサブネットに割り当てられている必要があります。ただし、クラスタースコープが内部の場合、ControlPlaneExternalLB は必要ありません。

  3. クラスターのインストールを続行します。

    install-config.yaml ファイルへの変更を保存したら、クラスターを作成します。

    $ openshift-install create cluster --dir=<your_installation_directory>
    Copy to Clipboard Toggle word wrap

    インストールプログラムは、install-config.yaml ファイルの platform.aws.vpc.subnets セクションのサブネット定義と明示的なロール割り当てを使用して、IngressControllerLB ロールで指定したサブネットに Ingress Controller の LoadBalancer を配置するなど、クラスターリソースをプロビジョニングするようになりました。

注記

IngressControllerLBClusterNodeControlPlaneExternalLBControlPlaneInternalLBBootstrapNode などのタイプを指定するなど、platform.aws.vpc.subnets 内のロール割り当てメカニズムは、OpenShift インストーラーがさまざまなクラスターサービスとコンポーネントに適したサブネットを識別する包括的な方法です。

7.2.12. 手動 DNS 管理のための Ingress Controller の設定

クラスター管理者として Ingress Controller を作成すると、Operator は DNS レコードを自動的に管理します。必要な DNS ゾーンがクラスター DNS ゾーンと異なる場合、または DNS ゾーンがクラウドプロバイダーの外部でホストされている場合、これにはいくつかの制限があります。

クラスター管理者は、Ingress Controller を設定して、自動 DNS 管理を停止し、手動 DNS 管理を開始することができます。dnsManagementPolicy を設定して、いつ自動または手動で管理するかを指定します。

Ingress Controller を Managed から Unmanaged DNS 管理ポリシーに変更すると、Operator はクラウドでプロビジョニングされた以前のワイルドカード DNS レコードをクリーンアップしません。Ingress Controller を Unmanaged から Managed DNS 管理ポリシーに変更すると、Operator は、クラウドプロバイダーに DNS レコードが存在しない場合は作成を試み、DNS レコードがすでに存在する場合は更新を試みます。

重要

dnsManagementPolicyunmanaged に設定すると、クラウドプロバイダーでワイルドカード DNS レコードのライフサイクルを手動で管理する必要があります。

7.2.12.1. Managed DNS 管理ポリシー

Ingress Controller の Managed DNS 管理ポリシーにより、クラウドプロバイダーのワイルドカード DNS レコードのライフサイクルが Operator によって自動的に管理されるようになります。

7.2.12.2. Unmanaged DNS 管理ポリシー

Ingress Controller の Unmanaged DNS 管理ポリシーにより、クラウドプロバイダーのワイルドカード DNS レコードのライフサイクルが自動的に管理されず、代わりにクラスター管理者の責任になります。

注記

AWS クラウドプラットフォームでは、Ingress Controller のドメインが dnsConfig.Spec.BaseDomain と一致しない場合、DNS 管理ポリシーは自動的に Unmanaged に設定されます。

7.2.12.3. Unmanaged DNS 管理ポリシーを使用したカスタム Ingress Controller の作成

クラスター管理者は、Unmanaged DNS 管理ポリシーを使用して、新しいカスタム Ingress Controller を作成できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

  1. 以下を含む sample-ingress.yaml という名前のカスタムリソース (CR) ファイルを作成します。

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      namespace: openshift-ingress-operator
      name: <name> 
    1
    
    spec:
      domain: <domain> 
    2
    
      endpointPublishingStrategy:
        type: LoadBalancerService
        loadBalancer:
          scope: External 
    3
    
          dnsManagementPolicy: Unmanaged 
    4
    Copy to Clipboard Toggle word wrap
    1
    IngressController オブジェクトの名前で <name> を指定します。
    2
    前提として作成した DNS レコードをもとに domain を指定します。
    3
    scopeExternal として指定して、ロードバランサーを外部に公開します。
    4
    dnsManagementPolicy は、Ingress Controller がロードバランサーに関連付けられたワイルドカード DNS レコードのライフサイクルを管理しているかどうかを示します。有効な値は Managed および Unmanaged です。デフォルト値は Managed です。
  2. 変更を適用するためにファイルを保存します。

    oc apply -f <name>.yaml 
    1
    Copy to Clipboard Toggle word wrap

7.2.12.4. 既存の Ingress Controller の変更

クラスター管理者は、既存の Ingress Controller を変更して、DNS レコードのライフサイクルを手動で管理できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

  1. 選択した IngressController を変更して dnsManagementPolicy を設定します。

    SCOPE=$(oc -n openshift-ingress-operator get ingresscontroller <name> -o=jsonpath="{.status.endpointPublishingStrategy.loadBalancer.scope}")
    
    oc -n openshift-ingress-operator patch ingresscontrollers/<name> --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"dnsManagementPolicy":"Unmanaged", "scope":"${SCOPE}"}}}}'
    Copy to Clipboard Toggle word wrap
  2. オプション: クラウドプロバイダーで関連付けられている DNS レコードを削除できます。

7.2.13. OpenShift Container Platform ネットワーキングにおける Gateway API

OpenShift Container Platform では、Ingress Operator で Gateway API を使用することにより、ネットワークトラフィックを設定するための追加の方法が提供されます。

重要

Gateway API はユーザー定義ネットワーク (UDN) をサポートしていません。

7.2.13.1. Gateway API の概要

Gateway API は、オープンソースのコミュニティー管理された Kubernetes ネットワークメカニズムです。これは、クラスターのトランスポートレイヤー (L4) とアプリケーションレイヤー (L7) 内のルーティングに重点を置いています。さまざまなベンダーが Gateway API の実装 を多数提供しています。

このプロジェクトは、幅広いコミュニティーのサポートを受けた移植可能な API を使用して、標準化されたエコシステムを提供するための取り組みです。Gateway API 機能を Ingress Operator に統合することで、既存のコミュニティーとアップストリーム開発の取り組みに沿ったネットワークソリューションが可能になります。

Gateway API は Ingress Operator の機能を拡張し、よりきめ細かいクラスタートラフィックとルーティング設定を処理します。これらの機能を使用すると、Gateway API のカスタムリソース定義 (CRD) のインスタンスを作成できます。OpenShift Container Platform クラスターの場合、Ingress Operator は次のリソースを作成します。

Gateway
このリソースでは、トラフィックをクラスター内のサービスに変換する方法について説明します。たとえば、特定のロードバランサー設定などです。
GatewayClass
このリソースは、共通の設定と動作を共有する Gateway オブジェクトのセットを定義します。たとえば、パブリックアプリケーションまたはプライベートアプリケーションに使用される Gateway リソースのセットを区別するために、2 つの個別の GatewayClass オブジェクトが作成される場合があります。
HTTPRoute
このリソースは、Gateway からサービスへの HTTP 要求のルーティング動作を指定し、HTTP 接続または終了した HTTPS 接続を多重化する場合に特に役立ちます。
GRPCRoute
このリソースは、gRPC リクエストのルーティング動作を指定します。
ReferenceGrant
このリソースは、namespace 間の参照を可能にします。たとえば、ルートが別の namespace にあるバックエンドにトラフィックを転送できるようになります。

OpenShift Container Platform では、Gateway API の実装は gateway.networking.k8s.io/v1 に基づいており、このバージョンのすべてのフィールドがサポートされています。

7.2.13.1.1. Gateway API の利点

Gateway API には次の利点があります。

  • 移植性: OpenShift Container Platform は Ingress のパフォーマンスを向上させるために HAProxy を使用しますが、Gateway API は特定の動作を提供するためにベンダー固有のアノテーションに依存することはありません。HAProxy と同等のパフォーマンスを得るには、Gateway オブジェクトを水平方向にスケーリングするか、関連するノードを垂直方向にスケーリングする必要があります。
  • 関心の分離: Gateway API は、そのリソースに対してロールベースのアプローチを採用しています。これにより、大規模な組織における責任分担やチーム体制と、よりうまく適合します。プラットフォームエンジニアは GatewayClass リソースに重点を置き、クラスター管理者は Gateway リソースの設定に重点を置き、アプリケーション開発者は HTTPRoute リソースを使用したサービスのルーティングに重点を置く可能性があります。
  • 拡張性: 追加機能は標準化された CRD として開発されます。
7.2.13.1.2. Gateway API の制限

Gateway API には次の制限があります。

  • バージョンの非互換性: Gateway API エコシステムは急速に変化しており、一部の実装は、その機能セットが異なるバージョンの Gateway API に基づいているため、他の実装と連携しません。
  • リソースのオーバーヘッド: より柔軟ではありますが、Gateway API は結果を達成するために複数のリソースタイプを使用します。小規模なアプリケーションの場合、従来の Ingress のシンプルさがより適している可能性があります。

7.2.13.2. OpenShift Container Platform の Gateway API 実装

Ingress Operator は、他のベンダー実装が OpenShift Container Platform クラスターで定義された CRD を利用できるように、Gateway API CRD のライフサイクルを管理します。

Gateway API が提供するフィールドの中に、特定のベンダーによる実装ではサポートされていないものが含まれる場合があります。しかしその場合でも、サポートされていないフィールドを除けば、その実装は残りのフィールドとスキーマレベルで互換性があります。これらの「デッドフィールド」により、Ingress ワークロードが中断され、アプリケーションとサービスが不適切にプロビジョニングされ、セキュリティー関連の問題が発生する可能性があります。OpenShift Container Platform は特定のバージョンの Gateway API CRD を使用するため、サードパーティーの Gateway API 実装を使用する場合は、すべてのフィールドが期待どおりに機能するように、OpenShift Container Platform 実装に準拠する必要があります。

OpenShift Container Platform 4.19 クラスター内で作成されたすべての CRD は、Ingress Operator によって互換性のあるバージョン管理とメンテナンスが行われます。CRD がすでに存在するものの、以前は Ingress Operator によって管理されていなかった場合、Ingress Operator は、それらの設定が OpenShift Container Platform がサポートする Gateway API バージョンと互換性があるかをチェックします。その後、CRD の管理を引き継ぐことへの承認をユーザーに求める admin-gate を作成します。

重要

Gateway API CRD を含む以前の OpenShift Container Platform バージョンからクラスターを更新する場合は、それらのリソースを変更して、OpenShift Container Platform でサポートされているバージョンと完全に一致するようにします。そうしないと、それらの CRD は OpenShift Container Platform によって管理されていなかったため、Red Hat でサポートされていない機能が含まれている可能性があり、クラスターを更新できません。

7.2.13.3. Ingress Operator の Gateway API を使い始める

最初のステップに示すように GatewayClass を作成すると、クラスターで使用するための Gateway API が設定されます。

手順

  1. GatewayClass オブジェクトを作成します。

    1. 次の情報が含まれる YAML ファイル openshift-default.yaml を作成します。

      GatewayClass CR の例

      apiVersion: gateway.networking.k8s.io/v1
      kind: GatewayClass
      metadata:
        name: openshift-default
      spec:
        controllerName: openshift.io/gateway-controller/v1 
      1
      Copy to Clipboard Toggle word wrap

      1 1
      コントローラーの名前。
      重要

      Ingress Operator がこれを管理するには、コントローラー名が表示されているとおりである必要があります。このフィールドを他の値に設定すると、Ingress Operator は GatewayClass オブジェクトと、それに関連付けられたすべての GatewayGRPCRoute、および HTTPRoute オブジェクトを無視します。コントローラー名は OpenShift Container Platform の Gateway API の実装に関連付けられており、許可されるコントローラー名は openshift.io/gateway-controller/v1 のみです。

    2. 次のコマンドを実行して、GatewayClass リソースを作成します。

      $ oc create -f openshift-default.yaml
      Copy to Clipboard Toggle word wrap

      出力例

      gatewayclass.gateway.networking.k8s.io/openshift-default created
      Copy to Clipboard Toggle word wrap

      GatewayClass リソースの作成中に、Ingress Operator は Red Hat OpenShift Service Mesh の軽量バージョン、Istio カスタムリソース、および openshift-ingress namespace に新しいデプロイメントをインストールします。

    3. オプション: 新しいデプロイメント istiod-openshift-gateway が準備され、利用可能であることを確認します。

      $ oc get deployment -n openshift-ingress
      Copy to Clipboard Toggle word wrap

      出力例

      NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
      istiod-openshift-gateway   1/1     1            1           55s
      router-default             2/2     2            2           6h4m
      Copy to Clipboard Toggle word wrap

  2. 次のコマンドを実行してシークレットを作成します。

    $ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、Ingress Operator のドメインを取得します。

    $ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})
    Copy to Clipboard Toggle word wrap
  4. Gateway オブジェクトを作成します。

    1. 次の情報が含まれる YAML ファイル example-gateway.yaml を作成します。

      Gateway CR の例

      apiVersion: gateway.networking.k8s.io/v1
      kind: Gateway
      metadata:
        name: example-gateway
        namespace: openshift-ingress 
      1
      
      spec:
        gatewayClassName: openshift-default 
      2
      
        listeners:
        - name: https 
      3
      
          hostname: "*.gwapi.${DOMAIN}" 
      4
      
          port: 443
          protocol: HTTPS
          tls:
            mode: Terminate
            certificateRefs:
            - name: gwapi-wildcard 
      5
      
          allowedRoutes:
            namespaces:
              from: All
      Copy to Clipboard Toggle word wrap

      1
      Gateway オブジェクトは、openshift-ingress namespace に作成する必要があります。
      2
      Gateway オブジェクトは、以前に作成された GatewayClass オブジェクトの名前を参照する必要があります。
      3
      HTTPS リスナーは、クラスタードメインのサブドメインに一致する HTTPS 要求をリッスンします。このリスナーを使用し、Gateway API HTTPRoute リソースを使用してアプリケーションへの Ingress を設定します。
      4
      ホスト名は、Ingress Operator ドメインのサブドメインである必要があります。ドメインを使用する場合、リスナーはそのドメイン内のすべてのトラフィックを処理しようとします。
      5
      以前に作成されたシークレットの名前。
    2. 次のコマンドを実行して、リソースを適用します。

      $ oc apply -f example-gateway.yaml
      Copy to Clipboard Toggle word wrap
    3. オプション: Gateway オブジェクトを作成すると、Red Hat OpenShift Service Mesh は同じ名前のデプロイメントとサービスを自動的にプロビジョニングします。以下のコマンドを実行して、これを確認します。

      • デプロイメントを確認するには、次のコマンドを実行します。

        $ oc get deployment -n openshift-ingress example-gateway-openshift-default
        Copy to Clipboard Toggle word wrap

        出力例

        NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
        example-gateway-openshift-default    1/1     1            1           25s
        Copy to Clipboard Toggle word wrap

      • サービスを確認するには、次のコマンドを実行します。

        $ oc get service -n openshift-ingress example-gateway-openshift-default
        Copy to Clipboard Toggle word wrap

        出力例

        NAME                                TYPE           CLUSTER-IP   EXTERNAL-IP         PORT(S)      AGE
        example-gateway-openshift-default   LoadBalancer   10.1.2.3     <external_ipname>   <port_info>  47s
        Copy to Clipboard Toggle word wrap

    4. オプション: Ingress Operator は、リスナーからのホスト名を使用して DNSRecord CR を自動的に作成し、ラベル gateway.networking.k8s.io/gateway-name=example-gateway を追加します。次のコマンドを実行して、DNS レコードのステータスを確認します。

      $ oc -n openshift-ingress get dnsrecord -l gateway.networking.k8s.io/gateway-name=example-gateway -o yaml
      Copy to Clipboard Toggle word wrap

      出力例

      kind: DNSRecord
        ...
      status:
        ...
        zones:
        - conditions:
          - message: The DNS provider succeeded in ensuring the record
            reason: ProviderSuccess
            status: "True"
            type: Published
          dnsZone:
            tags:
              ...
        - conditions:
          - message: The DNS provider succeeded in ensuring the record
            reason: ProviderSuccess
            status: "True"
            type: Published
          dnsZone:
            id: ...
      Copy to Clipboard Toggle word wrap

  5. すでに作成済みの namespace と example-app/example-app というアプリケーションにリクエストを送信する HTTPRoute リソースを作成します。

    1. 次の情報が含まれる YAML ファイル example-route.yaml を作成します。

      HTTPRoute CR の例

      apiVersion: gateway.networking.k8s.io/v1
      kind: HTTPRoute
      metadata:
        name: example-route
        namespace: example-app-ns 
      1
      
      spec:
        parentRefs: 
      2
      
        - name: example-gateway
          namespace: openshift-ingress
        hostnames: ["example.gwapi.${DOMAIN}"] 
      3
      
        rules:
        - backendRefs: 
      4
      
          - name: example-app 
      5
      
            port: 8443
      Copy to Clipboard Toggle word wrap

      1
      アプリケーションをデプロイする namespace。
      2
      このフィールドは、以前に設定した Gateway オブジェクトを指している必要があります。
      3
      ホスト名は、Gateway オブジェクトで指定されたホスト名と一致する必要があります。この場合、リスナーはワイルドカードホスト名を使用します。
      4
      このフィールドは、サービスを指すバックエンド参照を指定します。
      5
      アプリケーションの Service の名前。
    2. 次のコマンドを実行して、リソースを適用します。

      $ oc apply -f example-route.yaml
      Copy to Clipboard Toggle word wrap

      出力例

      httproute.gateway.networking.k8s.io/example-route created
      Copy to Clipboard Toggle word wrap

検証

  1. 次のコマンドを実行して、Gateway オブジェクトがデプロイされ、状態が Programmed であることを確認します。

    $ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway
    Copy to Clipboard Toggle word wrap

    出力例

    gateway.gateway.networking.k8s.io/example-gateway condition met
    Copy to Clipboard Toggle word wrap

  2. 設定された HTTPRoute オブジェクトのホスト名にリクエストを送信します。

    $ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443
    Copy to Clipboard Toggle word wrap

7.2.13.4. Gateway API デプロイメントトポロジー

Gateway API は、共有ゲートウェイと専用ゲートウェイの 2 つのトポロジーに対応するように設計されています。各トポロジーには独自の利点があり、セキュリティー上の意味合いも異なります。

専用ゲートウェイ
ルートおよびロードバランサーやプロキシーは、同じ namespace から提供されます。Gateway オブジェクトは、特定のアプリケーション namespace へのルートを制限します。これは、OpenShift Container Platform に Gateway API リソースをデプロイする場合のデフォルトのトポロジーです。
共有ゲートウェイ
ルートは、複数の namespace から、または複数のホスト名で提供されます。Gateway オブジェクトフィルターは、spec.listeners.allowedRoutes.namespaces フィールドを使用して、アプリケーション namespace からのルートを許可します。
7.2.13.4.1. 専用ゲートウェイの例

次の例は、専用の Gateway リソースの fin-gateway を示しています。

専用 Gateway リソースの例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: fin-gateway
  namespace: openshift-ingress
spec:
  listeners: 
1

  - name: http
    protocol: HTTP
    port: 8080
    hostname: "example.com"
Copy to Clipboard Toggle word wrap

1
spec.listeners[].allowedRoutes を設定せずに Gateway リソースを作成すると、namespaces.from フィールドの値が Same に暗黙的に設定されます。

次の例は、専用の Gateway オブジェクトにアタッチされる、関連付けられた HTTPRoute リソースの sales-db を示しています。

HTTPRoute リソースの例

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: sales-db
  namespace: openshift-ingress
spec:
  parentRefs:
  - name: fin-gateway
  hostnames:
  - sales-db.example.com
  rules:
    - backendRefs:
        - name: sales-db
        ¦ port: 8080
Copy to Clipboard Toggle word wrap

HTTPRoute リソースをゲートウェイにアタッチするには、その parentRefs フィールドの値として Gateway オブジェクトの名前を指定する必要があります。暗黙的に、ルートは Gateway オブジェクトと同じ namespace にあると想定されます。

7.2.13.4.2. 共有ゲートウェイの例

次の例は、spec.listeners.allowedRoutes.namespaces ラベルセレクターが shared-gateway-access: "true" を含む任意の namespace と一致するように設定された Gateway リソースの devops-gateway を示しています。

共有 Gateway リソースの例

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: devops-gateway
  namespace: openshift-ingress
listeners:
  - name: https
    protocol: HTTPS
    hostname: "example.com"
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
        ¦ matchLabels:
        ¦   shared-gateway-access: "true"
Copy to Clipboard Toggle word wrap

次の例は、devops-gateway リソースに許可される namespace を示しています。

Namespace リソースの例

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    shared-gateway-access: "true"
---
apiVersion: v1
kind: Namespace
metadata:
  name: ops
  labels:
    shared-gateway-access: "true"
Copy to Clipboard Toggle word wrap

この例では、dev-portalops-home という 2 つの HTTPRoute リソースが異なる namespace にありますが、共有ゲートウェイに接続されています。

apiVersion: v1
kind: HTTPRoute
metadata:
  name: dev-portal
  namespace: dev
spec:
  parentRefs:
  - name: devops-gateway
    namespace: openshift-ingress
  rules:
  - backendRefs:
    - name: dev-portal
      port: 8080
---
apiVersion: v1
kind: HTTPRoute
metadata:
  name: ops-home
  namespace: ops
spec:
  parentRefs:
  - name: devops-gateway
    namespace: openshift-ingress
  rules:
  - backendRefs:
    - name: ops-home
      port: 8080
Copy to Clipboard Toggle word wrap

共有ゲートウェイトポロジーでは、各ルートは、アタッチしたい Gateway オブジェクトの namespace を指定する必要があります。複数の Gateway オブジェクトを namespace 間でデプロイして共有できます。共有ゲートウェイが複数ある場合、このトポロジーは概念的には Ingress Controller シャーディングに似たものになります。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

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

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

会社概要

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

Theme

© 2025 Red Hat