Gateway
Gateway,一个运行在网格边缘的负载均衡器,定义了所有 HTTP/TCP 流量进出服务网格的统一进出口。它描述了一组对外公开的端口、协议、负载均衡、以及 SNI 配置。
Istio Gateway 包括 Ingress Gateway 与 Egress Gateway,分别用来配置网格的入口流量与出口流量。Ingress Gateway 使用 istio-ingressgateway 负载均衡器来代理流量,而 istio-ingressgateway 实际上是一个 Envoy 代理。

示例
一个简单示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- uk.bookinfo.com
- eu.bookinfo.com
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- uk.bookinfo.com
- eu.bookinfo.com
tls:
mode: SIMPLE # enables HTTPS on this port
serverCertificate: /etc/certs/servercert.pem
privateKey: /etc/certs/privatekey.pem
- port:
number: 9443
name: https-9443
protocol: HTTPS
hosts:
- "bookinfo-namespace/*.bookinfo.com"
tls:
mode: SIMPLE # enables HTTPS on this port
credentialName: bookinfo-secret # fetches certs from Kubernetes secret
- port:
number: 9080
name: http-wildcard
protocol: HTTP
hosts:
- "ns1/*"
- "ns2/foo.bar.com"
- port:
number: 2379 # to expose internal service via external port 2379
name: mongo
protocol: MONGO
hosts:
- "*"
该示例中, Gateway 被引用在 some-config-namespace 这个 Namespace 下,并使用 label my-gateway-controller 来关联部署网络代理的 Pod ,对外公开了 80、443、9443、9080、2379 端口的服务。
- 80 端口:附属配置的
host为uk.bookinfo.com,eu.bookinfo.com,同时在tls中配置了httpsRedirect。如果使用HTTP1.1协议访问将会返回 301,要求使用HTTPS访问,通过这种配置变相的禁止了对uk.bookinfo.com,eu.bookinfo.com域名的HTTP1.1协议的访问入口。 - 443 端口:提供
TLS/HTTPS的访问,表示接受uk.bookinfo.com,eu.bookinfo.com域名的HTTPS协议的访问,protocol属性指定了协议类型。在tls的配置中指定了会话模式为单向TLS(mode: SIMPLE) ,同时指定了服务端证书和私钥的存放地址。 - 9443 端口:提供
TLS/HTTPS的访问,与 443 端口不同的是证书不是指定存放证书文件的地址,而是通过credentialName属性配置从Kubernetes的证书管理中心拉取证书。 - 9080 端口:提供简单的
HTTP1.1协议的访问。hosts中配置了ns1/*与ns2/foo.bar.com,表示只允许ns1Namespace下的VirtualService绑定它以及ns2Namespace下配置了host为foo.bar.com的VirtualService绑定它。 - 2379 端口:提供
MONGO协议的访问,允许所有host绑定它。
Egress Gateway 提供了对网格的出口流量进行统一管控的功能,在安装 Istio 时默认是不开启的。可以使用以下命令查看是否开启:
kubectl get pod -l istio=egressgateway -n istio-system
若没有开启,使用以下命令添加。
istioctl manifest apply --set values.global.istioNamespace=istio-system \
--set values.gateways.istio-egressgateway.enabled=true
Egress Gateway 的一个简单示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: egressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- edition.cnn.com
可以看出,与 Ingress Gateway不同,Egress Gateway 使用有 istio: egressgateway 标签的 Pod 来代理流量,实际上这是一个 Envoy 代理。当网格内部需要访问 edition.cnn.com 这个地址时,流量将会统一先转发到 Egress Gateway 上,再由 Egress Gateway 将流量转发到 edition.cnn.com 上。