我正在尝试配置负载平衡和故障转移外部的服务。服务的每个 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.de
和501.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.de
和501.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 的选项。