ゲートウェイ
ゲートウェイと OpenShift Service Mesh
概要
第1章 ゲートウェイについて リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイは、スタンドアロンの Envoy プロキシーデプロイメントと、サービスメッシュのエッジで動作する関連する Kubernetes サービスです。ゲートウェイを設定すると、メッシュに出入りするトラフィックをきめ細かく制御できます。Red Hat OpenShift Service Mesh では、ゲートウェイインジェクションを使用してゲートウェイをインストールします。
1.1. ゲートウェイインジェクションについて リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイインジェクションは、サイドカーインジェクションと同じメカニズムを利用して、Envoy プロキシーをゲートウェイ Pod に注入します。ゲートウェイインジェクションを使用してゲートウェイをインストールするには、Istio コントロールプレーンに表示される namespace に Kubernetes Deployment オブジェクトと関連する Kubernetes Service オブジェクトを作成します。Deployment オブジェクトを作成するときに、Istio コントロールプレーンがプロキシーを注入し、プロキシーがゲートウェイとして設定されるように、オブジェクトにラベルおよびアノテーションを付けます。ゲートウェイをインストールしたら、Istio Gateway と VirtualService リソースを使用して、Ingress と Egress トラフィックを制御するようにゲートウェイを設定します。
1.1.1. ゲートウェイインジェクションを使用したゲートウェイのインストール リンクのコピーリンクがクリップボードにコピーされました!
この手順では、ゲートウェイインジェクションを使用してゲートウェイをインストールする方法を説明します。
この手順を使用して、Ingress または Egress ゲートウェイを作成できます。
前提条件
- OpenShift Service Mesh Operator バージョン 3.0 以降がインストールされている。
- Istio コントロールプレーンを作成している。
-
IstioCNIリソースを作成している。
手順
ゲートウェイのインストールに使用する namespace を作成します。
oc create namespace <gateway_namespace>
$ oc create namespace <gateway_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記ゲートウェイと Istio コントロールプレーンを異なる namespace にインストールします。
ゲートウェイを専用のゲートウェイ namespace にインストールできます。このアプローチにより、異なる namespace で動作する多くのアプリケーションでゲートウェイを共有できるようになります。または、ゲートウェイをアプリケーション namespace にインストールすることもできます。このアプローチでは、ゲートウェイはその namespace 内のアプリケーション専用のゲートウェイとして機能します。
ゲートウェイデプロイメントのサービスアカウント、ロール、およびロールバインディングを定義する
secret-reader.ymlという名前の YAML ファイルを作成します。これらの設定により、ゲートウェイは TLS 認証情報を取得するために必要なシークレットを読み取ることができます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f secret-reader.yml
$ oc apply -f secret-reader.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow ゲートウェイの Kubernetes
Deploymentオブジェクトを定義する、gateway-deployment.ymlという名前の YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Istio コントロールプレーンがデフォルトのサイドカーテンプレートではなく、ゲートウェイインジェクションテンプレートを使用することを示します。
- 2
- ゲートウェイのデプロイメントに一意のラベルが設定されていることを確認します。Istio
Gatewayリソースがゲートウェイワークロードを選択できるようにするには、一意のラベルが必要です。 - 3
sidecar.istio.io/injectラベルをtrueに設定して、ゲートウェイインジェクションを有効にします。Istio リソースの名前がdefaultでない場合は、代わりにistio.io/rev: <istio_revision>ラベルを使用する必要があります。ここで、リビジョンは Istio リソースのアクティブなリビジョンを表します。- 4
- Pod が起動するたびにイメージが自動的に更新されるように、イメージフィールドを
autoに設定します。 - 5
serviceAccountNameを、以前作成したServiceAccountの名前に設定します。
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f gateway-deployment.yml
$ oc apply -f gateway-deployment.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ゲートウェイ
Deploymentロールアウトが正常に行れたことを確認します。oc rollout status deployment/<gateway_name> -n <gateway_namespace>
$ oc rollout status deployment/<gateway_name> -n <gateway_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のような出力が表示されるはずです。
出力例
Waiting for deployment "<gateway_name>" rollout to finish: 0 of 1 updated replicas are available... deployment "<gateway_name>" successfully rolled out
Waiting for deployment "<gateway_name>" rollout to finish: 0 of 1 updated replicas are available... deployment "<gateway_name>" successfully rolled outCopy to Clipboard Copied! Toggle word wrap Toggle overflow ゲートウェイの Kubernetes
Serviceオブジェクトを含む、gateway-service.ymlという名前の YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f gateway-service.yml
$ oc apply -f gateway-service.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ゲートウェイサービスがゲートウェイ Pod のエンドポイントをターゲットにしていることを確認します。
oc get endpoints <gateway_name> -n <gateway_namespace>
$ oc get endpoints <gateway_name> -n <gateway_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のような出力が表示されるはずです。
出力例
NAME ENDPOINTS AGE <gateway_name> 10.131.0.181:8080,10.131.0.181:8443 1m
NAME ENDPOINTS AGE <gateway_name> 10.131.0.181:8080,10.131.0.181:8443 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: ゲートウェイの Horizontal Pod Autoscaler を定義する、
gateway-hpa.ymlという名前の YAML ファイルを作成します。次の例では、最小レプリカを2に、最大レプリカを5に設定し、平均 CPU 使用率が CPU リソース制限の 80% を超えたときにレプリカをスケールアップします。この制限は、ゲートウェイのデプロイメントの Pod テンプレートで指定されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
spec.scaleTargetRef.nameを、以前作成したゲートウェイデプロイメントの名前に設定します。
オプション: 次のコマンドを実行して YAML ファイルを適用します。
oc apply -f gateway-hpa.yml
$ oc apply -f gateway-hpa.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: ゲートウェイの Pod Disruption Budget を定義する、
gateway-pdb.ymlという名前の YAML ファイルを作成します。次の例では、ゲートウェイ Pod のエビクション後も、クラスター上に少なくとも 1 つの正常なゲートウェイ Pod が残る場合にのみ、ゲートウェイ Pod のエビクションが許可されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
spec.selector.matchLabelsを、以前作成したゲートウェイデプロイメントの Pod テンプレートで指定された一意のラベルまたはラベルセットに設定します。
オプション: 次のコマンドを実行して YAML ファイルを適用します。
oc apply -f gateway-pdb.yml
$ oc apply -f gateway-pdb.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第2章 トラフィックをメッシュに取り込む リンクのコピーリンクがクリップボードにコピーされました!
Istio API を使用すると、ゲートウェイインジェクションを使用してインストールされたゲートウェイプロキシーを設定して、メッシュ外部からのトラフィックを受け入れ、そのトラフィックをメッシュ内のサービスにルーティングできます。
LoadBalancer タイプの Service または OpenShift Routes のいずれかを使用して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開できます。
2.1. ゲートウェイインジェクションを使用してインストールされたゲートウェイを Ingress トラフィックを受け入れるように設定することについて リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイインジェクションを使用してゲートウェイをインストールすると、Istio Gateway と VirtualService リソースを組み合わせて Ingress トラフィックを受信するようにゲートウェイを設定できます。Istio Gateway リソースは、着信または発信の HTTP/TCP 接続を受信するメッシュのエッジで動作するロードバランサーを表します。Gateway 仕様には、公開する必要があるポートのセット、使用するプロトコルのタイプ、およびロードバランサーの Server Name Indication (SNI) 設定が記述されています。VirtualServices は、VirtualServices を使用して内部メッシュトラフィックのルーティングルールを定義するのと同様に、Istio Gateway に適用するルーティングルールを定義します。
次の例では、Istio Gateway リソースは、外部トラフィックのエントリーポイントとして機能するゲートウェイプロキシーを設定します。この設定では、ホスト info.com のポート 443 (HTTPS) が公開されます。この設定例は、istio: ingressgateway ラベルを持つ Pod に適用されます。tls モードは SIMPLE と設定され、例で提供される証明書と秘密鍵を使用して着信 HTTPS トラフィックを終了します。
設定例
次の VirtualService は、前の設定例に示されている Istio Gateway リソースにバインドされています。この仕様では、/reviews/ パス接頭辞を持つトラフィックを info namespace のレビューサービスにルーティングするためのルールが定義されています。VirtualService は、前に示した Gateway リソースを明示的に参照します。これにより、指定されたゲートウェイを通じて入ってくるトラフィックにのみルーティングルールが適用されるようになります。
設定例
2.1.1. Istio Gateway と VirtualService リソースを使用してサービスを公開する リンクのコピーリンクがクリップボードにコピーされました!
この手順では、Istio Gateway および VirtualService リソースを使用して、ゲートウェイインジェクションを使用してデプロイされたゲートウェイを設定します。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの Service を LoadBalancer タイプに設定して、ゲートウェイをクラスター外部のトラフィックに公開します。
前提条件
- ゲートウェイインジェクションを使用して Istio ゲートウェイをインストールしている。
手順
次のコマンドを実行して、
httpbinという namespace を作成します。oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow namespace でサイドカーインジェクションを有効にします。
InPlaceアップグレードストラテジーを使用している場合は、次のコマンドを実行します。oc label namespace httpbin istio-injection=enabled
$ oc label namespace httpbin istio-injection=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記RevisionBasedアップグレードストラテジーを使用している場合は、次のコマンドを実行します。<revision-name>を見つけるには、次のコマンドを実行します。oc get istiorevisions.sailoperator.io
$ oc get istiorevisions.sailoperator.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力サンプル
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33sCopy to Clipboard Copied! Toggle word wrap Toggle overflow サイドカーインジェクションを有効にするには、namespace にリビジョン名でラベルを付けます。
oc label namespace httpbin istio.io/rev=default
$ oc label namespace httpbin istio.io/rev=defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、
httpbinという名前のサンプルサービスをデプロイします。oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Istio
Gatewayリソースを定義するhttpbin-gw.yamlという名前の YAML ファイルを作成します。このリソースは、ホストhttpbin.example.comのポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow VirtualService用にhttpbin-vs.yamlという名前の YAML ファイルを作成します。VirtualServiceは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを定義します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
VirtualServiceのルーティングルールが適用されるhostsを指定します。指定されたhostsは、VirtualService がバインドされている IstioGatewayリソースによって公開される必要があります。- 2
Gateway名をゲートウェイのリストに追加して、前の手順で作成した IstioGatewayリソースにVirtualServiceをバインドします。- 3
httpbinServiceのhostとportを含むdestinationを定義して、一致するトラフィックを以前デプロイしたhttpbinサービスにルーティングします。
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-vs.yaml
$ oc apply -f httpbin-vs.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 検証のために、次のコマンドを実行して
curlクライアントの namespace を作成します。oc create namespace curl
$ oc create namespace curlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して
curlクライアントをデプロイします。oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
curlPod の名前でCURL_POD変数を設定します。CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow curlクライアントを使用して、Ingress ゲートウェイServiceリソースを介してhttpbinアプリケーションの/headersエンドポイントにリクエストを送信します。IstioGatewayおよびVirtualServiceリソースが指定するホストと一致するように、リクエストのHostヘッダーをhttpbin.example.comに設定します。リクエストを送信するには、次のcurlコマンドを実行します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 応答には、リクエストが成功したことを示す
200 OK HTTPステータスが含まれます。出力例
HTTP/1.1 200 OK server: istio-envoy ...
HTTP/1.1 200 OK server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
httpbinVirtualServiceに対応する URI プレフィックスの一致が定義されていないエンドポイントに curl リクエストを送信します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>.<gateway_namespace>.svc.cluster.local/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow 応答では
404 Not Foundステータスが返されます。/getエンドポイントには、httpbinVirtualServiceリソース内に一致する URI 接頭辞がないため、これは予想された結果です。出力例
HTTP/1.1 404 Not Found server: istio-envoy ...
HTTP/1.1 404 Not Found server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceタイプをLoadBalancerに設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記OpenShift Routes を使用して、ゲートウェイをクラスター外部のトラフィックに公開することもできます。詳細は、「OpenShift Routes を使用してゲートウェイをクラスター外のトラフィックに公開する」を参照してください。
ゲートウェイ
Serviceリソースの外部ホスト名または IP アドレスを使用する場合は、クラスターの外部からhttpbinサービスにアクセスできることを確認します。クラスターが実行されている環境に合わせて、INGRESS_HOST変数を適切に設定してください。クラスターが AWS 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターが GCP または Azure 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行し、ゲートウェイのホストを使用して
httpbinサービスにcurlリクエストを送信します。curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。
2.2. クラスター外のトラフィックにサービスを公開することについて リンクのコピーリンクがクリップボードにコピーされました!
OpenShift クラスターの外部からのトラフィックがメッシュ内のサービスにアクセスできるようにするには、Service タイプを LoadBalancer に設定するか、OpenShift Router を使用して、ゲートウェイプロキシーを公開する必要があります。
Kubernetes ロードバランシングを使用して、受信トラフィックを受信ゲートウェイ経由で直接処理すると、データ暗号化に関連するレイテンシーを削減できます。受信ゲートウェイで暗号化を管理することで、メッシュ内で発生しがちな中間的な復号化と再暗号化の処理を回避し、レイテンシーを削減できます。このアプローチにより、メッシュトラフィックは 1 回だけ暗号化および復号化できるため、一般的にはより効率的となります。
OpenShift Router は Ingress トラフィックを管理するための標準的なアプローチを提供し、ルーターを使用して同じ方法ですべてのクラスター Ingress トラフィックの証明書を管理できます。ただし、OpenShift Router は、受信トラフィックとメッシュアプリケーションの間に追加のホップを導入します。通常、トラフィックをルーターで復号し、サービスメッシュ Ingress ゲートウェイで再暗号化することでルーティングしますが、これによりレイテンシーが発生します。
2.2.1. OpenShift Routes を使用してゲートウェイをクラスター外のトラフィックに公開する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Routes を使用すると、ゲートウェイをクラスター外部のトラフィックに公開できます。このアプローチは、ゲートウェイをクラスター外部のトラフィックに公開する必要がある場合に、Kubernetes ロードバランサーサービスの代わりに使用できます。
前提条件
- Istio Gateway と VirtualService リソースを使用してサービスを公開する の手順を完了している。
手順
次のコマンドを実行して、
ServiceタイプがClusterIPに設定されていることを確認します。oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "ClusterIP"}}'$ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "ClusterIP"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpbinサービスのRouteを定義するhttpbin-route.yamlという名前の YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-route.yaml
$ oc apply -f httpbin-route.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress ルーターを介してクラスターの外部から
httpbinサービスにアクセスできることを確認します。クラスターが実行されている環境に合わせて、INGRESS_HOST変数を適切に設定してください。クラスターが AWS 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。INGRESS_HOST=$(oc get service router-default -n openshift-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')$ INGRESS_HOST=$(oc get service router-default -n openshift-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターが GCP または Azure 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。INGRESS_HOST=$(oc get service router-default -n openshift-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')$ INGRESS_HOST=$(oc get service router-default -n openshift-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress ルーターのホストを使用して
httpbinサービスにcurlリクエストを送信します。curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。
2.3. Kubernetes Gateway API を使用してサービスを公開する リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes Gateway API を使用して、Gateway および HTTPRoute リソースを作成し、ゲートウェイをデプロイします。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの Service を LoadBalancer に設定して、ゲートウェイをクラスター外部のトラフィックに公開できます。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform Web コンソールにログインしている。 - Red Hat OpenShift Service Mesh Operator がインストールされている。
- Istio リソースがインストールされている。
手順
次のコマンドを実行して、
httpbinという namespace を作成します。oc create namespace httpbin
$ oc create namespace httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
httpbinという名前のサンプルサービスをデプロイします。oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yaml
$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Kubernetes Gateway リソースを定義する
httpbin-gw.yamlという名前の YAML ファイルを作成します。このリソースは、ホストhttpbin.example.comのポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。ゲートウェイリソースファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 関連付けられたポート上のメッシュサービスへのアクセスを試みる際に、クライアントが使用する仮想ホスト名を指定します。
以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-gw.yaml
$ oc apply -f httpbin-gw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow HTTPRouteリソースを定義するhttpbin-hr.yamlという名前の YAML ファイルを作成します。HTTPRouteリソースは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを指定します。HTTPRoute ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f httpbin-hr.yaml
$ oc apply -f httpbin-hr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Gateway API サービスが準備完了状態で、サービスにアドレスが割り当てられていることを確認します。
oc wait --for=condition=programmed gtw httpbin-gateway -n httpbin
$ oc wait --for=condition=programmed gtw httpbin-gateway -n httpbinCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
curlクライアントの namespace を作成します。oc create namespace curl
$ oc create namespace curlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
curlクライアントをデプロイします。oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
curlPod の名前でCURL_POD変数を設定します。CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow curlクライアントを使用して、Ingress ゲートウェイServiceリソースを介してhttpbinアプリケーションの/headersエンドポイントにリクエストを送信します。Kubernetes Gateway およびHTTPROUTEリソースが指定するホストと一致するように、リクエストの Host ヘッダーをhttpbin.example.comに設定します。次のコマンドを実行して、curlリクエストを送信します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/headers$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow レスポンスでは、要求が成功したことを示す
200 OKHTTP ステータスが返されます。出力例
HTTP/1.1 200 OK server: istio-envoy ...
HTTP/1.1 200 OK server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
httpbinHTTPROUTEで定義されている Uniform Resource Identifier (URI) 接頭辞の一致がないエンドポイントにcurlリクエストを送信します。oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/get$ oc exec $CURL_POD -n curl -- \ curl -s -I \ -H Host:httpbin.example.com \ <gateway_name>-istio.<gateway_namespace>.svc.cluster.local/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow レスポンスは
404 Not Foundステータスを返します。これは、/getエンドポイントのhttpbinHTTPROUTEリソース内に一致する URI 接頭辞がないため、予想される動作です。出力例
HTTP/1.1 404 Not Found server: istio-envoy ...
HTTP/1.1 404 Not Found server: istio-envoy ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceタイプをLoadBalancerに設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。以下のコマンドを実行します。oc patch service <gateway_name>-istio -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'$ oc patch service <gateway_name>-istio -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記OpenShift Routes を使用して、ゲートウェイをクラスター外部のトラフィックに公開することもできます。詳細は、「OpenShift Routes を使用してゲートウェイをクラスター外のトラフィックに公開する」を参照してください。
ゲートウェイ Service リソースの外部ホスト名または IP アドレスを使用する場合は、クラスターの外部から
httpbinサービスにアクセスできることを確認します。クラスターが実行されている環境に合わせて、INGRESS_HOST変数を適切に設定してください。次のコマンドを実行して、
INGRESS_HOST変数を設定します。export INGRESS_HOST=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.addresses[0].value}')$ export INGRESS_HOST=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.addresses[0].value}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
INGRESS_PORT変数を設定します。INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')$ INGRESS_PORT=$(oc get gtw <gateway_name> -n <gateway_namespace> -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow ゲートウェイホストを使用して、次のコマンドを実行し、
httpbinサービスにcurlリクエストを送信します。curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers
$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。
第3章 ゲートウェイ経由で送信トラフィックを誘導する リンクのコピーリンクがクリップボードにコピーされました!
Istio API を使用すると、ゲートウェイインジェクションを使用してインストールされたゲートウェイプロキシーを設定して、外部サービスに送信されるトラフィックを誘導できます。
3.1. ゲートウェイ経由での Egress トラフィックの誘導について リンクのコピーリンクがクリップボードにコピーされました!
ゲートウェイインジェクションを使用してインストールされたゲートウェイを、サービスメッシュから出るトラフィックの出口ポイントとして設定できます。この設定では、ゲートウェイはメッシュ外部のサービスに送信されるリクエストのフォワードプロキシーとして機能します。
Egress トラフィック用のゲートウェイを設定すると、セキュリティー要件を満たすのに役立ちます。たとえば、トラフィック制限により、メッシュから出るすべてのトラフィックが専用のノードセットを通過する必要がある環境では、Egress ゲートウェイを使用できます。同様に、ネットワークポリシーによってアプリケーションノードが外部サービスに直接アクセスできない場合は、ゲートウェイを使用できます。このようなシナリオでは、ゲートウェイプロキシーは、外部サービスにアクセスできる専用の Egress ノードにデプロイされます。これらのノードは、その後、セキュリティー強化のために厳格なネットワークポリシーの適用や追加のモニタリングを受けることができます。
ゲートウェイインジェクションを使用してインストールされたゲートウェイを設定して Egress トラフィックを誘導するには、Istio ServiceEntry、Gateway、VirtualService、および DestinationRule リソースの組み合わせを使用します。ServiceEntry リソースを使用して、外部サービスのプロパティーを定義します。外部サービスはメッシュの Istio サービスレジストリーに追加されます。これにより、メッシュを出て外部サービスに向かうトラフィックに対して、モニタリングやルーティングルールなどの Istio 機能を適用できます。Gateway、VirtualService、および DestinationRule リソースを使用し、ゲートウェイプロキシーを使用してメッシュから外部サービスにトラフィックをルーティングするルールをセットアップします。
3.2. Istio API を使用してゲートウェイ経由で Egress トラフィックを誘導する リンクのコピーリンクがクリップボードにコピーされました!
Istio API を使用して、ゲートウェイインジェクションを使用してインストールされたゲートウェイを介して送信 HTTP トラフィックを誘導します。
前提条件
- ゲートウェイインジェクションを使用してゲートウェイをインストールしている。
手順
次のコマンドを実行して、
curlという名前の namespace を作成します。oc create namespace curl
$ oc create namespace curlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用している更新ストラテジーに応じて、適切なコマンドを実行して namespace でサイドカーインジェクションを有効にします。
InPlace更新ストラテジーを使用している場合は、次のコマンドを実行します。oc label namespace curl istio-injection=enabled
$ oc label namespace curl istio-injection=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow RevisionBased更新ストラテジーを使用している場合は、次のコマンドを実行します。次のコマンドを実行してリビジョン名を表示します。
oc get istiorevisions.sailoperator.io
$ oc get istiorevisions.sailoperator.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33s
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、namespace にリビジョン名のラベルを付け、サイドカーインジェクションを有効にします。
oc label namespace curl istio.io/rev=default
$ oc label namespace curl istio.io/rev=defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、
curlアプリケーションをデプロイします。oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml
$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow curl Pod の名前で初期化された
CURL_POD環境変数をエクスポートします。export CURL_POD=$(oc get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')$ export CURL_POD=$(oc get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow メッシュから外部サービスにトラフィックを誘導する
http-se.yamlという名前の YAML ファイルを作成します。次の例では、URL のServiceEntryを定義します。設定例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f http-se.yaml
$ oc apply -f http-se.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceEntry設定が正しく適用されていることを確認します。次のコマンドを実行して、前の手順で指定したホストに HTTP リクエストを送信します。oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
$ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、接続が機能していることを示す
301(リダイレクト) または200(成功) などの HTTP ステータスコードを返します。Egress
Gatewayを作成し、メッシュからのトラフィックを外部サービスに指定されたホストにルーティングするhttp-gtw.yamlという名前の YAML ファイルを作成します。設定例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f http-gtw.yaml
$ oc apply -f http-gtw.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションサイドカーから Egress ゲートウェイを経由して外部ホストまでのトラフィックのフローを管理する
VirtualServiceをセットアップするhttp-vs.yamlという名前の YAML ファイルを作成します。設定例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f http-vs.yaml
$ oc apply -f http-vs.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow HTTP リクエストを URL に再送信します。
oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.com
$ oc exec "$CURL_POD" -n curl -c curl -- curl -sSL -o /dev/null -D - http://docs.redhat.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow ターミナルには、以下の出力に似た情報が表示されます。
出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、リクエストがゲートウェイ経由でルーティングされたことを確認します。
oc logs deployment/<gateway_name> -n <gateway_namespace> | tail -1
$ oc logs deployment/<gateway_name> -n <gateway_namespace> | tail -1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記この検証手順を実行するには、アクセスロギングを有効にする必要があります。Istio リソースで
spec.values.meshConfig.accessLogFileフィールドを/dev/stdoutに設定することで、標準出力へのアクセスロギングを有効にできます。ターミナルには、以下の出力に似た情報が表示されます。
出力例
[2024-11-07T14:35:52.428Z] "GET / HTTP/2" 301 - via_upstream - "-" 0 0 24 24 "10.128.2.30" "curl/8.11.0" "79551af2-341b-456d-b414-9220b487a03b" "docs.redhat.com" "23.55.176.201:80" outbound|80||docs.redhat.com 10.128.2.29:49766 10.128.2.29:80 10.128.2.30:38296 -
[2024-11-07T14:35:52.428Z] "GET / HTTP/2" 301 - via_upstream - "-" 0 0 24 24 "10.128.2.30" "curl/8.11.0" "79551af2-341b-456d-b414-9220b487a03b" "docs.redhat.com" "23.55.176.201:80" outbound|80||docs.redhat.com 10.128.2.29:49766 10.128.2.29:80 10.128.2.30:38296 -Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. Kubernetes Gateway API を使用してゲートウェイ経由で Egress トラフィックを送信する リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes Gateway API を使用して、送信 HTTP トラフィックを Egress ゲートウェイ経由で送信します。
前提条件
- Istio コントロールプレーンをインストールした。
-
IstioおよびIstioCNIリソースを設定した。
手順
オプション: {k8} Gateway API カスタムリソース定義 (CRD) を有効にします。
注記Kubernetes 1.28 および OpenShift Container Platform 4.18 以前のバージョンの Red Hat OpenShift Service Mesh では、Kubernetes Gateway API CRD はデフォルトでは使用できないため、使用する前に CRD を有効にする必要があります。OpenShift Container Platform 4.19 以降のバージョンでは、CRD がデフォルトで有効になっています。
Kubernetes Gateway API CRD を有効にする、
gateway-cr.yamlという名前の YAML ファイルを作成します。Kubernetes Gateway カスタムリソース (CR) ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f gateway-cr.yaml
$ oc apply -f gateway-cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、
Egress-gatewayという namespace を作成します。oc create namespace egress-gateway
$ oc create namespace egress-gatewayCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、その namespace に
istio-injectionラベルを適用します。oc label namespace egress-gateway istio-injection=enabled
$ oc label namespace egress-gateway istio-injection=enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow Egress ゲートウェイを定義する、
egress -gateway-cr.yamlという名前の YAML ファイルを作成します。Egress ゲートウェイ CR ファイルの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、YAML ファイルを適用します。
oc apply -f egress-gateway-cr.yaml
$ oc apply -f egress-gateway-cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、ゲートウェイ設定のステータスを確認します。
oc describe gateway -n egress-gateway
$ oc describe gateway -n egress-gatewayCopy to Clipboard Copied! Toggle word wrap Toggle overflow 目的の出力の
Status列には、Programmedが表示されます。次のコマンドを実行して、
Egress-gatewaynamespace にcurlPod を作成します。oc run test-pod --image=curlimages/curl:latest -n egress-gateway --rm -it --restart=Never -- sh
$ oc run test-pod --image=curlimages/curl:latest -n egress-gateway --rm -it --restart=Never -- shCopy to Clipboard Copied! Toggle word wrap Toggle overflow curlクライアントを使用し、次のコマンドを入力して Egress ゲートウェイ経由でhttpbin.orgにアクセスできることを確認します。curl -v http://httpbin.org/get
$ curl -v http://httpbin.org/getCopy to Clipboard Copied! Toggle word wrap Toggle overflow 目的の出力には、設定されたゲートウェイを通過する Egress トラフィックのルートを示す
httpbin.orgからのレスポンスが表示されます。