Istio Egress 規則簡介
來自專欄 Service Mesh
前言
默認情況下,有 Istio 管理的服務是不能訪問集群外部的 URL 的,因為由 Istio 管理的服務所有流量都會走 Sidecar 代理以方便管理,而這個代理默認只轉發集群內部的流量,所有如果想要我們的應用訪問集群外部的流量,我們需要進行一定的配置。
Egress 規則
我們可以通過配置 Egress 規則的方式,以讓服務訪問集群外部的 HTTP 、HTTPS、TCP 相關的服務(所有基於 TCP 的七層協議都可以通過配置 TCP 協議進行轉發,UDP 的轉發目前在官網還沒有找到相關的文檔)
HTTP Egress 規則
比如我們在應用中想要訪問 `http://www.baidu.com` ,當我們在我們以 Istio 方式部署的應用中訪問了該 URL 的時候,我們通過我們的應用日誌可以看到應該會拋出 Connection refused 先關的錯誤,因為我們沒有配置對於 `http://www.baidu.com` 的 Egress 規則,這樣子 Sidecar 在轉發流量的時候會找不到相應的內部服務而拋棄掉。對於這樣的需求,我們可以通過配置一條對於 `http://www.baidu.com` 的 Egress 規則來達到我們的目的;
寫出來應該是這樣的:
apiVersion: config.istio.io/v1alpha2kind: EgressRulemetadata: name: baidu-egress-rulespec: destination: service: www.baidu.com ports: - port: 80 protocol: http
這樣,當我們再在我們的應用中訪問 `http://www.baidu.com` 時,就可以獲取到正確的結果了。
HTTPS Egress 規則
當我們再訪問配置 HTTPS 的 Egress 規則時,配置的方法與 HTTP 的規則是相同的,但是目前(istio version 0.6.0) 我們在應用中的訪問方式會有所不同;比如我們想要訪問 `https://www.baidu.com` ,我們的配置應該如下:
apiVersion: config.istio.io/v1alpha2kind: EgressRulemetadata: name: https-baidu-egress-rulespec: destination: service: www.baidu.com ports: - port: 443 protocol: https
但是我們在訪問的時候不能直接使用 `https://www.baidu.com` 進行訪問, 我們需要通過 `http://www.baidu.com:443` 來進行訪問,這樣雖然我們在應用內訪問的是 HTTP 協議的地址,當時通過 service 名稱與埠地址,Istio 代理能夠根據 其進行對應並獲取到我們配置中的相關協議,因為我們配置的時 `https` , 所以 Sidecar 代理將會對我們的訪問鏈接進行 TLS 升級,從而達到使用 HTTPS 協議進行訪問的需求。
TCP Egress 規則
在我們的應用中,我們通常需要訪問資料庫等相關的服務,這時我們可以通過配置 TCP Egress 規則,比如我們應用中需要訪問 mongo ,我們的 mongo 地址是 `mongo://211.34.56.67:27017` , 我們 Egress 配置應該是這樣子:
apiVersion: config.istio.io/v1alpha2kind: EgressRulemetadata: name: tcp-mongo-egress-rulespec: destination: service: 211.34.56.67 ports: - port: 27017 protocol: tcp
對於 tcp 的 Egress 配置,我們可以適用於所有基於 TCP 的相關協議,包括 mongo, redis, http,https等,所以對於上面所述的 http 與 https 的相關配置,我們也可以通過配置 tcp 相關規則來進行配置, 同時對於 https 規則,我們通過配置 tcp 規則來進行配置的話, 可以達到直接在我們的應用中 使用 https 協議的 URL 進行訪問,但是 TCP 的 service 配置只支持 CIDR notation 格式的 IP 地址, 所以如果我們想要通過 TCP 協議的配置來進行 HTTPS 協議的相關訪問時,我們需要配置域名對應下的所有 IP ;
總結
當我們在剛開始進行一些 Istio 的測試的時候,如果發現某個在當前主機能訪問的地址在我們的服務內無法訪問時,我們可以通過查看我們是否配置了相關的規則來使代理可以轉發到器群外的服務;如果沒有,我們可以選擇配置相關的 Egress 規則, 同時我們也可以通過在啟動我們的 sidecar 代理是添加 `includeIPRanges` 來進行器群內流量倒流的選擇,具體的實現實在我們利用 istioctl 注入相關 yaml 文件的時候加上 --includeIPRanges=10.0.0.1/24(該ip為我們集群內的ip,不是該ip段的ip都將被轉發到器群外部)
參數。
關鍵詞
- istio 應用無法訪問外部服務
- istio 應用無法聯網
- istio 應用無法訪問資料庫
參考
控制Egress流量 · Istio官方文檔中文版istio doc egressistio doc tcp egress
推薦閱讀: