服務條目
ServiceEntry
允許將額外的條目新增到 Istio 的內部服務註冊表中,以便網格中自動探索的服務可以存取/路由到這些手動指定的服務。服務條目描述服務的屬性 (DNS 名稱、VIP、埠、協定、端點)。這些服務可能在網格外部(例如,Web API),或網格內部的服務,但不是平台服務註冊表的一部分(例如,一組 VM 與 Kubernetes 中的服務通訊)。此外,服務條目的端點也可以使用 workloadSelector
欄位動態選取。這些端點可以是使用 WorkloadEntry
物件宣告的 VM 工作負載或 Kubernetes Pod。在單一服務下選取 Pod 和 VM 的能力,允許將服務從 VM 遷移到 Kubernetes,而無需變更與服務關聯的現有 DNS 名稱。
以下範例宣告了一些內部應用程式透過 HTTPS 存取的外部 API。邊車 (sidecar) 會檢查 ClientHello 訊息中的 SNI 值,以路由到適當的外部服務。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc-https
spec:
hosts:
- api.dropboxapi.com
- www.googleapis.com
- api.facebook.com
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: TLS
resolution: DNS
以下組態將一組在非託管虛擬機器上執行的 MongoDB 實例加入 Istio 的登錄檔中,以便將這些服務視為網格中的任何其他服務。關聯的 DestinationRule 用於啟動與資料庫實例的 mTLS 連線。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc-mongocluster
spec:
hosts:
- mymongodb.somedomain # not used
addresses:
- 192.192.192.192/24 # VIPs
ports:
- number: 27018
name: mongodb
protocol: MONGO
location: MESH_INTERNAL
resolution: STATIC
endpoints:
- address: 2.2.2.2
- address: 3.3.3.3
以及關聯的 DestinationRule
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: mtls-mongocluster
spec:
host: mymongodb.somedomain
trafficPolicy:
tls:
mode: MUTUAL
clientCertificate: /etc/certs/myclientcert.pem
privateKey: /etc/certs/client_private_key.pem
caCertificates: /etc/certs/rootcacerts.pem
以下範例結合了服務條目 (service entry) 和虛擬服務 (virtual service) 中的 TLS 路由,以根據 SNI 值將流量導向內部出口防火牆。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc-redirect
spec:
hosts:
- wikipedia.org
- "*.wikipedia.org"
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: TLS
resolution: NONE
以及關聯的 VirtualService,根據 SNI 值進行路由。
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: tls-routing
spec:
hosts:
- wikipedia.org
- "*.wikipedia.org"
tls:
- match:
- sniHosts:
- wikipedia.org
- "*.wikipedia.org"
route:
- destination:
host: internal-egress-firewall.ns1.svc.cluster.local
具有 TLS 比對的虛擬服務用於覆寫預設的 SNI 比對。在沒有虛擬服務的情況下,流量將會轉發到 wikipedia 網域。
以下範例示範了如何使用專用的出口閘道,所有外部服務流量都會透過該閘道轉發。「exportTo」欄位允許控制服務宣告對網格中其他命名空間的能見度。預設情況下,服務會匯出到所有命名空間。以下範例將能見度限制為目前命名空間,以「.」表示,因此其他命名空間無法使用它。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc-httpbin
namespace : egress
spec:
hosts:
- example.com
exportTo:
- "."
location: MESH_EXTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
定義一個閘道來處理所有出口流量。
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
namespace: istio-system
spec:
selector:
istio: egressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
以及關聯的 VirtualService
,以將流量從邊車路由到閘道服務 (istio-egressgateway.istio-system.svc.cluster.local
),以及從閘道路由到外部服務。請注意,虛擬服務已匯出到所有命名空間,使其能夠透過閘道路由流量到外部服務。強制流量通過像這樣受管理的的中間代理是一種常見的做法。
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: gateway-routing
namespace: egress
spec:
hosts:
- example.com
exportTo:
- "*"
gateways:
- mesh
- istio-egressgateway
http:
- match:
- port: 80
gateways:
- mesh
route:
- destination:
host: istio-egressgateway.istio-system.svc.cluster.local
- match:
- port: 80
gateways:
- istio-egressgateway
route:
- destination:
host: example.com
以下範例示範了如何在外部服務的主機中使用萬用字元。如果必須將連線路由到應用程式請求的 IP 位址 (例如,應用程式解析 DNS 並嘗試連線到特定的 IP),則解析模式必須設定為 NONE
。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc-wildcard-example
spec:
hosts:
- "*.bar.com"
location: MESH_EXTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: NONE
以下範例示範了一個可透過用戶端主機上的 Unix 網域套接字使用的服務。必須將解析設定為 STATIC 才能使用 Unix 位址端點。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: unix-domain-socket-example
spec:
hosts:
- "example.unix.local"
location: MESH_EXTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: STATIC
endpoints:
- address: unix:///var/run/example/socket
對於基於 HTTP 的服務,可以建立一個由多個可透過 DNS 定址的端點支援的 VirtualService
。在這種情況下,應用程式可以使用 HTTP_PROXY
環境變數,將 VirtualService
的 API 呼叫透明地重新路由到選擇的後端。例如,以下組態建立一個不存在的外部服務,名為 foo.bar.com,由三個網域支援:us.foo.bar.com:8080、uk.foo.bar.com:9080 和 in.foo.bar.com:7080。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: external-svc-dns
spec:
hosts:
- foo.bar.com
location: MESH_EXTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
endpoints:
- address: us.foo.bar.com
ports:
http: 8080
- address: uk.foo.bar.com
ports:
http: 9080
- address: in.foo.bar.com
ports:
http: 7080
使用 HTTP_PROXY=https://#/
時,從應用程式到 http://foo.bar.com
的呼叫將會在上述三個網域之間進行負載平衡。換句話說,對 http://foo.bar.com/baz
的呼叫將會轉換為 http://uk.foo.bar.com/baz
。
以下範例說明如何使用包含主體替代名稱的 ServiceEntry
,其格式符合 SPIFFE 標準
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: httpbin
namespace : httpbin-ns
spec:
hosts:
- example.com
location: MESH_INTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: STATIC
endpoints:
- address: 2.2.2.2
- address: 3.3.3.3
subjectAltNames:
- "spiffe://cluster.local/ns/httpbin-ns/sa/httpbin-service-account"
以下範例示範如何使用具有 workloadSelector
的 ServiceEntry
來處理將服務 details.bookinfo.com
從虛擬機器遷移到 Kubernetes 的過程。該服務有兩個基於虛擬機器的實例,帶有邊車,以及一組由標準部署物件管理的 Kubernetes Pod。網格中此服務的消費者將會在虛擬機器和 Kubernetes 之間自動進行負載平衡。
apiVersion: networking.istio.io/v1
kind: WorkloadEntry
metadata:
name: details-vm-1
spec:
serviceAccount: details
address: 2.2.2.2
labels:
app: details
instance-id: vm1
---
apiVersion: networking.istio.io/v1
kind: WorkloadEntry
metadata:
name: details-vm-2
spec:
serviceAccount: details
address: 3.3.3.3
labels:
app: details
instance-id: vm2
假設還有一個 Kubernetes 部署,其 Pod 標籤為 app: details
,使用相同的服務帳戶 details
,則以下服務條目宣告了一個跨越虛擬機器和 Kubernetes 的服務
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: details-svc
spec:
hosts:
- details.bookinfo.com
location: MESH_INTERNAL
ports:
- number: 80
name: http
protocol: HTTP
resolution: STATIC
workloadSelector:
labels:
app: details
服務條目
ServiceEntry 允許將其他條目加入 Istio 的內部服務登錄檔中。
服務埠
ServicePort 描述服務特定連接埠的屬性。
服務條目狀態
服務條目位址
較小的抽象概念,允許在相關時新增主機名稱
ServiceEntry.Location
位置指定服務是 Istio 網格的一部分還是位於網格外部。位置決定了多種功能的行為,例如服務對服務的 mTLS 驗證、原則強制執行等。當與網格外部的服務通訊時,Istio 的 mTLS 驗證會停用,並且原則強制執行是在用戶端執行,而不是在伺服器端執行。
名稱 | 描述 |
---|---|
MESH_EXTERNAL | 表示服務位於網格外部。通常用於表示透過 API 取用的外部服務。 |
MESH_INTERNAL | 表示服務是網格的一部分。通常用於表示明確加入,作為將服務網格擴展到包含非託管基礎結構的一部分的服務 (例如,新增至基於 Kubernetes 的服務網格的虛擬機器)。 |
ServiceEntry.Resolution
解析方式決定了代理伺服器如何解析與服務相關聯的網路端點的 IP 位址,以便將流量路由到其中一個端點。此處指定的解析模式不會影響應用程式如何解析與服務相關聯的 IP 位址。應用程式可能仍然需要使用 DNS 將服務解析為 IP,以便代理伺服器可以捕獲出站流量。或者,對於 HTTP 服務,應用程式可以直接與代理伺服器通訊(例如,通過設定 HTTP_PROXY)來與這些服務對話。
名稱 | 描述 |
---|---|
無 | 假設傳入的連線已經被解析(到特定的目標 IP 位址)。此類連線通常使用諸如 IP 表 REDIRECT/ eBPF 等機制通過代理伺服器路由。在執行任何與路由相關的轉換後,代理伺服器會將連線轉發到連線綁定的 IP 位址。 |
靜態 | 使用端點中指定的靜態 IP 位址(見下文)作為與服務關聯的後端實例。 |
DNS | 嘗試通過非同步查詢環境 DNS 來解析 IP 位址。如果未指定端點,代理伺服器將解析主機欄位中指定的 DNS 位址(如果未使用萬用字元)。如果指定了端點,則將解析端點中指定的 DNS 位址以確定目標 IP 位址。DNS 解析不能與 Unix 域套接字端點一起使用。 |
DNS_輪循 | 嘗試通過非同步查詢環境 DNS 來解析 IP 位址。與 |