Istio DestinationRule 与 Kubernetes Service 有何关系?

Pav*_*kov 6 load-balancing istio

我试图了解如何在 Istio 中进行负载平衡。

Istio DestinationRule 定义 Pod 之间流量平衡的规则。K8s Service 类似地管理 Pod 之间的流量负载平衡。

DestinationRule 定义主机,k8s 服务定义主机。

但没有 k8s 服务,请求失败,http 代码为 503。

k8s Service 与 DestinationRule 有何关系?

jt9*_*t97 7

库伯内特服务

\n

Kubernetes 服务类型ClusterIP使用kube-proxy 的 iptables 规则来分发请求。

\n

文档说:

\n
\n

默认情况下,用户空间模式下的 kube-proxy 通过循环算法选择后端。

\n
\n

更多相关信息请参见此处

\n

目的地规则

\n

正如这里提到的

\n
\n

您可以将虚拟服务视为将流量路由到给定目的地的方式,然后使用目的地规则来配置该目的地的流量所发生的情况。目标规则在评估虚拟服务路由规则后应用,因此它们适用于 Traffic\xe2\x80\x99s \xe2\x80\x9creal\xe2\x80\x9d 目标。

\n

每个 HTTP 路由都必须有一个目标:路由或重定向。路由是转发目标,它可以指向 DestinationRules 中描述的服务的多个版本之一。与服务版本相关的权重决定了其接收的流量比例。

\n

DestinationRule 定义了在路由发生后应用于用于服务的流量的策略。

\n
\n

这里

\n
\n

当虚拟服务匹配规则并评估将流量路由到的目的地时,目的地规则定义了用于发送流量的服务的可用子集。

\n

例如,如果您的服务同时运行多个版本,您可以创建目标规则来定义到这些版本的路由。然后使用虚拟服务映射到目标规则定义的特定子集或将一定比例的流量拆分到特定版本。

\n
\n

503没有kubernetes服务

\n
\n

但没有 k8s 服务,请求失败,http 代码为 503。

\n
\n

它失败是因为没有在虚拟服务和目标规则中指定的主机。

\n

例如,看一下这个虚拟服务和目标规则

\n
apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews-route\nspec:\n  hosts:\n  - reviews.prod.svc.cluster.local\n  http:\n  - name: "reviews-v2-routes"\n    match:\n    - uri:\n        prefix: "/wpcatalog"\n    route:\n    - destination:\n        host: reviews.prod.svc.cluster.local  <---\n        subset: v2\n  - name: "reviews-v1-route"\n    route:\n    - destination:\n        host: reviews.prod.svc.cluster.local  <---\n        subset: v1\n\n\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: reviews-destination\nspec:\n  host: reviews.prod.svc.cluster.local  <---\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n
Run Code Online (Sandbox Code Playgroud)\n

如果您检查,host那么您会看到指定的 kubernetes 服务,如果没有它,它将无法工作。

\n
\n

此外,当设置路由规则以将流量定向到服务的特定版本(子集)时,必须注意确保子集在路由中使用之前可用。否则,在重新配置期间调用该服务可能会返回 503 错误。

\n

更多相关信息请参见此处

\n

DestinationRule 定义主机,k8s 服务定义主机。

\n

目标规则主机是您的 kubernetes 服务。Kubernetes 服务主机是您的 pod,\n您可能想知道,但为什么我需要服务?

\n

正如这里提到的。

\n
\n

Kubernetes 服务是一个抽象,它定义了在集群中某处运行的一组逻辑 Pod,它们都提供相同的功能。创建时,每个服务都会分配一个唯一的 IP 地址(也称为 clusterIP)。该地址与服务的生命周期相关,并且在服务存活期间不会改变。Pod 可以配置为与服务通信,并且知道与服务的通信将自动负载平衡到作为服务成员的某个 Pod。

\n
\n

Kubernetes 服务 与 DestinationRule 相关

\n

我找不到它如何工作的确切信息,所以我将解释我是如何理解它的。

\n

您需要 kubernetes 服务,这样虚拟服务和目标规则才能真正起作用。

\n

由于 kubernetes 服务使用 kube-proxy 的 iptables 规则来分发请求,我假设 istio 目标规则可以使用自己的规则来验证它,并通过 envoy sidecar 应用它们,因为您的网格服务发送和接收的所有流量(数据平面流量)通过 Envoy 进行代理,从而可以轻松引导和控制网格周围的流量,而无需对服务进行任何更改。

\n

更多相关信息请参见此处

\n
\n

其他资源:

\n\n
\n

如果您还有其他问题,请告诉我。

\n