Istio - crds - Service Entry

> 服务条目(Service Entry)是 Istio 重要的资源对象之一,作用是将外部的资源注册到 Istio 内部的网格服务中来,以提供网格内对外部资源的更加精细化的控制。



#### 什么情况下会用到 Service Entry

在服务调用过程中会使用到外部的服务,例如微信、支付宝的付款服务,这个服务和本身集群内的服务无任何关系,通过服务条目将该服务注册到 Istio 网格,在集群内部就好像访问自身的服务一样,结合虚拟服务、目标规则进而通过一些高级的治理能力,例如限流、重试等等对服务治理能力支持。


#### 通过例子来理解

Istio - crds - Service Entry

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的状态码时,服务可以重试以提高可用性

Istio - crds - Service Entry

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


上一篇:Elasticsearch Mapping & Setting


下一篇:[Head First设计模式]生活中学设计模式——外观模式