> 服務條目(Service Entry)是 Istio 重要的資源對象之一,作用是将外部的資源注冊到 Istio 内部的網格服務中來,以提供網格内對外部資源的更加精細化的控制。
#### 什麼情況下會用到 Service Entry
在服務調用過程中會使用到外部的服務,例如微信、支付寶的付款服務,這個服務和本身叢集内的服務無任何關系,通過服務條目将該服務注冊到 Istio 網格,在叢集内部就好像通路自身的服務一樣,結合虛拟服務、目标規則進而通過一些進階的治理能力,例如限流、重試等等對服務治理能力支援。
#### 通過例子來了解

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: baidu-se
spec:
hosts:
- www.baidu.com
location: MESH_EXTERNAL
ports:
- name: https
number: 443
protocol: HTTPS
resolution: DNS
将外部服務資源 www.baidu.com 注冊到 Istio 内部網格,通過 DNS 去解析該服務的域名。
通過用戶端容器執行 ``wget -q -O -
http://www.baidu.com``去測試結果。
#### 為外部服務添加服務重試能力
首先使用 Service Entry 将外部服務注冊到 Istio 叢集内部的網格中來
添加 VirtualService 進行重試規則的定義,以及DestinationRule 聲明流量的路由負載規則
模拟在傳回5xx的狀态碼時,服務可以重試以提高可用性
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: baidu-se
spec:
hosts:
- www.baidu.com
location: MESH_EXTERNAL
ports:
- name: https
number: 443
protocol: HTTPS
resolution: DNS
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: baidu-vs
spec:
hosts:
- www.baidu.com
http:
- route:
timeout: 200s
retries:
attempts: 15
perTryTimeout: 5s
retryOn: 5xx
- destination:
host: www.baidu.com
port:
number: 443
subset: tls-origination
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: baidu-dr
spec:
host: www.baidu.com
subsets:
- name: tls-origination
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE
``kubectl logs [serviceEntryPod] -c istio-proxy``
通過Sidecar日志可以發現,當服務調用失敗時,會自動的嘗試3次。
#### 手動指定錯誤的 DNS 解析值
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: baidu-se
spec:
hosts:
- www.baidu.com
location: MESH_EXTERNAL
ports:
- name: http
number: 80
protocol: HTTP
resolution: STATIC
endpoints:
- address: 1.2.3.4
如果在靜态指定了錯誤的解析值後,服務調用會失敗,除非一些特定的場景需要,建議還是通過DNS進行服務的域名解析。