1. 程式人生 > 其它 >Istio ServiceEntry 訪問外部服務

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內部,向外部服務的/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

訪問外部 HTTPS 服務