【发布时间】:2018-10-09 21:22:16
【问题描述】:
我有一个 Kubernetes 集群,其中部署了两个服务:SvcA 和 SvcB - 都在服务网格中。
SvcA 由单个 Pod SvcA_P1 支持。 SvcA_P1 中的应用程序公开了一个 PreStop HTTP 挂钩。在 SvcA_P1 所在的节点上执行“kubectl drain”命令时,Pod 会转换到“terminating”状态并保持在该状态,直到应用程序完成其工作(rest 请求返回并且 Kubernetes 删除 pod)。 SvcA_P1 的工作包括完成正在进行的对话内(属于已建立的会话)HTTP 请求/响应。它可以在完成前保持“终止”状态数小时。
当 Pod 进入“终止”阶段时,Istio sidecar 似乎从池中移除了 SvcA_P1。从例如 SvcB_P1 发送到 SvcA_P1 的请求被拒绝,并显示“上游不健康”。
有没有办法将 Istio/Envoy 配置为:
- 在“终止”状态时继续向 SvcA_P1 发送流量/会话?
- 拒绝与 SvcA_P1 没有会话亲缘关系的流量(没有 JSESSIONID、cookie 或特殊 HTTP 标头)?
我玩过 DestinationRule,修改了trafficPolicy.loadBalancer.consistentHash.[httpHeaderName|httpCookie],但没有成功。一旦 Envoy 移除上游服务器,新的目的地就会使用减少的服务器集重新散列。
谢谢,
雷神
【问题讨论】:
-
负载均衡器会在 Pod 进入
Terminating状态后删除它,以便 Pod 完成请求,释放它持有的所有资源,然后优雅地终止。我认为将流量引导到终止 pod 没有任何意义或理由。此外,正如答案中提到的,有一个宽限期,如果在此之后 pod 运行,kubernetes 会杀死 pod。
标签: kubernetes istio