第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 トラフィックを終了します。
設定例
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: info-gateway
namespace: info
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- info.com
tls:
mode: SIMPLE
serverCertificate: /etc/certs/servercert.pem
privateKey: /etc/certs/privatekey.pem
次の VirtualService は、前の設定例に示されている Istio Gateway リソースにバインドされています。この仕様では、/reviews/ パス接頭辞を持つトラフィックを info namespace のレビューサービスにルーティングするためのルールが定義されています。VirtualService は、前に示した Gateway リソースを明示的に参照します。これにより、指定されたゲートウェイを通じて入ってくるトラフィックにのみルーティングルールが適用されるようになります。
設定例
kind: VirtualService
metadata:
name: info-rule
namespace: info
spec:
hosts:
- info.com
gateways:
- info/bookinfo-gateway
http:
- match:
- uri:
prefix: /reviews/
route:
- destination:
port:
number: 9080
host: reviews.info.svc.cluster.local
2.1.1. Istio Gateway と VirtualService リソースを使用してサービスを公開する リンクのコピーリンクがクリップボードにコピーされました!
この手順では、Istio Gateway および VirtualService リソースを使用して、ゲートウェイインジェクションを使用してデプロイされたゲートウェイを設定します。リソースは、メッシュ内のサービスをメッシュ外のトラフィックに公開するようにゲートウェイを設定します。次に、ゲートウェイの Service を LoadBalancer タイプに設定して、ゲートウェイをクラスター外部のトラフィックに公開します。
前提条件
- ゲートウェイインジェクションを使用して Istio ゲートウェイをインストールしている。
手順
次のコマンドを実行して、
httpbinという namespace を作成します。$ oc create namespace httpbinnamespace でサイドカーインジェクションを有効にします。
InPlaceアップグレードストラテジーを使用している場合は、次のコマンドを実行します。$ oc label namespace httpbin istio-injection=enabled注記RevisionBasedアップグレードストラテジーを使用している場合は、次のコマンドを実行します。<revision-name>を見つけるには、次のコマンドを実行します。$ oc get istiorevisions.sailoperator.io出力サンプル
NAME TYPE READY STATUS IN USE VERSION AGE default Local True Healthy True v1.24.3 3m33sサイドカーインジェクションを有効にするには、namespace にリビジョン名でラベルを付けます。
$ oc label namespace httpbin istio.io/rev=default
次のコマンドを実行して、
httpbinという名前のサンプルサービスをデプロイします。$ oc apply -n httpbin -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/httpbin/httpbin.yamlIstio
Gatewayリソースを定義するhttpbin-gw.yamlという名前の YAML ファイルを作成します。このリソースは、ホストhttpbin.example.comのポート 80 (HTTP) を公開するようにゲートウェイプロキシーを設定します。apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: httpbin-gateway namespace: httpbin spec: selector: istio: <gateway_name>1 servers: - port: number: 80 name: http protocol: HTTP hosts: - httpbin.example.com2 以下のコマンドを実行して、YAML ファイルを適用します。
$ oc apply -f httpbin-gw.yamlVirtualService用にhttpbin-vs.yamlという名前の YAML ファイルを作成します。VirtualServiceは、ゲートウェイプロキシーからhttpbinサービスにトラフィックをルーティングするルールを定義します。apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: httpbin namespace: httpbin spec: hosts: - httpbin.example.com1 gateways: - httpbin-gateway2 http: - match: - uri: prefix: /status - uri: prefix: /headers route: - destination:3 port: number: 8000 host: httpbin- 1
VirtualServiceのルーティングルールが適用されるhostsを指定します。指定されたhostsは、VirtualService がバインドされている IstioGatewayリソースによって公開される必要があります。- 2
Gateway名をゲートウェイのリストに追加して、前の手順で作成した IstioGatewayリソースにVirtualServiceをバインドします。- 3
httpbinServiceのhostとportを含むdestinationを定義して、一致するトラフィックを以前デプロイしたhttpbinサービスにルーティングします。
以下のコマンドを実行して、YAML ファイルを適用します。
$ oc apply -f httpbin-vs.yaml検証のために、次のコマンドを実行して
curlクライアントの namespace を作成します。$ oc create namespace curl次のコマンドを実行して
curlクライアントをデプロイします。$ oc apply -n curl -f https://raw.githubusercontent.com/openshift-service-mesh/istio/refs/heads/master/samples/curl/curl.yaml次のコマンドを実行して、
curlPod の名前でCURL_POD変数を設定します。$ CURL_POD=$(oc get pods -n curl -l app=curl -o jsonpath='{.items[*].metadata.name}')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応答には、リクエストが成功したことを示す
200 OK HTTPステータスが含まれます。出力例
HTTP/1.1 200 OK server: istio-envoy ...次のコマンドを実行して、
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応答では
404 Not Foundステータスが返されます。/getエンドポイントには、httpbinVirtualServiceリソース内に一致する URI 接頭辞がないため、これは予想された結果です。出力例
HTTP/1.1 404 Not Found server: istio-envoy ...ServiceタイプをLoadBalancerに設定して、ゲートウェイプロキシーをクラスター外部のトラフィックに公開します。$ oc patch service <gateway_name> -n <gateway_namespace> -p '{"spec": {"type": "LoadBalancer"}}'注記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}')クラスターが GCP または Azure 上で実行されている場合は、次のコマンドを実行して
INGRESS_HOST変数を設定します。$ INGRESS_HOST=$(oc get service <gateway_name> -n <gateway_namespace> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')次のコマンドを実行し、ゲートウェイのホストを使用して
httpbinサービスにcurlリクエストを送信します。$ curl -s -I -H Host:httpbin.example.com http://$INGRESS_HOST/headers
-
応答に
HTTP/1.1 200 OKステータスがあることを確認します。これは、リクエストが成功したことを示します。