首发于Service Mesh
Istio Egress 规则简介

Istio Egress 规则简介

前言

默认情况下,有 Istio 管理的服务是不能访问集群外部的 URL 的,因为由 Istio 管理的服务所有流量都会走 Sidecar 代理以方便管理,而这个代理默认只转发集群内部的流量,所有如果想要我们的应用访问集群外部的流量,我们需要进行一定的配置。

Egress 规则

我们可以通过配置 Egress 规则的方式,以让服务访问集群外部的 HTTP 、HTTPS、TCP 相关的服务(所有基于 TCP 的七层协议都可以通过配置 TCP 协议进行转发,UDP 的转发目前在官网还没有找到相关的文档)

HTTP Egress 规则

比如我们在应用中想要访问 `baidu.com` ,当我们在我们以 Istio 方式部署的应用中访问了该 URL 的时候,我们通过我们的应用日志可以看到应该会抛出 Connection refused 先关的错误,因为我们没有配置对于 `baidu.com` 的 Egress 规则,这样子 Sidecar 在转发流量的时候会找不到相应的内部服务而抛弃掉。对于这样的需求,我们可以通过配置一条对于 `baidu.com` 的 Egress 规则来达到我们的目的;

写出来应该是这样的:

apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
  name: baidu-egress-rule
spec:
  destination:
    service: www.baidu.com
  ports:
    - port: 80
      protocol: http

这样,当我们再在我们的应用中访问 `baidu.com` 时,就可以获取到正确的结果了。

HTTPS Egress 规则

当我们再访问配置 HTTPS 的 Egress 规则时,配置的方法与 HTTP 的规则是相同的,但是目前(istio version 0.6.0) 我们在应用中的访问方式会有所不同;比如我们想要访问 `baidu.com` ,我们的配置应该如下:

apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
  name: https-baidu-egress-rule
spec:
  destination:
    service: www.baidu.com
  ports:
    - port: 443
      protocol: https

但是我们在访问的时候不能直接使用 `baidu.com` 进行访问, 我们需要通过 `baidu.com:443` 来进行访问,这样虽然我们在应用内访问的是 HTTP 协议的地址,当时通过 service 名称与端口地址,Istio 代理能够根据 其进行对应并获取到我们配置中的相关协议,因为我们配置的时 `https` , 所以 Sidecar 代理将会对我们的访问链接进行 TLS 升级,从而达到使用 HTTPS 协议进行访问的需求。

TCP Egress 规则

在我们的应用中,我们通常需要访问数据库等相关的服务,这时我们可以通过配置 TCP Egress 规则,比如我们应用中需要访问 mongo ,我们的 mongo 地址是 `mongo://211.34.56.67:27017` , 我们 Egress 配置应该是这样子:

apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
  name: tcp-mongo-egress-rule
spec:
  destination:
    service: 211.34.56.67
  ports:
    - port: 27017
      protocol: tcp

对于 tcp 的 Egress 配置,我们可以适用于所有基于 TCP 的相关协议,包括 mongo, redis, http,https等,所以对于上面所述的 http 与 https 的相关配置,我们也可以通过配置 tcp 相关规则来进行配置, 同时对于 https 规则,我们通过配置 tcp 规则来进行配置的话, 可以达到直接在我们的应用中 使用 https 协议的 URL 进行访问,但是 TCP 的 service 配置只支持 CIDR notation 格式的 IP 地址, 所以如果我们想要通过 TCP 协议的配置来进行 HTTPS 协议的相关访问时,我们需要配置域名对应下的所有 IP ;

总结

当我们在刚开始进行一些 Istio 的测试的时候,如果发现某个在当前主机能访问的地址在我们的服务内无法访问时,我们可以通过查看我们是否配置了相关的规则来使代理可以转发到器群外的服务;如果没有,我们可以选择配置相关的 Egress 规则, 同时我们也可以通过在启动我们的 sidecar 代理是添加 `includeIPRanges` 来进行器群内流量倒流的选择,具体的实现实在我们利用 istioctl 注入相关 yaml 文件的时候加上 --includeIPRanges=10.0.0.1/24(该ip为我们集群内的ip,不是该ip段的ip都将被转发到器群外部) 参数。


关键词

  • istio 应用无法访问外部服务
  • istio 应用无法联网
  • istio 应用无法访问数据库

参考

控制Egress流量 · Istio官方文档中文版istio.doczh.cn
istio doc egressistio.io
istio doc tcp egressistio.io
编辑于 2018-03-31

文章被以下专栏收录