【问题标题】:Is there a way to configure Istio to route traffic to a POD which is in the terminating state?有没有办法配置 Istio 将流量路由到处于终止状态的 POD?
【发布时间】: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 配置为:

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

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

谢谢,

雷神

【问题讨论】:

  • 负载均衡器会在 Pod 进入 Terminating 状态后删除它,以便 Pod 完成请求,释放它持有的所有资源,然后优雅地终止。我认为将流量引导到终止 pod 没有任何意义或理由。此外,正如答案中提到的,有一个宽限期,如果在此之后 pod 运行,kubernetes 会杀死 pod。

标签: kubernetes istio


【解决方案1】:

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

  • Pod 在客户端命令中列出时显示为“Terminating”
  • 当 Kubelet 看到 Pod 被标记为终止时,因为在 API 服务器中设置了 Pod 的“dead”计时器, 它开始 pod 关闭过程。
    • 如果 pod 定义了 preStop 挂钩,则会在 pod 内部调用它。如果在宽限期之后 preStop 挂钩仍在运行 过期,然后以小(2 秒)的扩展宽限调用第 2 步 期间。
  • Pod 已从服务的端点列表中删除,并且不再被视为正在运行的用于复制的 Pod 集的一部分 控制器。缓慢关闭的 Pod 无法继续提供服务 作为负载平衡器(如服务代理)的流量将它们从 他们的轮换。

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

【讨论】:

    【解决方案2】:

    有没有办法配置 Istio/Envoy 在“终止”状态时继续向 SvcA_P1 发送具有亲和力的流量/会话?

    这个问题是在 Kubernetes 级别而不是 Istio/Envoy 级别:默认情况下,在进入“Terminating”状态时,Pod 会从其相应的服务中删除。

    您可以通过告诉您的 Service 通告处于“Terminating”状态的 Pod 来更改该行为:请参阅 that answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 2018-10-19
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多