背景
异常描述: 在批量更新流量规则的过程中,偶尔会出现流量异常(503),envoy 日志中 RESPONSE_FLAGS
包含「NR」
标志(No route configured)
,持续时间不长,会自动恢复。
原因分析
当用户使用kubectl apply -f multiple-virtualservice-destinationrule.yaml
时,这些对象的传播和生效先后顺序是不保证的,所谓最终一致性,比如VirtualService
中引用了某一个 DestinationRule
定义的子版本,但是这个 DestinationRule
资源的传播和生效可能在时间上落后于 该 VirtualService
资源。
最佳实践:make before break
将更新过程从批量单步拆分为多步骤,确保整个过程中不会引用不存在的 subset:
当新增 DestinationRule subset
时,应该先 apply DestinationRule subset
,等待 subset
生效后,再 apply
引用了该 subset
的VirtualService
。
当删除 DestinationRule subset
时,应该先 删除 VirtualService
中对 该 subset
的引用,等待 VirtualService
的修改生效后,在执行删除 DestinationRule subset
。