2.14. 管理服务网格中的流量
使用 Red Hat OpenShift Service Mesh,您可以控制服务间的流量和 API 调用流。服务网格中的一些服务可能需要在网格内进行通信,其他服务则需要隐藏。您可以管理流量来隐藏特定后端服务、公开服务、创建测试或版本部署,或者在一组服务中添加安全层。
2.14.1. 使用网关
您可以使用网关来管理入站和出站流量,以指定您想要进入或离开网格的流量。网关配置适用于在网格边缘运行的独立的 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 进入网格,但没有为流量指定路由。
要指定路由并让网关按预期工作,还必须将网关绑定到虚拟服务。您可以使用虚拟服务的网关字段进行此操作,如下例所示:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: virtual-svc spec: hosts: - ext-host.example.com gateways: - ext-host-gwy
然后,您可以使用外部流量的路由规则配置虚拟服务。
2.14.1.1. 启用网关注入
网关配置适用于在网格边缘运行的独立的 Envoy 代理,而不是与您的服务负载一同运行的 sidecar Envoy 代理。因为网关是 Envoy 代理,所以您可以将 Service Mesh 配置为自动注入网关,类似于您可以注入 sidecar。
使用自动注入网关,您可以部署和管理独立于 ServiceMeshControlPlane
资源的网关,并使用用户应用程序管理网关。对网关部署使用自动注入可让开发人员完全控制网关部署,同时简化操作。当有新的升级可用时,或者配置已更改,您可以重启网关 pod 来更新它们。这样做使运行网关部署的体验与操作 sidecar 相同。
ServiceMeshControlPlane
命名空间(如 istio-system
命名空间)默认禁用注入。作为安全最佳实践,在与 control plane 不同的命名空间中部署网关。
2.14.1.2. 部署自动网关注入
在部署网关时,您必须通过将注入标签或注解添加到网关 deployment
对象来选择注入。以下示例部署了网关。
前提条件
-
命名空间必须是网格的成员,方法是在
ServiceMeshMemberRoll
中定义或创建ServiceMeshMember
资源。
流程
为 Istio ingress 网关设置唯一标签。需要此设置以确保网关可以选择工作负载。这个示例使用
ingressgateway
作为网关的名称。apiVersion: v1 kind: Service metadata: name: istio-ingressgateway namespace: istio-ingress spec: type: ClusterIP selector: istio: ingressgateway ports: - name: http2 port: 80 targetPort: 8080 - name: https port: 443 targetPort: 8443 --- apiVersion: apps/v1 kind: Deployment metadata: name: istio-ingressgateway namespace: istio-ingress spec: selector: matchLabels: istio: ingressgateway template: metadata: annotations: inject.istio.io/templates: gateway labels: istio: ingressgateway sidecar.istio.io/inject: "true" 1 spec: containers: - name: istio-proxy image: auto 2
设置角色以允许读取 TLS 的凭据。
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: istio-ingressgateway-sds namespace: istio-ingress rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: istio-ingressgateway-sds namespace: istio-ingress roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: istio-ingressgateway-sds subjects: - kind: ServiceAccount name: default
从集群外部授予新网关的访问权限,在将
spec.security.manageNetworkPolicy
设置为true
时是必需的。apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: gatewayingress namespace: istio-ingress spec: podSelector: matchLabels: istio: ingressgateway ingress: - {} policyTypes: - Ingress
入口流量增加时自动缩放 pod。这个示例将最小副本设置为
2
,最大副本设置为5
。它还会在利用率达到 80% 时创建另一个副本。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: labels: istio: ingressgateway release: istio name: ingressgatewayhpa namespace: istio-ingress spec: maxReplicas: 5 metrics: - resource: name: cpu target: averageUtilization: 80 type: Utilization type: Resource minReplicas: 2 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: istio-ingressgateway
指定节点上必须运行的最小 pod 数量。本例确保当 pod 在新节点上重启时有一个副本正在运行。
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: labels: istio: ingressgateway release: istio name: ingressgatewaypdb namespace: istio-ingress spec: minAvailable: 1 selector: matchLabels: istio: ingressgateway
2.14.1.3. 管理入口流量
在 Red Hat OpenShift Service Mesh 中,Ingress Gateway 允许监控、安全性和路由规则等功能应用到进入集群的流量。使用 Service Mesh 网关在服务网格外公开服务。
2.14.1.3.1. 决定入口 IP 和端口
入口配置根据您的环境是否支持外部负载均衡器而有所不同。在集群的入口 IP 和端口中设置一个外部负载均衡器。要确定是否为外部负载均衡器配置了集群的 IP 和端口,请运行以下命令。在本例中,istio-system
是 Service Mesh control plane 项目的名称。
$ oc get svc istio-ingressgateway -n istio-system
该命令会返回命名空间中每个项目的 NAME
、TYPE
、CLUSTER-IP
、EXTERNAL-IP
、PORT(S)
和 AGE
。
如果设置了 EXTERNAL-IP
值,您的环境会有一个外部负载均衡器,供您用于入口网关。
如果 EXTERNAL-IP
值是 <none>
,或 <pending>
,则您的环境不会为入口网关提供外部负载均衡器。
2.14.1.3.1.1. 使用负载均衡器确定入口端口
如果您的环境有外部负载均衡器,请按照以下步骤操作。
流程
运行以下命令来设置入口 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}')
2.14.1.3.1.2. 确定没有负载均衡器的入口端口
如果您的环境没有外部负载均衡器,请确定入口端口并改用节点端口。
流程
设置入口端口。
$ 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}')
其他资源
2.14.1.4. 配置入口网关
入口网关是在网格边缘运行的负载均衡器,接收传入的 HTTP/TCP 连接。它配置公开的端口和协议,但不包括任何流量路由配置。入口流量的流量路由改为使用路由规则配置,这与内部服务请求相同。
以下步骤演示了如何创建网关并配置 VirtualService
,以在 Bookinfo 示例应用程序中将服务公开给路径 /productpage
和 /login
的外部流量。
流程
创建网关以接受流量。
创建 YAML 文件,并将以下 YAML 复制到其中:
网关 gateway.yaml 示例
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: info-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: info spec: hosts: - "*" gateways: - info-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 文件。
$ oc apply -f vs.yaml
测试网关和 VirtualService 已正确设置。
设置网关 URL。
export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
设置端口号。在本例中,
istio-system
是 Service Mesh control plane 项目的名称。export TARGET_PORT=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.port.targetPort}')
测试已明确公开的页面。
curl -s -I "$GATEWAY_URL/productpage"
预期的结果为
200
。
2.14.2. 了解自动路由
Istio OpenShift 路由 (IOR) 是一个已弃用的功能。弃用的功能仍然包含在 OpenShift Container Platform 中,并将继续被支持。但是,这个功能会在以后的发行版本中被删除,且不建议在新的部署中使用。
有关 OpenShift Container Platform 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行注记中已弃用和删除的功能部分。
在 Service Mesh 中自动管理网关的 OpenShift 路由。每次在 service mesh 中创建、更新或删除 Istio 网关时,都会自动创建、更新或删除 OpenShift 路由。
从 Service Mesh 2.5 开始,对于 ServiceMeshControlPlane
资源的新实例,默认禁用自动路由。
2.14.2.1. 使用子域的路由
Red Hat OpenShift Service Mesh 使用子域创建路由,但必须配置 OpenShift Container Platform 才能启用它。支持子域,如 *.domain.com
,但默认情况下不受支持。在配置通配符主机网关前,配置 OpenShift Container Platform 通配符策略。
如需更多信息,请参阅 OpenShift Container Platform 中的 Ingress Operator 中的 "使用通配符路由"。
2.14.2.2. 创建子域路由
以下示例在 Bookinfo 示例应用程序中创建了一个网关,它会创建子域路由。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: gateway1 spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - www.info.com - info.example.com
Gateway
资源创建以下 OpenShift 路由:您可以使用以下命令来检查是否创建了路由。在本例中,istio-system
是 Service Mesh control plane 项目的名称。
$ oc -n istio-system get routes
预期输出
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD gateway1-lvlfn info.example.com istio-ingressgateway <all> None gateway1-scqhv www.info.com istio-ingressgateway <all> None
如果删除了网关,Red Hat OpenShift Service Mesh 会删除路由。但是,您手动创建的路由不会被 Red Hat OpenShift Service Mesh 修改。
2.14.2.3. 路由标签和注解
有时,OpenShift 路由中需要特定的标签或注解。例如,OpenShift 路由中的一些高级功能通过特殊注释进行管理。请参阅以下"Additional resources"部分中的"特定于路由的注解"。
对于这个和其他用例,Red Hat OpenShift Service Mesh 会将 Istio 网关资源中的所有标签和注解(除 kubectl.kubernetes.io
开始的注解外)复制到受管 OpenShift Route 资源中。
如果您在 Service Mesh 创建的 OpenShift Routes 中需要特定的标签或注解,在 Istio 网关资源中创建它们,并将其复制到由 Service Mesh 管理的 OpenShift Route 资源中。
其他资源
2.14.2.4. 禁用自动路由创建
默认情况下,ServiceMeshControlPlane
资源会自动将 Istio 网关资源与 OpenShift 路由同步。禁用自动路由创建功能,如果您有特殊情况或更喜欢手动控制路由,您可以更灵活地控制路由。
2.14.2.4.1. 为特定情况禁用自动路由创建
如果要禁用为特定 Istio 网关的 OpenShift 路由自动管理,您必须将注解 maistra.io/manageRoute: false
添加到网关元数据定义中。Red Hat OpenShift Service Mesh 将忽略带有这个注解的 Istio 网关,同时保持其它 Istio 网关的自动管理。
2.14.2.4.2. 为所有情况禁用自动路由创建
您可以为网格中的所有网关禁用自动管理 OpenShift 路由。
通过将 ServiceMeshControlPlane
字段 gateways.openshiftRoute.enabled
设置为 false
来禁用 Istio 网关和 OpenShift 路由之间的集成。例如,查看以下资源片断。
apiVersion: maistra.io/v1alpha1 kind: ServiceMeshControlPlane metadata: namespace: istio-system spec: gateways: openshiftRoute: enabled: false
2.14.3. 了解服务条目
服务条目在由 Red Hat OpenShift Service Mesh 内部维护的服务 registry 中添加一个条目。添加服务条目后,Envoy 代理将流量发送到该服务,就像是网格中的服务一样。服务条目允许您进行以下操作:
- 管理服务网格外运行的服务的流量。
- 重定向和转发外部目的地的流量,如来自 web 的 API 调用,或转发到旧基础架构中服务的流量。
- 为外部目的地定义重新尝试、超时和错误注入策略。
- 在虚拟机 (VM) 中运行网格服务,方法是在网格中添加虚拟机。
将服务从不同集群添加到网格,以便在 Kubernetes 上配置多集群 Red Hat OpenShift Service Mesh 网格。
服务条目示例
以下示例 mesh-external 服务条目将 ext-resource
外部依赖关系添加到 Red Hat OpenShift Service Mesh 服务 registry:
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: svc-entry spec: hosts: - ext-svc.example.com ports: - number: 443 name: https protocol: HTTPS location: MESH_EXTERNAL resolution: DNS
使用 hosts
字段指定外部资源。您可以完全限定名,也可以使用通配符前缀域名。
您可以配置虚拟服务和目的地规则,以控制到服务条目的流量,其方式与您为网格中的任何其他服务配置流量相同。例如,以下目的地规则将流量路由配置为使用 mutual TLS 来保护到 ext-svc.example.com
外部服务的连接。它被配置为使用服务项:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ext-res-dr spec: host: ext-svc.example.com trafficPolicy: tls: mode: MUTUAL clientCertificate: /etc/certs/myclientcert.pem privateKey: /etc/certs/client_private_key.pem caCertificates: /etc/certs/rootcacerts.pem
2.14.4. 使用 VirtualServices
您可以使用虚拟服务通过 Red Hat OpenShift Service Mesh 将请求动态路由到微服务的不同版本。使用虚拟服务,您可以:
- 通过单一虚拟服务处理多个应用程序服务。如果网格使用 Kubernetes,您可以配置虚拟服务来处理特定命名空间中的所有服务。虚拟服务使您能够将单体式应用转变为由具有无缝消费者体验的不同微服务组成的服务。
- 配置流量规则与网关相结合,以控制入口和出口流量。
2.14.4.1. 配置 VirtualServices
使用虚拟服务将请求路由到服务网格中的服务。每个虚拟服务由一组路由规则组成,并按顺序应用。Red Hat OpenShift Service Mesh 会将每个给定给虚拟服务的请求与网格内的特定实际目的地匹配。
如果没有虚拟服务,Red Hat OpenShift Service Mesh 会在所有服务实例间使用最少请求(least requests)负载均衡分配流量。使用虚拟服务时,您可以指定一个或多个主机名的流量行为。虚拟服务的路由规则告知 Red Hat OpenShift Service Mesh 如何将虚拟服务的流量发送到适当的目的地。路由目的地可以是同一服务版本,也可以是完全不同的服务。
流程
使用以下示例创建 YAML 文件,根据用户连接到应用程序的不同版本将请求路由到 Bookinfo 示例应用程序服务的不同版本。
VirtualService.yaml 示例
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v3
运行以下命令以应用
VirtualService.yaml
,其中VirtualService.yaml
是文件的路径。$ oc apply -f <VirtualService.yaml>
2.14.4.2. VirtualService 配置参考
参数 | 描述 |
---|---|
spec: hosts: |
|
spec: http: - match: |
|
spec: http: - match: - destination: |
route 部分的 |
2.14.5. 了解目的地规则
目的地规则在评估虚拟服务路由规则后应用,它们应用到流量的真实目的地。虚拟服务将流量路由到目的地。目的地规则配置该目的地的网络流量。
默认情况下,Red Hat OpenShift Service Mesh 使用最的请求负载均衡策略,其中池中的服务实例最少活跃连接数接收请求。Red Hat OpenShift Service Mesh 还支持以下模型,您可以在目的地规则中指定对特定服务或服务子集的请求。
- Random: 请求会随机转发到池里的实例。
- Weighted: 根据特定百分比将请求转发到池中的实例。
- Least requests: 将请求转发到请求数量最少的实例。
目的地规则示例
以下目的地规则示例为 my-svc
目的地服务配置三个不同的子集,具有不同的负载均衡策略:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-destination-rule spec: host: my-svc trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 trafficPolicy: loadBalancer: simple: ROUND_ROBIN - name: v3 labels: version: v3
2.14.6. 了解网络策略
Red Hat OpenShift Service Mesh 自动在 Service Mesh control plane 和应用程序命名空间中创建和管理多个 NetworkPolicies
资源。这是为了确保应用程序和 control plane 可以相互通信。
例如,如果您已将 OpenShift Container Platform 集群配置为使用 SDN 插件,Red Hat OpenShift Service Mesh 会在每个成员项目中创建 NetworkPolicy
资源。这可让从其他网格成员和 control plane 对网格中的所有 pod 的入站网络数据。这也限制了到成员项目的入站网络数据。如果需要来自非成员项目的入站网络数据,则需要创建一个 NetworkPolicy
来允许这些流量通过。如果您从 Service Mesh 中删除命名空间,则此 NetworkPolicy
资源会从项目中删除。
2.14.6.1. 禁用自动 NetworkPolicy 创建
如果要禁用 NetworkPolicy
资源自动创建和管理,例如强制实现公司安全策略,或者允许直接访问网格中的 pod,您可以这样做。您可以编辑 ServiceMeshControlPlane
,并将 spec.security.manageNetworkPolicy
设置为 false
。
当您禁用了 spec.security.manageNetworkPolicy
,Red Hat OpenShift Service Mesh 不会创建 任何 NetworkPolicy
对象。系统管理员负责管理网络并修复可能导致的任何问题。
前提条件
- 安装了 Red Hat OpenShift Service Mesh Operator 2.1.1 或更高版本。
-
ServiceMeshControlPlane
资源更新至 2.1 或更高版本。
流程
-
在 OpenShift Container Platform web 控制台中,点击 Operators
Installed Operators。 -
从 Project 菜单中选择安装 Service Mesh control plane 的项目,如
istio-system
。 -
点 Red Hat OpenShift Service Mesh Operator。在 Istio Service Mesh Control Plane 栏中,点
ServiceMeshControlPlane
的名称,如basic-install
。 -
在 Create ServiceMeshControlPlane Details 页中,点
YAML
修改您的配置。 将
ServiceMeshControlPlane
字段spec.security.manageNetworkPolicy
设置为false
,如下例所示。apiVersion: maistra.io/v2 kind: ServiceMeshControlPlane spec: security: manageNetworkPolicy: false
- 点 Save。
2.14.7. 为流量管理配置 sidecar
默认情况下,Red Hat OpenShift Service Mesh 配置每个 Envoy 代理,在其相关负载的所有端口上接收流量,并在转发流量时到达网格中的每个工作负载。您可以使用 sidecar 配置进行以下操作:
- 微调 Envoy 代理接受的端口和协议集合。
- 限制 Envoy 代理可访问的服务集合。
要优化服务网格的性能,请考虑限制 Envoy 代理配置。
在 Bookinfo 示例应用程序中,配置 Sidecar 以便所有服务都可以访问在同一命名空间和 control plane 中运行的其他服务。使用 Red Hat OpenShift Service Mesh 策略和遥测功能需要这个 Sidecar 配置。
流程
使用以下示例创建 YAML 文件,以指定您希望 sidecar 配置应用到特定命名空间中的所有工作负载。否则,使用
workloadSelector
选择特定的工作负载。sidecar.yaml 示例
apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: info spec: egress: - hosts: - "./*" - "istio-system/*"
运行以下命令以应用
sidecar.yaml
,其中sidecar.yaml
是文件的路径。$ oc apply -f sidecar.yaml
运行以下命令,以验证 sidecar 是否已成功创建。
$ oc get sidecar
2.14.8. 路由教程
本指南使用 Bookinfo 示例应用程序来提供示例应用程序中的路由示例。安装 Bookinfo 应用程序以了解这些路由示例如何工作。
2.14.8.1. Bookinfo 路由指南
Service Mesh Bookinfo 示例应用程序包含四个独立的微服务,每个服务都有多个版本。安装 Bookinfo 示例应用程序后,reviews
微服务的三个不同版本同时运行。
当您在浏览器中访问 Bookinfo 应用 /product
页面并多次刷新时,有时书的评论输出中会包含星号分级,而其它时候则没有。如果没有可路由的显式默认服务版本,Service Mesh 会将请求路由到所有可用版本。
本教程可帮助您应用将所有流量路由到微服务的 v1
(版本 1)的规则。之后,您可以根据 HTTP 请求标头值应用一条规则来路由流量。
先决条件
- 部署 Bookinfo 示例应用程序以使用以下示例。
2.14.8.2. 应用虚拟服务
在以下流程中,虚拟服务通过应用为微服务设定默认版本的虚拟服务,将所有流量路由到每个微服务的 v1
。
流程
应用虚拟服务。
$ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.6/samples/info/networking/virtual-service-all-v1.yaml
要验证是否应用了虚拟服务,请使用以下命令显示定义的路由:
$ oc get virtualservices -o yaml
该命令返回一个
kind: VirtualService
资源,采用 YAML 格式。
您已将 Service Mesh 配置为路由到 Bookinfo 微服务的 v1
版本,包括 reviews
服务版本 1。
2.14.8.3. 测试新路由配置
通过刷新 Bookinfo 应用程序的 /productpage
来测试新配置。
流程
设置
GATEWAY_URL
参数的值。您可以在以后使用这个变量查找 Bookinfo 产品页面的 URL。在本例中,istio-system 是 control plane 项目的名称。export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
运行以下命令,以检索产品页面的 URL:
echo "http://$GATEWAY_URL/productpage"
- 在浏览器中打开 Bookinfo 网站。
页面的评论部分显示没有分级星,无论您刷新多少次。这是因为您已将 Service Mesh 配置为将 reviews 服务的所有流量路由到版本 review:v1
,此版本的服务无法访问星表分级服务。
您的服务网格现在将流量路由到服务的一个版本。
2.14.8.4. 基于用户身份的路由
更改路由配置,以便特定用户的所有流量都路由到特定的服务版本。在这种情况下,所有来自名为 Jason
的用户的流量都会被路由到服务的 review:v2
中。
Service Mesh 对用户身份没有任何特殊的内置了解。这个示例是启用的,因为 productpage
服务为到 reviews 服务的所有传出 HTTP 请求都添加了一个自定义的 end-user
标头。
流程
运行以下命令在 Bookinfo 示例应用程序中启用基于用户的路由。
$ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.6/samples/info/networking/virtual-service-reviews-test-v2.yaml
运行以下命令,以确认创建了该规则。此命令返回 YAML 格式的所有
kind: VirtualService
。$ oc get virtualservice reviews -o yaml
-
在 Bookinfo 应用程序的
/productpage
中,以用户jason
身份在无需密码的情况下进行登录。 - 刷新浏览器。星级分级会出现在每条评论旁。
-
以其他用户身份登录(选择任意名称)。刷新浏览器。现在就不会出现星级评分。现在,除 Jason 外,所有用户的流量都会被路由到 review
:v1
。
您已成功配置了 Bookinfo 示例应用程序,以根据用户身份路由流量。