您可以使用网关来管理网格的入站和出站流量,以指定您希望进入或离开网格的流量。网关配置应用于在网格边缘运行的独立Envoy代理,而不是与您的服务工作负载一起运行的sidecar Envoy代理。
与其他控制进入您系统的流量的机制(例如Kubernetes Ingress API)不同,Red Hat OpenShift Service Mesh网关使用流量路由的全部功能和灵活性。
Red Hat OpenShift Service Mesh网关资源可以使用4-6层负载均衡属性(例如端口)来公开和配置Red Hat OpenShift Service Mesh TLS设置。您可以将常规Red Hat OpenShift Service Mesh虚拟服务绑定到网关,并像管理服务网格中任何其他数据平面流量一样管理网关流量,而不是将应用程序层流量路由(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 Service Mesh中,入口网关允许将监控、安全和路由规则应用于进入集群的流量。使用服务网格网关来公开服务网格外部的服务。
确定入口IP和端口
入口配置取决于您的环境是否支持外部负载均衡器。外部负载均衡器在集群的入口IP和端口中设置。要确定集群的IP和端口是否已配置为外部负载均衡器,请运行以下命令。在此示例中,istio-system
是服务网格控制平面项目的名称。
$ oc get svc istio-ingressgateway -n istio-system
该命令返回命名空间中每个项目的NAME
、TYPE
、CLUSTER-IP
、EXTERNAL-IP
、PORT(S)
和AGE
。
如果设置了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"