3.2 イングレス・ゲートウェイの設定

Istioのイングレス・ゲートウェイによって、すべての着信トラフィックが通過するサービス・メッシュへのエントリ・ポイントを定義できます。イングレス・ゲートウェイを使用すると、外部クラスタからのサービスへのアクセスを管理できます。クラスタに進入するトラフィックについて、ルーティングのルールをモニターおよび設定できます。

この項では、イングレス・ゲートウェイの自動作成をNGINX Webサーバー・アプリケーションに構成する簡単な例を示します。この例では、ロード・バランサがlb.example.comで使用可能になっていて、TCPポート31380istio-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アプリケーション用のポートです。

イングレス・ゲートウェイを設定するには:

  1. 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
  2. デプロイメントのためのサービスを作成します。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
  3. このサービス用のイングレス・ゲートウェイを作成します。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"
  4. このイングレス・ゲートウェイ用の仮想サービスを作成します。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
  5. このアプリケーション用にmy-namespaceというネームスペースを設定して、プロキシ・サイドカーの自動インジェクションを有効にします。

    $ kubectl create namespace my-namespace
    $ kubectl label namespaces my-namespace istio-injection=enabled
  6. デプロイメント・サービス・イングレス・ゲートウェイおよび仮想サービスを実行します。

    $ 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
  7. イングレス・ゲートウェイが実行中になっていることは、次のコマンドを使用して確認できます

    $ kubectl get gateways.networking.istio.io -n my-namespace
    NAME               AGE
    my-nginx-gateway   33s
  8. 仮想サービスが実行中になっていることは、次のコマンドを使用して確認できます

    $ kubectl get virtualservices.networking.istio.io -n my-namespace
    NAME                      GATEWAYS             HOSTS                   AGE
    my-nginx-virtualservice   [my-nginx-gateway]   [mynginx.example.com]   107s
  9. イングレス・ゲートウェイがアプリケーションをロード・バランサに渡していることを確認するには、次のコマンドを使用します。

    $ 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