idou老師教你學Istio: 如何用Istio實現K8S Egress流量管理

雲容器大師發表於2018-11-22

本文主要介紹在使用Istio時如何訪問叢集外服務,即對出口流量的管理。

預設安裝的Istio是不能直接對叢集外部服務進行訪問的,如果需要將外部服務暴露給 Istio 叢集中的客戶端,目前有兩種方案:

1. 配置ServiceEntry

2. 配置global.proxy.includeIPRanges

配置serviceEntry訪問外部服務

ServiceEntry用於將額外的條目新增到Istio內部維護的服務登錄檔中,從而讓網格中自動發現的服務能夠訪問和路由到這些手動加入的服務。

ServiceEntry 描述了服務的屬性(DNS 名稱、VIP、埠、協議以及端點)。這類服務可能是網格外的 API,或者是處於網格內部但卻不存在於平臺的服務登錄檔中的條目(例如需要和 Kubernetes 服務溝通的一組虛擬機器服務)。

配置ServiceEntry 也很簡單,允許從網格內部訪問HTTP,HTTPS,Mongo,TCP等協議的外部服務。下面分別列舉了對外部TCP服務和HTTP服務的訪問配置。具體的ServiceEntry的配置引數定義可參考:

https://istio.io/docs/reference/config/istio.networking.v1alpha3/#ServiceEntry

外部TCP服務訪問配置示例:

apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata:  name: mysqlspec:  hosts:  - 192.168.0.245  ports:  - number: 3306    name: tcp    protocol: TCP

外部HTTP服務訪問配置示例:

apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata:  name: foo-extspec:  hosts:  - foo.com  ports:  - number: 80    name: http    protocol: HTTP

雖然社群推薦的方式是設定ServiceEntry來訪問外部服務,但如果叢集外需要訪問的服務很多,一個個配置起來就很麻煩,也不方便管理。

配置global.proxy.includeIPRanges

如果使用HELM安裝Istio, 可以在 Helm 中設定 global.proxy.includeIPRanges 變數為叢集clusterIP的範圍,然後進行安裝。

如果要對已經安裝好的Istio修改配置,需要修改名為 istio-sidecar-injector 的 Configmap的“-i”的取值為叢集clusterIP,稍後重啟所有服務的pod,重新注入sidecar。然後你會看到重啟後pod中的initContainers的-i引數值已經變為叢集clusterIP的範圍。

這種方式使得只有叢集內的IP通過sidecar,對外部服務的呼叫越過了 Istio sidecar proxy,讓服務可以直接訪問到對應的外部地址。

 

相比配置ServiceEntry,這種方式簡單對 Istio 進行全域性配置,就可以直接訪問所有外部服務。缺點是不能治理叢集外服務的訪問流量,比如不能對叢集外中介軟體服務進行熔斷限流;而且需要使用者瞭解雲供應商特定的知識和配置。

 

目前社群還沒有完美的解決方案,可參考討論:

https://groups.google.com/forum/#!searchin/istio-dev/serviceentry%7Csort:date/istio-dev/0RCt7Jqrcg8/7Ylrr4TABQAJ

 

相關文章