1

对于这个示例,我在具有 2 个副本的部署中运行“echoheaders”Nginx。当我删除 1 个 pod 时,有时会出现大约 40 秒的缓慢响应和错误。

我们在 Kubernetes 中运行我们的 API 网关,并且需要能够允许 Kubernetes 调度程序按照它认为合适的方式处理 Pod。

我们最近想引入会话亲和性,为此,我们想迁移到新的闪亮的 NEG:网络端点组: https ://cloud.google.com/load-balancing/docs/negs/

使用 NEG 时,我们会在故障转移期间遇到问题。没有NEG,我们很好。

部署.yaml


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: echoheaders
  labels:
    app: echoheaders
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echoheaders
  template:
    metadata:
      labels:
        app: echoheaders
    spec:
      containers:
      - image: brndnmtthws/nginx-echo-headers
        imagePullPolicy: Always
        name: echoheaders
        readinessProbe:
          httpGet:
            path: /
            port: 8080
        lifecycle:
          preStop:
            exec:
              # Hack: wait for kube-proxy to remove endpoint before exiting, and
              # gracefully shut down 
              command: ["bash", "-c", "sleep 10; nginx -s quit; sleep 40"]
      restartPolicy: Always
      terminationGracePeriodSeconds: 60

服务.yaml

api版本:v1
种类:服务
元数据:
  名称:回声头
  标签:
    应用程序:回声头
  注释:
    cloud.google.com/neg: '{"ingress": true}'
规格:
  端口:
  - 端口:80
    协议:TCP
    目标端口:8080
  选择器:
    应用程序:回声头

入口.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.global-static-ip-name: echoheaders-staging
  name: echoheaders-staging
spec:
  backend:
    serviceName: echoheaders
    servicePort: 80

删除 pod 时出现错误,如下图所示

$ httping -G -K 35.190.69.21

https://i.imgur.com/u14MvHN.png

这是使用 NEG 时的新行为。禁用 NEG 会使旧的行为具有正常的故障转移。

有什么方法可以在 pod 删除期间使用 Google LB、ingress、NEG 和 Kubernetes 而不会出错?

4

1 回答 1

0

在 GCP 负载均衡器中,只有在两个后续后端未能满足响应超时或发生影响性错误(这似乎更合理)后,才会为 GET 请求提供 502。

可能发生的情况可能是一个过渡时期,其中一个 Pod 将被终止并已收到其 SIGTERM,但负载均衡器仍认为它是健康的并被发送了一个请求。由于这段时间很短,它无法完成请求并关闭了连接。

机器中的优雅服务停止[1] 将使您的服务在接收到 SIGTERM 后继续为进行中的请求提供服务,但拒绝新的连接。这可能会解决您的问题,但请记住,不能保证零停机时间。


[1] https://landing.google.com/sre/sre-book/chapters/load-balancing-datacenter/#robust_approach_lame_duck

于 2019-04-12T05:59:59.203 回答