上一篇咱们了解了如何控制入口流量,本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理。mysql
默认安装的Istio是不能直接对集群外部服务进行访问的,若是须要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案:sql
1. 配置ServiceEntryapi
2. 配置global.proxy.includeIPRangestcp
配置serviceEntry访问外部服务ide
ServiceEntry用于将额外的条目添加到Istio内部维护的服务注册表中,从而让网格中自动发现的服务可以访问和路由到这些手动加入的服务。google
ServiceEntry 描述了服务的属性(DNS 名称、VIP、端口、协议以及端点)。这类服务多是网格外的 API,或者是处于网格内部但却不存在于平台的服务注册表中的条目(例如须要和 Kubernetes 服务沟通的一组虚拟机服务)。.net
配置ServiceEntry 也很简单,容许从网格内部访问HTTP,HTTPS,Mongo,TCP等协议的外部服务。下面分别列举了对外部TCP服务和HTTP服务的访问配置。具体的ServiceEntry的配置参数定义可参考:code
https://istio.io/docs/reference/config/istio.networking.v1alpha3/#ServiceEntry中间件
外部TCP服务访问配置示例:路由
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: mysql spec: hosts: - 192.168.0.245 ports: - number: 3306 name: tcp protocol: TCP
外部HTTP服务访问配置示例:
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: foo-ext spec: hosts: - foo.com ports: - number: 80 name: http protocol: HTTP
虽然社区推荐的方式是设置ServiceEntry来访问外部服务,但若是集群外须要访问的服务不少,一个个配置起来就很麻烦,也不方便管理。
配置global.proxy.includeIPRanges
若是使用HELM安装Istio, 能够在 Helm 中设置 global.proxy.includeIPRanges 变量为集群clusterIP的范围,而后进行安装。
若是要对已经安装好的Istio修改配置,须要修更名为 istio-sidecar-injector 的 Configmap的“-i”的取值为集群clusterIP,稍后重启全部服务的pod,从新注入sidecar。而后你会看到重启后pod中的initContainers的-i参数值已经变为集群clusterIP的范围。
这种方式使得只有集群内的IP经过sidecar,对外部服务的调用越过了 Istio sidecar proxy,让服务能够直接访问到对应的外部地址。
相比配置ServiceEntry,这种方式简单对 Istio 进行全局配置,就能够直接访问全部外部服务。但缺点是不能治理集群外服务的访问流量,好比不能对集群外中间件服务进行熔断限流;并且须要用户了解云供应商特定的知识和配置。
目前社区尚未完美的解决方案,可参考讨论:
https://groups.google.com/forum/#!searchin/istio-dev/serviceentry%7Csort:date/istio-dev/0RCt7Jqrcg8/7Ylrr4TABQAJ