通过 BackendConfig 添加会话亲和性导致服务中断 (502)
Adding session affinity via BackendConfig results in service outage (502)
通过 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 托管负载均衡器
为了使会话亲和力起作用,您需要成为 运行 VPC 原生集群,因为会话亲和力需要网络端点组。您还需要为您的服务创建 Ingress 资源。
假设您有一个 VPC 原生集群,您需要为您的服务添加一个额外的注释:
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"default": "SimonsBackendConf"}'
cloud.google.com/neg: '{"ingress": true}'
...
请注意,后端配置注释现在也已正式发布(不确定您使用的是哪个 GKE 版本)
当容器未明确处理 SIGTERM
时,它会立即终止并停止处理请求。负载均衡器继续将传入流量发送到已终止的容器,导致 502 错误。
此问题的解决方案是将容器配置为处理 SIGTERM
[2] 并在整个终止宽限期(默认为 30 秒)内继续响应请求。配置 Pods 以在收到 SIGTERM
时开始失败的健康检查。此信号让容器知道它们将很快关闭。这也会向负载均衡器发出信号,在端点反编程过程中停止向 Pod 发送流量。
您的代码应侦听此事件并在此时开始干净地关闭。这可能包括停止任何长期连接(WebSocket 流)、保存当前状态或类似的事情。
如果您的应用程序在收到 SIGTERM
时没有正常关闭并停止响应请求,则可以使用 preStop 挂钩 [3] 来处理 SIGTERM 并在端点反编程过程中继续为流量提供服务。
lifecycle:
preStop:
exec:
# if SIGTERM triggers a quick exit; keep serving traffic instead
command: ["sleep","60"]
请参阅下面的 link 以在文档 [1]
中找到与此相关的更多详细信息
[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
通过 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 托管负载均衡器
为了使会话亲和力起作用,您需要成为 运行 VPC 原生集群,因为会话亲和力需要网络端点组。您还需要为您的服务创建 Ingress 资源。
假设您有一个 VPC 原生集群,您需要为您的服务添加一个额外的注释:
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"default": "SimonsBackendConf"}'
cloud.google.com/neg: '{"ingress": true}'
...
请注意,后端配置注释现在也已正式发布(不确定您使用的是哪个 GKE 版本)
当容器未明确处理 SIGTERM
时,它会立即终止并停止处理请求。负载均衡器继续将传入流量发送到已终止的容器,导致 502 错误。
此问题的解决方案是将容器配置为处理 SIGTERM
[2] 并在整个终止宽限期(默认为 30 秒)内继续响应请求。配置 Pods 以在收到 SIGTERM
时开始失败的健康检查。此信号让容器知道它们将很快关闭。这也会向负载均衡器发出信号,在端点反编程过程中停止向 Pod 发送流量。
您的代码应侦听此事件并在此时开始干净地关闭。这可能包括停止任何长期连接(WebSocket 流)、保存当前状态或类似的事情。
如果您的应用程序在收到 SIGTERM
时没有正常关闭并停止响应请求,则可以使用 preStop 挂钩 [3] 来处理 SIGTERM 并在端点反编程过程中继续为流量提供服务。
lifecycle:
preStop:
exec:
# if SIGTERM triggers a quick exit; keep serving traffic instead
command: ["sleep","60"]
请参阅下面的 link 以在文档 [1]
中找到与此相关的更多详细信息[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