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 を見てみましょう。
ここでは 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