问题摘要
我正在尝试为托管在其他地方的网格之外的外部端点强加断路器参数。但是,我设置的参数似乎没有被强加,因为我仍然获得成功的 HTTP 200 响应,而我希望它开始因 HTTP 503 而失败。
工具版本包括:
- Istio-1.2.4
- Kubernetes: v1.10.11
- Docker Dekstop 版本 2.0.0.3
值得注意的配置:
global.outboundTrafficPolicy.mode
REGISTRY_ONLY
.- 在网格中是
mTLS
.外部流量策略,TLSDISABLED
相关资源
服务入口
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service
spec:
hosts:
- external-service.sample.com
location: MESH_EXTERNAL
exportTo:
- "*"
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
虚拟服务
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: external-service-vs
spec:
hosts:
- external-service.sample.com
http:
- timeout: 200ms
retries:
attempts: 1
perTryTimeout: 200ms
route:
- destination:
host: external-service.sample.com
port:
number: 80
目的地规则
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: external-service-dr
spec:
host: external-service.sample.com
trafficPolicy:
tls:
mode: DISABLE
connectionPool:
tcp:
maxConnections: 1
connectTimeout: 200ms
http:
http2MaxRequests: 1
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
maxRetries: 1
idleTimeout: 200ms
outlierDetection:
consecutiveErrors: 1
interval: 1s
baseEjectionTime: 10s
maxEjectionPercent: 100
测试
我在网格内注入了一个特使代理的应用程序。该应用程序基本上只是为HTTP1.1 GET external-service.sample.com/endpoint 并发运行加载。
我调整应用程序中的并发用户数(1 到 10(和每个用户的每秒请求数(1 到 20(。
我期待响应随着爬坡而开始失败。但事实并非如此。我自始至终都取得了成功。
关键问题
如果您看到非常刺眼的东西,请指出来。
我已经检查了来自我的特使代理的日志和/统计信息(传出请求和响应(。我还需要检查哪些其他 istio 日志以进一步了解请求是否由 istio 对目标规则进行和评估?
除了 Istio Mixer 从嵌套的 Envoy 实例中收集的统计数据之外,您还可以考虑从 Envoy Access 日志中获取断路器事件。
由于在 Istio 网格平面上启用了访问日志记录,因此您可以提取相关的断路器日志条目,并通过特定的响应标志进行区分:
UO:除 503 响应外的上游溢出(断路( 法典。
并从容器的特使代理访问日志中获取记录,即:
[2019-09-18T09:49:56.716Z] "GET /headers HTTP/1.1" 503 UO "-" "-" 0 81 0 - "-"
我还没有真正直接解决这个问题。 但是,我已经从头开始完成了整个设置,从设置 istio 开始,我从头开始。在那之后,它已经抛出了预期的HTTP 503。
了解断路器的状态是相当具有挑战性的,而不是必要的。应该有一张票记录,但似乎这种功能的开发还没有出现。
不过,在验证时,我确实查看了一些遥测指标,以了解断路器状态。我认为这种方式可能会更好,因为我只想知道电路是关闭还是打开,而不是从多个输入数据分析。
谢谢。