Istio:如何从 VirtualService 中排除不健康的目的地?

Istio:如何从 VirtualService 中排除不健康的目的地?

我正在尝试配置负载平衡和故障转移外部的服务。服务的每个 HTTP 端点都需要其自己的特定标头。

我创建了一个具有两个目的地的虚拟服务:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: test-external
spec:
  hosts:
  - test-external.com
  http:
  - headers:
      request:
        set:
          test: "true"
    route:
    - destination:
        host: "201.returnco.de"
      weight: 50
      headers:
        request:
          set:
            Host: "201.returnco.de"
            api-key: "xxxxxxxxxx"
    - destination:
        host: "501.returnco.de"
      weight: 50
      headers:
        request:
          set:
            Host: "501.returnco.de"
            api-key: "yyyyyyyyyy"
    retries: {}

主机201.returnco.de501.returnco.de是外部服务,所以我为它们创建了一个服务条目。

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: test-external
spec:
  hosts:
  - test-external.com
  - 201.returnco.de
  - 501.returnco.de
  location: MESH_EXTERNAL
  ports:
  - name: http
    number: 80
    protocol: HTTP
  resolution: DNS

我想要的是仅将请求路由到201.returnco.de。请求不应路由到返回 5xx 状态代码的主机。在这种情况下,501.returnco.de始终返回 5xx 状态代码,因此被视为不健康。

我应该如何配置网格?


我尝试制定以下目标规则,但是没有效果。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: test-external
spec:
  host: "*.returnco.de"
  trafficPolicy:
    outlierDetection:
      baseEjectionTime: 1m
      consecutive5xxErrors: 1
      consecutiveGatewayErrors: 1
      interval: 15s
      maxEjectionPercent: 100

网格将201.returnco.de501.returnco.de视为两个独立的服务。主机不健康的端点501.returnco.de被驱逐后,Istio 代理将对请求返回 503 错误,因为没有健康的端点。

为单个服务配置多个端点并不理想,因为我需要为每个端点设置不同的标头。

答案1

根据您的配置和描述,可以理解您正在为同一服务创建多个端点。在这种情况下,如果您使用“*.returnco.de”在你的目的地规则为了异常值检测,当你收到5xx 错误对于端点501.returnco.de正如你提到的那样,它将驱逐这些 Pod。因为201.returnco.de是同一服务的另一个端点,而该端点又依赖于相同的 pod,您会收到 503 错误,因为 pod 已被驱逐。为了防止 pod 被驱逐,您可以直接提及201.returnco.de我们已经知道501.returnco.de返回 5xx 错误并将驱逐 pod,以下是修改后的目的地规则供你参考

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: test-external
spec:
  host: 201.returnco.de
  trafficPolicy:
    outlierDetection:
      baseEjectionTime: 1m
      consecutive5xxErrors: 1
      consecutiveGatewayErrors: 1
      interval: 15s
      maxEjectionPercent: 100

另外,如果你不希望你的请求被路由到501.returnco.de你可以给501.returnco.de规则和一些高权重,如100到201.returnco.de规则或使用明确拒绝Istio 的选项。

相关内容