服务条目(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进行服务的域名解析。