> 服务条目(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 number443 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 number443 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 attempts15 perTryTimeout 5s retryOn 5xx destination host www.baidu.com port number443 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 number443 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 number80 protocol HTTP resolution STATIC endpoints address1.2.3.4
如果在静态指定了错误的解析值后,服务调用会失败,除非一些特定的场景需要,建议还是通过DNS进行服务的域名解析。