Istioのイングレス・ゲートウェイによって、すべての着信トラフィックが通過するサービス・メッシュへのエントリ・ポイントを定義できます。イングレス・ゲートウェイを使用すると、外部クラスタからのサービスへのアクセスを管理できます。クラスタに進入するトラフィックについて、ルーティングのルールをモニターおよび設定できます。
この項では、イングレス・ゲートウェイの自動作成をNGINX Webサーバー・アプリケーションに構成する簡単な例を示します。この例では、ロード・バランサがlb.example.com
で使用可能になっていて、TCP
ポート31380
のistio-ingressgateway
サービスに接続していることを前提とします。
istio-ingressgateway
サービスに使用可能なポートのリストは、次のコマンドを使用して取得できます。
$kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.100.106.173 <pending> 15020:30346/TCP,80:31380/TCP, 443:31390/TCP,31400:31400/TCP,15029:30235/TCP,15030:31293/TCP,15031:32585/TCP,15032:30816/TCP, 15443:30328/TCP 2d $kubectl describe svc istio-ingressgateway -n istio-system |grep http2
Port: http2 80/TCP NodePort: http2 31380/TCP
この出力は、istio-ingressgateway
サービスが、ポート80
からポート31380
にリクエストを転送していることを示しています。
ロード・バランサ・リスナーは、HTTP
ポート80
でリスニングするように設定されています。このポートは、この例の仮想サービスで使用されるNGINX Webアプリケーション用のポートです。
イングレス・ゲートウェイを設定するには:
NGINX Webサーバー・アプリケーションを作成するためのデプロイメント・ファイルを作成します。
my-nginx.yml
というファイルを作成します。このファイルには、次の内容を含めます。apiVersion: apps/v1 kind: Deployment metadata: labels: app: webserver name: my-nginx namespace: my-namespace spec: replicas: 3 selector: matchLabels: app: webserver template: metadata: labels: app: webserver spec: containers: - image: nginx name: my-nginx ports: - containerPort: 80
デプロイメントのためのサービスを作成します。
my-nginx-service.yml
という名前のファイルを作成します。このファイルには、次の内容を含めます。apiVersion: v1 kind: Service metadata: labels: app: my-nginx name: webserver namespace: my-namespace spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: webserver type: ClusterIP
このサービス用のイングレス・ゲートウェイを作成します。
my-nginx-gateway.yml
というファイルを作成します。このファイルには、次の内容を含めます。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-nginx-gateway namespace: my-namespace spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "mynginx.example.com"
このイングレス・ゲートウェイ用の仮想サービスを作成します。
my-nginx-virtualservice.yml
というファイルを作成します。このファイルには、次の内容を含めます。apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: my-nginx-virtualservice namespace: my-namespace spec: hosts: - "mynginx.example.com" gateways: - my-nginx-gateway http: - match: - uri: prefix: / route: - destination: port: number: 80 host: webserver
このアプリケーション用に
my-namespace
というネームスペースを設定して、プロキシ・サイドカーの自動インジェクションを有効にします。$
kubectl create namespace my-namespace
$kubectl label namespaces my-namespace istio-injection=enabled
デプロイメント・サービス・イングレス・ゲートウェイおよび仮想サービスを実行します。
$
kubectl apply -f my-nginx.yml
$kubectl apply -f my-nginx-service.yml
$kubectl apply -f my-nginx-gateway.yml
$kubectl apply -f my-nginx-virtualservice.yml
イングレス・ゲートウェイが実行中になっていることは、次のコマンドを使用して確認できます
$
kubectl get gateways.networking.istio.io -n my-namespace
NAME AGE my-nginx-gateway 33s仮想サービスが実行中になっていることは、次のコマンドを使用して確認できます
$
kubectl get virtualservices.networking.istio.io -n my-namespace
NAME GATEWAYS HOSTS AGE my-nginx-virtualservice [my-nginx-gateway] [mynginx.example.com] 107sイングレス・ゲートウェイがアプリケーションをロード・バランサに渡していることを確認するには、次のコマンドを使用します。
$
curl -I -HHost:mynginx.example.com lb.example.com:80/
HTTP/1.1 200 OK Date: Fri, 06 Mar 2020 00:39:16 GMT Content-Type: text/html Content-Length: 612 Connection: keep-alive last-modified: Tue, 03 Mar 2020 14:32:47 GMT etag: "5e5e6a8f-264" accept-ranges: bytes x-envoy-upstream-service-time: 15