前言
在Istio的世界里,如果想把外部的請求流量引入網格,你需要認識並會學會配置Istio Ingress Gateway
什么是Ingress Gateway
由於Kubernetes Ingress API只能支持最基本的HTTP路由,使用Kubernetes Ingress資源來配置外部流量的方式不能滿足需求。因此Istio v1alpha3 routing API引入新的Istio Ingress Gateway取代Kubernetes Ingress。
Gateway為HTTP/TCP流量配置了一個負載均衡,用於承載網格邊緣的進入和發出連接。在同一個網格中可以有多個不同的gateway存在。這一規范中描述了一系列開放端口,以及這些端口所使用的協議、負載均衡的 SNI 配置等內容。用戶可以利用標准的Istio 路由規則控制HTTP和TCP請求進入網格。
從下圖可以看到Istio gateway在整個網格中的使用情況:

如何配置Gateway控制Ingress流量
如果你已經安裝好了bookinfo的應用,為了能在外部訪問bookinfo中的productpage服務,只需要配置Gateway和相關的VirtualService。
用一個簡單的gateway配置一個負載均衡使訪問bookinfo.com的外部http流量能夠進入網格:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - hosts: - bookinfo.com port: number: 80 name: http protocol: HTTP
為了配置相應的路由,需要為相同的host定義一個VirtualService 並且用配置中gateways的字段綁定到剛才創建的Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - bookinfo.com gateways: - bookinfo-gateway # <---- 綁定gateway - mesh # <----對內部通信進行流量控制 http: - match: - uri: exact: /productpage route: - destination: host: productpage port: number: 9080
這樣就達到了在外網開放productpage服務的目的。
如何用HTTPS加密Gateway?
我們也可以為服務啟用TLS保護,以HTTPS的形式對網格外提供服務。
首先需要使用工具生成客戶端和服務器端的證書和密鑰。然后使用密鑰和證書作為輸入,創建一個Secret。
$ kubectl create -n istio-system secret tls istio -ingressgateway-certs --key key.pem --cert cert.p em
接下來修改Gateway對象,為Ingress gateway開放一個443端口,用於提供HTTPS服務:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - hosts: - bookinfo.com port: number: 80 name: http protocol: HTTP - hosts: - "*" port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE serverCertificate: /etc/istio/ingressgateway-certs/tls.crt privateKey: /etc/istio/ingressgateway-certs/tls.key
這樣簡單的配置就可以通過HTTPS協議訪問bookinfo.com了。
