Ingress

Ingress トラフィックはクラスター外からメッシュへ入ってくるトラフィックのことを指します。 Kubernetes は Ingress トラフィックを扱う方法を LoadBalancer タイプIngress で提供しています。 Istio では、代わりに Gateway で Ingress トラフィック を管理することができます。

Gateway はクラスターへ到着するトラフィックのロードバランシングを担う Envoy プロキシです。Istio はパブリックIPを持ったデフォルトの IngressGateway をデプロイします。これを使用することで、サービスメッシュ内のアプリケーションをインターネットに公開することができます。

Istio の Gateway は Kubernetes の Igress に比べて2つの点で優れています。 Gateway は Envoy プロキシです。そのため Istio を使用することで、 East-West トラフィックと同じように Gateway トラフィックを扱うことができます(トラフィックスプリットやリダイレクト、リトライなど)。

また Gateways は、サイドカー と同じようにリクエストレートやエラーレートなどのメトリクスを転送します。これによりサービスグラフでIngress トラフィックを見ることや、クライアントに直接配信しているフロントエンドサービスの細かいSLOsを設定することができます。

では実際に Gateways を見てみましょう。

ingress

ここでは hello アプリケーションが Pod 内のコンテナとして動いています。Pod には Istio のサイドカープロキシが挿入されています。hello という Kubernetes のサービスがこの Pod に向けられています。hello.com から入ってくるトラフィックをこの hello サービスに向けたいと思います。

まず Istio デフォルトの IngressGateway 内に hello.com ドメインから名前解決された ポート 80 を開放する Gateway リソースが必要です。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: hello-gateway
spec:
  selector:
    istio: ingressgateway # デフォルトの IngressGateway を使用します
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "hello.com"

(注意: IngressGateway の外部IPアドレスに対しては自身でDNSの名前解決をする必要があります。

次に IngressGateway から default の Namespace にポート 80 で動いている hello のバックエンドサービスにトラフィックを向ける VirtualService を用意します。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: frontend-ingress
spec:
  hosts:
  - "hello.com"
  gateways:
  - hello-gateway
  http:
  - route:
    - destination:
        host: hello.default.svc.cluster.local
        port:
          number: 80