Gateway在网格边缘接收外部访问,并将流量转发到网格内的服务。Istio通过Gateway将网格内的服务发布成外部可访问的服务,还可以通过Gateway配置外部访问的端口、协议及与内部服务的映射关系。
在istio中,同注入pod之间通讯是通过envoy进行路由的,但是普通pod与istio.pod、外网与istio.pod之间的通讯,有该如何进行那?如果使用k8s原生的service可以进行通讯,但是就无法使用istio中的路由转发、流量限制等功能。那么我们既想可以外网访问又可以使用istio中的功能,该怎么办那?Gatway解决了这个问题。
Gatway的原理与ingress基本类似,都是在内部部署了一个类似于nginx的组件,解析请求hosts然后转发到POD上。
接下来让我们看一下它的具体配置结构
type Gateway struct {
Servers []*Server
Selector map[string]string
}
标签选择器,这个我们并不陌生提供了多种标签过滤组件。
这里的作用是对POD进行过滤
提供了向外开放的端口以及传输协议、绑定hosts(这个将具体讲解)。
type Server struct {
//暴露的端口、使用的协议
Port *Port
Bind string
//设定请求的hosts,并且与virtualservice绑定,FQDN语法,作用过滤virtualservice中的hosts
Hosts []string
// tls设定
Tls *ServerTLSSettings
// 流量应该发送到的环回 IP 端点或 Unix 域套接字
DefaultEndpoint string
// 服务名称
Name string
}
接下来让我们重点讲解一下hosts机制
设定gatway公开的域名,通常用于http服务,但是也可以使用与TCP服务。
在istio中也有命名空间的概念,gatway在定义域名(主机)时可以指定作用于的命名空间,这样virtualserivce在使用的过程中就需要进行命名空间的判断。
gatway通过 namespace/ + 域名来设定命名空间,对于hosts来说可以使用FQDN格式,所以我们在日常使用过程时应该尽量使用FQDN格式进行配置。
让我们举个例子
hosts设置了prod/*.example.com,那么VirtualService在使用的过程中指定hosts时可以指定dev.example.com,prod.example.com这些的前提是VirtualService在prod命名空间下或者设置了exportTo。
当hosts设置为*或者.时 代表任何或当前命名空间,比如*/foo.example.com代表所有命名空间下的virtualService都可以使用该gatway
如果我们不设置命名空间的话,比如example.com,那么与.的效果一致
这里其实我们讲解的是ingress gatway(外部访问内部的过程)
那么内部向外部访问的过程又是怎么样的那?为什么内外访问需要两个工具,egress gatway又是什么那?这个让我们在下一章 service-entry 中进行讲解。