Istio ServiceEntry 訪問外部服務
代理出站流量策略模式
Istio有一個安裝選項meshConfig.outboundTrafficPolicy.mode
,用於配置對外部服務(即Istio內部服務登錄檔中未定義的那些服務)的處理方式。如果此選項設定為ALLOW_ANY
,則Istio代理將允許對未知服務的呼叫。如果該選項設定為REGISTRY_ONLY
,則Istio代理將阻止在網格中未定義HTTP服務或ServiceEntry的任何主機。
預設情況下,ALLOW_ANY
為該配置項的預設值。
ServiceEntry
ServiceEntry是擴充套件Istio服務登錄檔的一種方式,以便現有的自動發現的服務可以訪問其他服務,無論它們是未發現的內部服務還是完全在網格外部的服務(例如,Web API)。
通過配置ServiceEntry,您可以管理在網格外部執行的服務的流量,包括以下功能:
- 重定向和轉發用於外部目標的流量,例如從網路使用的API或到舊基礎結構中服務的流量。
- 為外部目標定義重試,超時和故障注入策略。
- 通過將虛擬機器新增到網格中,在虛擬機器(VM)中執行網格服務。
- 在邏輯上將來自其他叢集的服務新增到網格,以在Kubernetes上配置多叢集Istio網格。
訪問一個外部的HTTP服務
1、部署之前先部署我們的sleep pod,作為網格內的工作負載。由於我們在之前的文章中已經部署完成,所以這裡略過。
kubectl get pods -n foo NAME READY STATUS RESTARTS AGE httpbin-779c54bf49-dqmgm 2/2 Running 0 27h sleep-d6b58ff57-jl8pq 2/2 Running 0 27h
2、建立一個 ServiceEntry
,以允許訪問一個外部的 HTTP 服務:
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: httpbin.org namespace: foo spec: hosts: - httpbin.org - www.httpbin.org ports:- number: 80 name: http protocol: HTTP exportTo: - "." resolution: DNS location: MESH_EXTERNAL
我們對該配置逐一欄位解析:
- hosts:DNS名稱。可以具有萬用字元字首。
- ports:關聯的埠。
- ports.protocol: 以下之一:HTTP,HTTPS,HTTP2,GRPC,MONGO,TCP或TLS。
- exportTo:預設情況下使用“*”,這意味著該ServiceEntry公開給每個名稱空間。 “.”僅將其限制為當前名稱空間。目前,exportTo值僅限於這兩個。
- resolution:主機的服務發現模式
- location:從網格的角度來看,應將此服務視為內部或外部服務。
這裡的欄位並不是ServiceEntry支援的所有欄位,更多請檢視官方文件。
DNS
解析在下面的服務條目中用作安全措。將解析設定為 NONE
會開啟了攻擊的可能。惡意客戶端在真正連線到其他IP時,可能會偽裝設定 HOST
頭資訊為 httpbin.org
(與 httpbin.org
不相關)。Istio sidecar 代理將信任 HOST 頭資訊,並錯誤地允許通訊,甚至將其傳遞到其他主機的 IP 地址。 該主機可能是惡意的站點,或者網格安全策略禁止的站點。
使用 DNS
解析,Sidecar 代理將忽略原始目標 IP 地址並引導流量到 httpbin.org
,並執行 DNS 查詢以獲取 httpbin.org
的IP地址。
3、從sleep的Pod內部,向http://httpbin.org外部服務的/delay
端點發出curl請求:
$ kubectl exec sleep-d6b58ff57-jl8pq -c sleep -n foo -- time curl -o /dev/null -s -w "%{http_code}\n" http://httpbin.org/delay/5 200 real 0m 5.70s user 0m 0.00s sys 0m 0.00s