idou教你学Istio10 : 如何用Istio实现K8S Egress流量管理
上一篇我們了解了如何控制入口流量,本文主要介紹在使用Istio時如何訪問集群外服務(wù),即對出口流量的管理。
默認安裝的Istio是不能直接對集群外部服務(wù)進行訪問的,如果需要將外部服務(wù)暴露給 Istio 集群中的客戶端,目前有兩種方案:
1. 配置ServiceEntry
2. 配置global.proxy.includeIPRanges
配置serviceEntry訪問外部服務(wù)
ServiceEntry用于將額外的條目添加到Istio內(nèi)部維護的服務(wù)注冊表中,從而讓網(wǎng)格中自動發(fā)現(xiàn)的服務(wù)能夠訪問和路由到這些手動加入的服務(wù)。
ServiceEntry 描述了服務(wù)的屬性(DNS 名稱、VIP、端口、協(xié)議以及端點)。這類服務(wù)可能是網(wǎng)格外的 API,或者是處于網(wǎng)格內(nèi)部但卻不存在于平臺的服務(wù)注冊表中的條目(例如需要和 Kubernetes 服務(wù)溝通的一組虛擬機服務(wù))。
配置ServiceEntry 也很簡單,允許從網(wǎng)格內(nèi)部訪問HTTP,HTTPS,Mongo,TCP等協(xié)議的外部服務(wù)。下面分別列舉了對外部TCP服務(wù)和HTTP服務(wù)的訪問配置。具體的ServiceEntry的配置參數(shù)定義可參考:
https://istio.io/docs/reference/config/istio.networking.v1alpha3/#ServiceEntry
外部TCP服務(wù)訪問配置示例:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mysql
spec:
hosts:
- 192.168.0.245
ports:
- number: 3306
name: tcp
protocol: TCP
外部HTTP服務(wù)訪問配置示例:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: foo-ext
spec:
hosts:
- foo.com
ports:
- number: 80
name: http
protocol: HTTP
雖然社區(qū)推薦的方式是設(shè)置ServiceEntry來訪問外部服務(wù),但如果集群外需要訪問的服務(wù)很多,一個個配置起來就很麻煩,也不方便管理。
配置global.proxy.includeIPRanges
如果使用HELM安裝Istio, 可以在 Helm 中設(shè)置 global.proxy.includeIPRanges 變量為集群clusterIP的范圍,然后進行安裝。
如果要對已經(jīng)安裝好的Istio修改配置,需要修改名為 istio-sidecar-injector 的 Configmap的“-i”的取值為集群clusterIP,稍后重啟所有服務(wù)的pod,重新注入sidecar。然后你會看到重啟后pod中的initContainers的-i參數(shù)值已經(jīng)變?yōu)榧篶lusterIP的范圍。
這種方式使得只有集群內(nèi)的IP通過sidecar,對外部服務(wù)的調(diào)用越過了 Istio sidecar proxy,讓服務(wù)可以直接訪問到對應(yīng)的外部地址。
相比配置ServiceEntry,這種方式簡單對 Istio 進行全局配置,就可以直接訪問所有外部服務(wù)。但缺點是不能治理集群外服務(wù)的訪問流量,比如不能對集群外中間件服務(wù)進行熔斷限流;而且需要用戶了解云供應(yīng)商特定的知識和配置。
目前社區(qū)還沒有完美的解決方案,可參考討論:
https://groups.google.com/forum/#!searchin/istio-dev/serviceentry%7Csort:date/istio-dev/0RCt7Jqrcg8/7Ylrr4TABQAJ
總結(jié)
以上是生活随笔為你收集整理的idou教你学Istio10 : 如何用Istio实现K8S Egress流量管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PM_LOG
- 下一篇: 深入浅出Attribute(二)