Istio ServiceEntry 引入外部服務

概念及示例

使用服務入口Service Entry來添加一個入口到 Istio 內部維護的服務註冊中心。添加了服務入口後,Envoy 代理能夠向服務發送流量,就好像它是網格內部的服務同樣。配置服務入口容許您管理運行在網格外的服務的流量,它包括如下幾種能力:html

  • 爲外部目標 redirect 和轉發請求,例如來自 web 端的 API 調用,或者流向遺留老系統的服務。
  • 爲外部目標定義重試、超時和故障注入策略。
  • 添加一個運行在虛擬機的服務來擴展您的網格。
  • 從邏輯上添加來自不一樣集羣的服務到網格,在 Kubernetes 上實現一個多集羣 Istio 網格

您不須要爲網格服務要使用的每一個外部服務都添加服務入口。默認狀況下,Istio 配置 Envoy 代理會將請求傳遞給未知服務。可是,您不能使用 Istio 的特性來控制沒有在網格中註冊的目標流量。web

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: svc-entry
spec:
  hosts:
  - ext-svc.example.com
  ports:
  - number: 443
    name: https
    protocol: HTTPS
  location: MESH_EXTERNAL
  resolution: DNS

您指定的外部資源使用 hosts 字段。可使用徹底限定名或通配符做爲前綴域名。api

您能夠配置虛擬服務和目標規則,以更細粒度的方式控制到服務入口的流量,這與網格中的任何其餘服務配置流量的方式相同。例如,下面的目標規則配置流量路由以使用雙向 TLS 來保護到 ext-svc.example.com 外部服務的鏈接,咱們使用服務入口配置了該外部服務:安全

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-httpbin
  namespace : egress
spec:
  hosts:
  - httpbin.com
  exportTo:
  - "."
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: DNS

ServiceEntry配置

Field Type Description Required
hosts string[] 綁定到 ServiceEntry 上的主機名。能夠是一個帶有通配符前綴的 DNS 名稱。若是服務不是 HTTP 協議的,例如 mongo、TCP 以及 HTTPS 中,hosts 中的 DNS 名稱會被忽略,這種狀況下會使用 endpoints 中的 address 以及 port 來甄別調用目標。 Yes
addresses string[] 服務相關的虛擬 IP。能夠是 CIDR 前綴。對 HTTP 服務來講,這一字段會被忽略,而會使用 HTTP 的 HOST/Authority Header。而對於非 HTTP 服務,例如 mongo、TCP 以及 HTTPS 中,這些主機會被忽略。若是指定了一個或者多個 IP 地址,對於在列表範圍內的 IP 的訪問會被斷定爲屬於這一服務。若是地址字段爲空,服務的鑑別就只能靠目標端口了。在這種狀況下,被訪問服務的端口必定不能和其餘網格內的服務進行共享。換句話說,這裏的 Sidecar 會簡單的作爲 TCP 代理,將特定端口的訪問轉發到指定目標端點的 IP、主機上去。就沒法支持 Unix socket 了。 No
ports Port[] 和外部服務關聯的端口。若是 endpoints 是 Unix socket 地址,這裏必須只有一個端口。 Yes
location Location 用於指定該服務的位置,屬於網格內部仍是外部。 No
resolution Resolution 主機的服務發現模式。在沒有附帶 IP 地址的狀況下,爲 TCP 端口設置解析模式爲 NONE 時必須當心。在這種狀況下,對任何 IP 的指定端口的流量都是容許的(例如 0.0.0.0:)。 Yes
endpoints Endpoint[] 一個或者多個關聯到這一服務的 endpoint No
exportTo string[] 此服務導出到的名稱空間列表。導出服務容許它被其餘名稱空間中定義的邊車,網關和虛擬服務使用。此功能爲服務全部者和網格管理員提供了一種機制,能夠控制跨名稱空間邊界的服務的可見性。 若是未指定名稱空間,則默認狀況下會將服務導出到全部名稱空間 No
subjectAltNames string[] 實施此服務的工做負載實例容許使用的使用者備用名稱列表。此信息用於強制執行安全命名。若是指定,則代理將驗證服務器證書的使用者備用名稱是否與指定值之一匹配。 No

ServiceEntry.Location

Name Description
MESH_EXTERNAL 表示服務在網格外部。一般用於指示經過API使用的外部服務。
MESH_INTERNAL 表示服務是網格的一部分。一般用於指示在擴展服務網格以包括不受管理的基礎架構時顯式添加的服務

具體細節的參數明細可查閱: https://preliminary.istio.io/zh/docs/reference/config/networking/service-entry服務器

參考文獻

https://preliminary.istio.io/zh/docs/concepts/traffic-management/#service-entries架構

https://preliminary.istio.io/zh/docs/reference/config/networking/service-entrysocket

https://skyao.io/learning-istio/crd/network/serviceentry.htmlide

相關文章
相關標籤/搜索