Istio分步指南(四):Istio服务网格的流量路由路径(入口路由)

Istio分步指南(四):Istio服务网格的流量路由路径(入口路由)

原文地址 https://medium.com/faun/istio-step-by-step-part-04-traffic-routing-path-of-istio-service-mesh-part-a-ingress-routing-28e03cdaa048

cover

在上一篇教程中,我解释了如何部署应用程序和调用服务。但是我对流量路由的解释不多。因此,我想再做一个教程来解释服务网格中的流量路由。

Ingress Traffic 是进入服务网格的流量。流量起源于外部,并流向服务网格内部的目的地。

您知道在 Kubernetes 中有一个入口控制器来控制所有入口流量。但是,对于 Istio,Ingress 控制器将被替换为两个名为 Gateway 和 VirtualService 的组件。网关用于配置服务器代理(Envoy),而 VirtualServices 用于路由通信。下面,让我们更详细地了解这两个组件。

Gateways

网关可以更简化为gatekeepergate。也就是仅允许特定类型的流量进入。我们来看一个例子。以下是我在上一教程中使用的网关规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: helloworld-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

在此,指定spec(specifications),servers.port.number 为80,名称为http。这意味着我已配置 envoys 以允许所有使用 HTTP 协议的通信流向端口 80。

现在,让我们深入了解。在 spec.selector.istio 下是ingressgateway。一般地,istio-ingressgateway 被标记为 istio = ingressgateway。您可以通过运行以下命令进行检查。

1
2
kubectl get pods -n istio-system #to get the pods with namespace istio-system
kubectl describe pod <pod_name (istio-ingressgateway-...)> #to describe the pod

在这里您可以看到我之前解释的内容。因此,根据我的网关规则,该配置实际上应用于istio-ingressgateway pod。

好了,现在端口 80 已准备好进行通信。接下来,我们需要一个 VirturalService 来路由此流量。

VirtualService

这引导了流量移动的路径。让我们以同样的例子来说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: "helloworldservice"
spec:
  hosts:
  - "*"
  gateways:
  - helloworld-gateway
  http:
  - match:
    - uri:
        exact: /helloworld
    route:
    - destination:
        host: "helloworldservice"
        port:
          number: 9095

如果您检查网关的名称,则为helloworld-gateway。因此,我们使用它将网关和虚拟服务相互连接。您可以在 Virtualservice 中的spec.gateways下看到我提到的网关名称。这是这两个彼此连接的地方。基本上,Virtualservice 中做的事情是,当流量开始通过网关流动时,将所有重定向到我们的服务端口(此处我的服务端口是 9095),而 spec.http.route.destination.port.number 就是指定这个的。

现在让我们看看如何调用该服务。

要从服务网格外部调用我们的服务,我们需要一个入口端口和一个入口主机。在我的服务中,我将NodePort用作服务类型,因为我想将服务公开给外部。

我在这里不打算介绍 NodePort,ClusterIP 和 LoadBalancer,您可以通过这篇文章了解更多有关这些信息的详细信息Kubernetes NodePort vs LoadBalancer vs Ingress?我什么时候应该使用什么?by Sandeep Dinesh.

要调用该服务,首先我们必须确定 HTTP 流量的入口端口。为此,请执行以下命令。该命令意味着获取名称空间 istio-system下的服务 istio-ingressgateway。

1
kubectl get svc istio-ingressgateway -n istio-system

您将获得一组端口;

1
80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:32243/TCP,8060:31504/TCP,853:32380/TCP,15030:30112/TCP,15031:32472/TCP

在此,端口 80 的入口端口是31380。如果您参考了先前的教程,则可以请记住,我们使用端口31380来调用我们的服务。

由于我们的集群在 Minikube 中运行,因此我们使用minikubeIP作为访问服务的入口主机。

1
curl http://192.168.99.100:31380/helloworld

入口流量路由摘要

  1. 通过入口端口(内部发送流量)调用服务。
  2. 流量由 Istio 捕获,并通过 iptables 流量路由到端口 80。
  3. 端口 80 暴露给 HTTP 通信。它允许流量路由到 Virtualservice
  4. Virtualservice 将流量重定向到目标端口并命中服务

这是本教程的全部内容,希望您能理解入口路由的基本情况。保持联系以了解更多信息。稍后再见。谢谢。

Rating: