设置Istio网关

概述

每个集群的网关可以有自己的端口或负载均衡器,这与服务网格无关。默认情况下,每个 Rancher 提供的集群有 1 个 Nginx Ingress controller,允许流量进入集群。

无论是否已经安装了 Istio。您都可以使用 Nginx Ingress controller。如果这是您的集群的唯一网关,Istio 将能够将流量从集群内部的服务路由到集群内部的另一个服务,但 Istio 将无法接收来自集群外部的流量。

您可以启用 Istio 网关,作为外部流量的南北代理,以允许 Istio 接收外部流量。启用 Istio 网关后,您的集群会有两个 Ingress。

你还需要为你的服务设置一个 Kubernetes 网关。这个 Kubernetes 资源指向 Istio 对集群的 Ingress 网关的实现。

您可以使用负载均衡器将流量路由到服务网状结构,或者使用 Istio 的 NodePort 网关。本节介绍如何设置 NodePort 网关。

有关 Istio 网关的更多信息,请参阅Istio 文档

In an Istio-enabled cluster, you can have two Ingresses: the default Nginx Ingress, and the default Istio controller.

启用 Istio 网关

入口网关是将部署在您的集群中的 Kubernetes 服务。Istio 网关兼容更多的自定义扩展插件,更加灵活。

  1. 导航到集群资源管理器,从下拉菜单中选择Istio
  2. 单击侧面导航栏中的网关
  3. 单击从 Yaml 创建
  4. 粘贴您的 Istio 网关 yaml,或选择从文件中读取,上传 yaml 文件。
  5. 单击 Create,创建 Istio 网关。

结果: 已经部署网关,现在将使用应用的规则来路由流量。

示例

添加 Istio 网关

我们在通过工作负载示例时,在服务中添加 BookInfo 应用部署。接下来我们添加一个 Istio 网关,以便应用程序可以从您的集群外部访问。

  1. 集群资源管理器,从导航下拉菜单中选择Istio
  2. 单击侧面导航栏中的网关
  3. 单击从 Yaml 创建
  4. 复制并粘贴下面提供的网关 yaml。
  5. 单击Create
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: Gateway
  3. metadata:
  4. name: bookinfo-gateway
  5. spec:
  6. selector:
  7. istio: ingressgateway # use istio default controller
  8. servers:
  9. - port:
  10. number: 80
  11. name: http
  12. protocol: HTTP
  13. hosts:
  14. - "*"
  15. ---

Copy

部署 VirtualService

然后部署为网关提供流量路由的 VirtualService。

  1. 单击侧面导航栏中的VirtualService
  2. 单击Create from Yaml
  3. 复制并粘贴下面提供的 VirtualService yaml。
  4. 单击Create
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: bookinfo
  5. spec:
  6. hosts:
  7. - "*"
  8. gateways:
  9. - bookinfo-gateway
  10. http:
  11. - match:
  12. - uri:
  13. exact: /productpage
  14. - uri:
  15. prefix: /static
  16. - uri:
  17. exact: /login
  18. - uri:
  19. exact: /logout
  20. - uri:
  21. prefix: /api/v1/products
  22. route:
  23. - destination:
  24. host: productpage
  25. port:
  26. number: 9080

Copy

结果:您已经配置了您的网关资源,使 Istio 可以接收来自集群外部的流量。

验证资源是否存在

通过运行以下命令确认资源是否存在:

  1. kubectl get gateway -A

Copy

结果应该是这样的:

  1. NAME AGE
  2. bookinfo-gateway 64m

Copy

从 Web 浏览器访问 ProductPage 服务

要测试并查看 BookInfo 应用是否部署正确,可以使用 Istio 控制器 IP 和端口,结合 Kubernetes 网关资源中指定的请求名称,通过 Web 浏览器查看该应用:

http://<Istio控制器的IP>:<istio控制器的端口>/productpage

  1. 集群资源管理器,单击工作负载 > 概述
  2. 向下滚动到istio-system命名空间。
  3. istio-system中,有一个名为istio-ingressgateway的工作负载。在这个工作负载的名称下,你应该看到一些链接,比如80/tcp
  4. 单击其中的一个链接。这应该会在你的 Web 浏览器中显示出 ingress gateway 的 URL。将/productpage附加到 URL 上。

结果:您应该在 Web 浏览器中看到 BookInfo 应用程序。

为了帮助检查 Istio 控制器的 URL 和端口,请尝试使用Istio 文档中的命令。

问题排查

Istio 官方文档建议使用kubectl命令检查外部请求的正确入口主机和入口端口。

确认 Kubernetes 网关与 Istio 的 Ingress 控制器匹配

在网关资源中,选择器通过标签来引用 Istio 的默认入口控制器,其中标签的键是istio,值是ingressgateway。为了确保标签适合网关,请进行以下操作。

  1. 集群资源管理器,单击工作负载>概述
  2. 向下滚动到istio-system命名空间。
  3. istio-system内,有一个名为istio-ingressgateway的工作负载。单击这个工作负载的名称,进入标签和注释部分。你应该看到它有键istio和值ingressgateway。这确认了网关资源中的选择器与 Istio 的默认入口控制器相匹配。

后续操作

设置 Istio 的流量管理组件