有没有办法配置 Istio 将流量路由到处于终止状态的 POD?

T. *_*ren 5 kubernetes istio

我有一个 Kubernetes 集群,部署了两个服务:SvcA 和 SvcB - 都在服务网格中。

SvcA 由单个 Pod SvcA_P1 支持。SvcA_P1 中的应用程序公开了一个 PreStop HTTP 钩子。当在 SvcA_P1 所在的节点上执行“kubectl drain”命令时,Pod 转换到“终止”状态并保持该状态直到应用程序完成其工作(其余请求返回并且 Kubernetes 移除 Pod)。SvcA_P1 的工作包括完成正在进行的对话(属于已建立的会话)HTTP 请求/响应。它可以在完成之前保持“终止”状态数小时。

当 Pod 进入“终止”阶段时,Istio sidecar 似乎从池中删除了 SvcA_P1。从例如 SvcB_P1 发送到 SvcA_P1 的请求被拒绝,并带有“上游不健康”。

有没有办法将 Istio/Envoy 配置为:

  1. 在处于“终止”状态时继续发送与 SvcA_P1 具有亲缘关系的流量/会话?
  2. 拒绝与 SvcA_P1 没有会话关联的流量(没有 JSESSIONID、cookie 或特殊的 HTTP 标头)?

我玩过 DestinationRule(s),修改 trafficPolicy.loadBalancer.consistentHash.[httpHeaderName|httpCookie]没有运气。一旦 Envoy 移除了上游服务器,新的目的地就会使用减少的服务器集重新散列。

谢谢,

雷神

VAS*_*VAS 1

根据 Kubernetes文档,当必须删除 pod 时,会同时发生三件事:

\n\n
\n
    \n
  • 在客户端命令中列出时,Pod 显示为 \xe2\x80\x9cTerminate\xe2\x80\x9d
  • \n
  • 当 Kubelet 发现某个 Pod 已被标记为终止,因为已在 API 服务器中设置了 Pod 的“死亡”计时器,\n 它会开始 Pod 关闭过程。\n \n
      \n
    • 如果 pod 定义了 preStop 钩子,则会在 pod 内部调用它。如果在宽限期结束后 preStop 挂钩仍在运行,则会在一段较短的(2 秒)延长宽限期内调用步骤 2。
    • \n
  • \n
  • Pod 已从服务端点列表中删除,并且不再被视为复制控制器的正在运行的 Pod 集合的一部分。缓慢关闭的 Pod无法继续提供流量,因为负载均衡器(如服务代理)会将它们从轮换中删除
  • \n
\n
\n\n

一旦 Istio 像 Kubernetes 服务下面/后面的网状网络一样工作,并且服务不再将处于终止状态的 Pod 视为流量目的地,调整 Istio 策略就没有多大帮助。

\n