Istio 虚拟服务与普通 Kubernetes 服务的关系

Vac*_*ano 5 kubernetes istio

我正在观看有关 Istio 服务网格的 Pluralsight 视频。演示文稿的一部分这样说:

VirtualService 使用 Kubernetes 服务查找所有 Pod 的 IP 地址。VirtualService 不会通过 [Kubernetes] 服务路由任何流量,但它只是使用它来获取流量可能到达的端点列表。

它显示了这个图形(显示 Pod 发现,而不是用于流量路由):

VirtualService 使用 Service 获取 pod 的 IP

我对此有点困惑,因为我不知道 Istio 如何知道要查看VirtualService哪个 Kubernetes 。Service我在示例 Istio yaml 文件中没有看到任何VirtualService对 Kubernetes 的引用Service

我的理论是,DestinationRules它们可能有足够的标签来找到所需的 pod,但这些示例仅使用标签v1v2。单独一个版本似乎不太可能只提供所需的 Pod。(许多不同的Services可能在v1或 上v2。)

Istio 如何知道要关联到VirtualService哪个 Kubernetes ?Service

或者换句话说,

Istio 如何VirtualService知道如何从集群中的所有 pod 中找到正确的 pod?

Arf*_*leb 9

创建 VitualService 时,您可以在route.destination部分中定义要查找的服务

port:端口上运行的服务

host: 服务名称

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: test
spec:
  hosts:
  - "example.com"
  gateways:
  - test-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        port:
          number: 80
        host: app-service
Run Code Online (Sandbox Code Playgroud)

所以,

app-pod/s->(管理者)app-service->test虚拟服务


the*_*dog 6

阿尔法特的回答是正确的。

\n

我想添加有关主机的文档中的以下部分,这应该使事情更加清晰。\n https://istio.io/latest/docs/reference/config/networking/virtual-service/#VirtualService

\n
\n

[...] Kubernetes 用户注意:当使用短名称时(例如 \xe2\x80\x9creviews\xe2\x80\x9d 而不是 \xe2\x80\x9creviews.default.svc.cluster.local\xe2\x80\ x9d),Istio 将根据规则的命名空间而不是服务来解释短名称。\xe2\x80\x9cdefault\xe2\x80\x9d 命名空间中包含主机 \xe2\x80\x9creviews\xe2\x80\x9d 的规则将被解释为 \xe2\x80\x9creviews.default.svc.cluster.local \xe2\x80\x9d,无论与评论服务关联的实际命名空间如何。为了避免潜在的错误配置,建议始终使用完全限定域名而不是短名称。

\n
\n

因此,当您编写host: app-service并且VirtualServiceis 在default命名空间中时,主机将被解释为app-service.default.svc.cluster.local,这是 kubernetes 服务的 FQDN。如果应用程序服务位于另一个命名空间中,例如dev,您需要将主机设置为host: app-service.dev.svc.cluster.local

\n

同样适用于DestinationRule,其中 kubernetes 服务的 FQDN 也定义为主机。\n https://istio.io/latest/docs/reference/config/networking/destination-rule/#DestinationRule

\n

VirtualServiceDestinationRule为主机配置。Envoy两者都是配置作为 istio 网关/sidecar 运行的抽象。定义VirtualService流量应该去哪里(例如主机、不同版本的权重……)以及定义DestinationRule流量应该如何处理(例如负载平衡算法以及如何定义版本)。

\n

所以流量不是这样路由的

\n

网关 -> VirtualService -> DestinationRule -> Service -> Pod,但类似

\n

网关 -> 服务,考虑 VirtualService 和 DestinationRule 的配置。

\n