您可以使用网关来管理网格的入站和出站流量,以指定要进入或离开网格的流量。网关配置应用于在网格边缘运行的独立 Envoy 代理,而不是与服务工作负载一起运行的 Sidecar Envoy 代理。
与其他控制进入系统的流量的机制(例如 Kubernetes Ingress API)不同,Red Hat OpenShift 服务网格网关使用流量路由的全部功能和灵活性。
Red Hat OpenShift 服务网格网关资源可以使用第 4-6 层负载均衡属性(例如端口)来公开和配置 Red Hat OpenShift 服务网格 TLS 设置。您可以将常规 Red Hat OpenShift 服务网格虚拟服务绑定到网关,并像管理服务网格中的任何其他数据平面流量一样管理网关流量,而不是将应用程序层流量路由 (L7) 添加到同一 API 资源。
网关主要用于管理入口流量,但您也可以配置出口网关。出口网关允许您为离开网格的流量配置专用出口节点。这使您可以限制哪些服务可以访问外部网络,从而为您的服务网格添加安全控制。您也可以使用网关配置纯内部代理。
网关示例
网关资源描述在网格边缘运行的负载均衡器,接收传入或传出的 HTTP/TCP 连接。规范描述了一组应公开的端口、要使用的协议类型、负载均衡器的 SNI 配置等等。
以下示例显示了外部 HTTPS 入口流量的样本网关配置
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ext-host-gwy
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- ext-host.example.com
tls:
mode: SIMPLE
serverCertificate: /tmp/tls.crt
privateKey: /tmp/tls.key
此网关配置允许来自 `ext-host.example.com` 的 HTTPS 流量在端口 443 上进入网格,但不指定任何流量路由。
要指定路由并使网关按预期工作,您还必须将网关绑定到虚拟服务。您可以使用虚拟服务的 gateways 字段来执行此操作,如下例所示
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtual-svc
spec:
hosts:
- ext-host.example.com
gateways:
- ext-host-gwy
管理入口流量
在 Red Hat OpenShift 服务网格中,入口网关使监控、安全和路由规则等功能能够应用于进入集群的流量。使用服务网格网关来公开服务网格外部的服务。
确定入口 IP 和端口
入口配置取决于您的环境是否支持外部负载均衡器。外部负载均衡器会在集群的入口 IP 和端口中设置。要确定集群的 IP 和端口是否配置了外部负载均衡器,请运行以下命令。在此示例中,istio-system
是服务网格控制平面项目的名称。
$ oc get svc istio-ingressgateway -n istio-system
该命令将返回命名空间中每个项目的名称
、类型
、集群IP
、外部IP
、端口
和年龄
。
如果设置了EXTERNAL-IP
值,则您的环境具有可用于入口网关的外部负载均衡器。
如果EXTERNAL-IP
值为<none>
或持续为<pending>
,则您的环境不为入口网关提供外部负载均衡器。
使用负载均衡器确定入口端口
如果您的环境具有外部负载均衡器,请按照以下说明操作。
步骤
-
运行以下命令设置入口 IP 和端口。此命令将在您的终端中设置一个变量。
$ export INGRESS_HOST=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
-
运行以下命令设置入口端口。
$ export INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
-
运行以下命令设置安全入口端口。
$ export SECURE_INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
-
运行以下命令设置 TCP 入口端口。
$ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
|
在某些环境中,负载均衡器可以使用主机名而不是 IP 地址公开。在这种情况下,入口网关的EXTERNAL-IP 值不是 IP 地址。相反,它是一个主机名,之前的命令无法设置INGRESS_HOST 环境变量。
在这种情况下,请使用以下命令更正INGRESS_HOST 值
|
$ export INGRESS_HOST=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
在没有负载均衡器的情况下确定入口端口
如果您的环境没有外部负载均衡器,请确定入口端口并改用节点端口。
步骤
-
设置入口端口。
$ export INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
-
运行以下命令设置安全入口端口。
$ export SECURE_INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
-
运行以下命令设置 TCP 入口端口。
$ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].nodePort}')
配置入口网关
入口网关是在网格边缘运行的负载均衡器,它接收传入的 HTTP/TCP 连接。它配置公开的端口和协议,但不包含任何流量路由配置。入口流量的流量路由与内部服务请求的流量路由方式相同,都是使用路由规则配置的。
以下步骤演示如何创建一个网关并配置一个VirtualService
,以将Bookinfo示例应用程序中的服务公开给外部流量,路径为/productpage
和/login
。
步骤
-
创建一个网关来接受流量。
-
创建一个YAML文件,并将以下YAML复制到其中。
网关示例 gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
-
应用YAML文件。
$ oc apply -f gateway.yaml
-
创建一个VirtualService
对象来重写主机头。
-
创建一个YAML文件,并将以下YAML复制到其中。
虚拟服务示例
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
-
应用YAML文件。
-
测试网关和VirtualService是否已正确设置。
-
设置网关URL。
export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
-
设置端口号。在此示例中,istio-system
是服务网格控制平面项目的名称。
export TARGET_PORT=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.port.targetPort}')
-
测试已明确公开的页面。
curl -s -I "$GATEWAY_URL/productpage"