2.12.3. Ingress Operator の Gateway API を使い始める
GatewayClass リソースを作成すると、そのリソースによって Gateway API がクラスター上で使用できるように設定されます。
OpenShift Container Platform Gateway API 実装は、Cluster Ingress Operator (CIO) を利用して、openshift- Ingress namespace に特定のバージョンの OpenShift Service Mesh (OSSM v3.x) をインストールし、管理します。
クラスターのいずれかの namespace にアクティブな OpenShift Service Mesh (OSSM v2.x) サブスクリプションがすでに存在する場合、競合が発生します。OSSM v2.x と OSSM v3.x は同じクラスター上に配置できません。
GatewayClass リソースを作成する際に、競合する OSSM v2.x サブスクリプションが存在する場合、クラスターイングレス Operator は必要な OSSM v3.x コンポーネントのインストールを試みますが、このインストール操作は失敗します。その結果、Gateway や HTTPRoute などの Gateway API リソースは効果を発揮せず、トラフィックをルーティングするためのプロキシーも設定されません。OpenShift Container Platform 4.19 では、この障害は通知されません。OpenShift Container Platform 4.20 以降では、この競合により、イングレス ClusterOperator が Degraded ステータスを報告するようになります。
GatewayClass を作成して Gateway API を有効にする前に、クラスターにアクティブな OSSM v2.x サブスクリプションがないか確認してください。
手順
GatewayClassオブジェクトを作成します。次の情報が含まれる YAML ファイル
openshift-default.yamlを作成します。GatewayClassCR の例apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: openshift-default spec: controllerName: openshift.io/gateway-controller/v1controllerName: コントローラー名。重要Ingress Operator がこれを管理するには、コントローラー名が表示されているとおりである必要があります。このフィールドを他の値に設定すると、Ingress Operator は
GatewayClassオブジェクトと、それに関連付けられたすべてのGateway、GRPCRoute、およびHTTPRouteオブジェクトを無視します。コントローラー名は OpenShift Container Platform の Gateway API の実装に関連付けられており、許可されるコントローラー名はopenshift.io/gateway-controller/v1のみです。
次のコマンドを実行して、
GatewayClassリソースを作成します。$ oc create -f openshift-default.yaml出力例
gatewayclass.gateway.networking.k8s.io/openshift-default createdGatewayClassリソースの作成中に、Ingress Operator は Red Hat OpenShift Service Mesh の軽量バージョン、Istio カスタムリソース、およびopenshift-ingressnamespace に新しいデプロイメントをインストールします。オプション: 新しいデプロイメントである
istiod-openshift-gatewayが準備完了で利用可能であることを確認します。$ oc get deployment -n openshift-ingress出力例
NAME READY UP-TO-DATE AVAILABLE AGE istiod-openshift-gateway 1/1 1 1 55s router-default 2/2 2 2 6h4m
次のコマンドを実行してシークレットを作成します。
$ oc -n openshift-ingress create secret tls gwapi-wildcard --cert=wildcard.crt --key=wildcard.key次のコマンドを実行して、Ingress Operator のドメインを取得します。
$ DOMAIN=$(oc get ingresses.config/cluster -o jsonpath={.spec.domain})Gatewayオブジェクトを作成します。次の情報が含まれる YAML ファイル
example-gateway.yamlを作成します。ゲートウェイ CR の例
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: example-gateway namespace: openshift-ingress spec: gatewayClassName: openshift-default listeners: - name: https hostname: "*.gwapi.${DOMAIN}" port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: gwapi-wildcard allowedRoutes: namespaces: from: Allここでは、以下のようになります。
metadata.namespace-
Gatewayオブジェクトは、openshift-ingressnamespace に作成する必要があります。 gatewayClassName-
Gatewayオブジェクトは、以前に作成されたGatewayClassオブジェクトの名前を参照する必要があります。 リスナー名-
HTTPS リスナーは、クラスタードメインのサブドメインに一致する HTTPS 要求をリッスンします。このリスナーを使用し、Gateway API
HTTPRouteリソースを使用してアプリケーションへの Ingress を設定します。 リスナーホスト名- ホスト名は、Ingress Operator ドメインのサブドメインである必要があります。ドメインを使用する場合、リスナーはそのドメイン内のすべてのトラフィックを処理しようとします。
tls.name- 以前に作成されたシークレットの名前。
次のコマンドを実行して、リソースを適用します。
$ oc apply -f example-gateway.yamlオプション:
Gatewayオブジェクトを作成すると、Red Hat OpenShift Service Mesh は同じ名前のデプロイメントとサービスを自動的にプロビジョニングします。以下のコマンドを実行して、これを確認します。デプロイメントを確認するには、次のコマンドを実行します。
$ oc get deployment -n openshift-ingress example-gateway-openshift-default出力例
NAME READY UP-TO-DATE AVAILABLE AGE example-gateway-openshift-default 1/1 1 1 25sサービスを確認するには、次のコマンドを実行します。
$ oc get service -n openshift-ingress example-gateway-openshift-default出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-gateway-openshift-default LoadBalancer 10.1.2.3 <external_ipname> <port_info> 47s
オプション: Ingress Operator は、リスナーからのホスト名を使用して
DNSRecordCR を自動的に作成し、ラベル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出力例
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: ...
すでに作成済みの namespace と
example-app/example-appというアプリケーションにリクエストを送信するHTTPRouteリソースを作成します。次の情報が含まれる YAML ファイル
example-route.yamlを作成します。HTTP ルート CR の例
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: example-route namespace: example-app-ns spec: parentRefs: - name: example-gateway namespace: openshift-ingress hostnames: ["example.gwapi.${DOMAIN}"] rules: - backendRefs: - name: example-app1 port: 8443ここでは、以下のようになります。
metadata.namespace- アプリケーションをデプロイする namespace。
spec.parentRefs-
このフィールドは、以前に設定した
Gatewayオブジェクトを指している必要があります。 spec.hostnames-
ホスト名は、
Gatewayオブジェクトで指定されたホスト名と一致する必要があります。この場合、リスナーはワイルドカードホスト名を使用します。 ルール.バックエンド参照- このフィールドは、サービスを指すバックエンド参照を指定します。
ルール名-
アプリケーションの
Serviceの名前。
次のコマンドを実行して、リソースを適用します。
$ oc apply -f example-route.yaml出力例
httproute.gateway.networking.k8s.io/example-route created
検証
次のコマンドを実行して、
Gatewayオブジェクトがデプロイされ、状態がProgrammedであることを確認します。$ oc wait -n openshift-ingress --for=condition=Programmed gateways.gateway.networking.k8s.io example-gateway出力例
gateway.gateway.networking.k8s.io/example-gateway condition met設定された
HTTPRouteオブジェクトのホスト名にリクエストを送信します。$ curl -I --cacert <local cert file> https://example.gwapi.${DOMAIN}:443