【问题标题】:Adding session affinity via BackendConfig results in service outage (502)通过 BackendConfig 添加会话亲和性会导致服务中断 (502)
【发布时间】:2021-05-10 10:35:51
【问题描述】:

通过 IP 向我的服务添加会话亲和性后,我的页面出现 503,我还不明白为什么会这样。

服务本身没有抛出任何错误,但在负载均衡器 (LB) 日志中,我看到 LB 无法再连接到服务。

我很确定中断是添加后端配置的结果,因为在我删除注释的那一刻页面恢复了。

如果您能帮助我找出发生这种情况的原因以及我如何防止这种情况发生,那就太好了,因为我仍然希望启用会话亲和性。


服务注释:

apiVersion: v1
kind: Service
metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"default": "SimonsBackendConf"}'
...

后端配置:

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: SimonsBackendConf
spec:
  sessionAffinity:
    affinityType: "CLIENT_IP"

导致我认为可能是服务不可用的日志条目:

{
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry",
    "statusDetails": "backend_connection_closed_before_data_sent_to_client"
  },
  "httpRequest": {
    "status": 502,
...
  },
...
}

设置:

  • gke
  • L7 谷歌托管负载平衡器

【问题讨论】:

    标签: google-cloud-platform google-kubernetes-engine gke-networking


    【解决方案1】:

    为了使会话亲和性起作用,您需要运行 VPC 原生集群,因为会话亲和性需要网络端点组。您还需要为您的服务创建一个 Ingress 资源。

    假设您有一个 VPC 原生集群,您需要为您的服务添加一个额外的注释:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/backend-config: '{"default": "SimonsBackendConf"}'
        cloud.google.com/neg: '{"ingress": true}'
    ...
    

    请注意,backend-config 注释现在也是 GA(不确定您使用的是哪个 GKE 版本)

    【讨论】:

    • 我们在 VPC 原生集群上:D 是的,我已经将后端配置更新为 GA (v1),但这也不能解释测试版的中断。
    • 您的服务是否也有cloud.google.com/neg: '{"ingress": true}' 注释?
    • 使用 GA 版本的后端配置和注释为我修复了它。应用时零停机时间。谢谢!不需要cloud.google.com/neg: '{"ingress": true}' 注释
    【解决方案2】:

    当容器没有明确处理SIGTERM 时,它会立即终止并停止处理请求。负载均衡器继续向终止的容器发送传入流量,导致 502 错误。

    解决此问题的方法是配置容器以处理 SIGTERM [2] 并在整个终止宽限期(默认为 30 秒)内继续响应请求。将 Pod 配置为在收到 SIGTERM 时开始未通过健康检查。此信号让容器知道它们将很快关闭。这还将向负载均衡器发出信号,在端点解编程过程中停止向 Pod 发送流量。

    您的代码应该监听此事件并在此时开始干净地关闭。这可能包括停止任何长期连接(WebSocket 流)、保存当前状态或类似的事情。

    如果您的应用程序在接收到SIGTERM 时没有正常关闭并停止响应请求,则可以使用 preStop 挂钩 [3] 来处理 SIGTERM 并在端点解编程过程中继续提供流量。

    lifecycle:
      preStop:
        exec:
          # if SIGTERM triggers a quick exit; keep serving traffic instead
          command: ["sleep","60"]
    

    请参考以下链接以在文档 [1] 中找到与此相关的更多详细信息

    [1]https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#traffic_does_not_reach_endpoints

    [2] SIGTERM:https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace

    [3] preStop 钩子:https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details

    【讨论】:

    • 也不错 :) 会将 SIGTERM 处理添加到我的服务中
    猜你喜欢
    • 2017-12-12
    • 2010-11-05
    • 2011-06-13
    • 2017-01-01
    • 1970-01-01
    • 2019-06-05
    • 2013-07-14
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多