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

上一篇咱們瞭解瞭如何控制入口流量,本文主要介紹在使用Istio時如何訪問集羣外服務,即對出口流量的管理。mysql

默認安裝的Istio是不能直接對集羣外部服務進行訪問的,若是須要將外部服務暴露給 Istio 集羣中的客戶端,目前有兩種方案:sql

1. 配置ServiceEntryapi

2. 配置global.proxy.includeIPRangestcp

 

配置serviceEntry訪問外部服務ide

ServiceEntry用於將額外的條目添加到Istio內部維護的服務註冊表中,從而讓網格中自動發現的服務可以訪問和路由到這些手動加入的服務。google

ServiceEntry 描述了服務的屬性(DNS 名稱、VIP、端口、協議以及端點)。這類服務多是網格外的 API,或者是處於網格內部但卻不存在於平臺的服務註冊表中的條目(例如須要和 Kubernetes 服務溝通的一組虛擬機服務)。.net

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

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

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

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mysql
spec:
  hosts:  
  - 192.168.0.245  
  ports:  
  - number: 3306    
    name: tcp    
    protocol: TCP

 

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

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: foo-ext
spec:
  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

相關文章
相關標籤/搜索