当前位置: 首页 > 知识库问答 >
问题:

使用NEG时,Pod删除会导致错误

拓拔弘扬
2023-03-14

在本例中,我在一个包含2个副本的部署中运行“echoheaders”Nginx。当我删除一个pod时,我有时会收到约40秒的缓慢响应和错误。

我们正在库伯内特斯运行我们的API网关,并且需要能够允许库伯内特斯调度程序在它认为合适的时候处理pod。

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

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

部署。亚马尔


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

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: echoheaders
  labels:
    app: echoheaders
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: echoheaders

进入。亚马尔

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会提供工作故障转移的旧行为。

有没有办法使用谷歌LB,入口,NEG和库伯内特斯在pod删除期间没有错误?

共有1个答案

章光华
2023-03-14

GCP负载平衡器中,只有在两个后续后端无法满足响应超时或出现更合理的影响性错误后,GET请求才会被服务于502。

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

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

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

 类似资料:
  • 根据SQL字符串组合文档,我想在postgresql数据库中执行DELETE语句: 这将导致以下错误: 另一方面,类似的execute工作正常: 我真的看不出有什么区别...

  • 我有一个JTable,其中有一行自定义对象,其中一列是倒计时的时间组件。当倒计时达到0时,该行将自动删除。 我还通过文本框提供了一个过滤选项,用户可以在其中键入文本框,根据数据过滤行。 如果没有应用于JTable的排序器,除了过滤之外,一切都可以正常工作(当时间计数为0时,行会自行删除)。应用排序器会给我一个"java.lang.IndexOutOfBoundsException:无效索引" 我的

  • 我已经按照较新的SDK的建议实现了批量删除。创建了要删除每个项目的任务列表,然后等待所有任务。我的 CosmosClient 配置了 BulkOperations = true。据我所知,这意味着在引擎盖下,新的SDK发挥了魔力并执行批量操作。 不幸的是,我遇到了429响应状态。这意味着我的多个请求达到了请求速率限制(它很低,仅限于开发层,但不限于此)。我想知道,一个批量操作怎么会导致429错误。

  • 问题内容: 我有一个ReactJS HTML表格组件,并使用方法更新了它的内容(单元格值)。这是基本代码: 您可以这样使用它: 大部分时间都在工作。我可以通过执行以下操作来更改数据(在函数中的某处): 如您所见,它将在表的末尾添加一行。但是,如果我尝试在此更新后设置初始数据,或者以任何方式通过设置为较小的数组(例如应删除最后一行)来 缩短 行数: 我收到此错误: TypeError:updated

  • 问题内容: 最近,我按照这篇文章的建议删除了项目中的所有scriptlet 。但是现在,如果我尝试更改其中一个视图,则会收到deferredExpression错误。为了摆脱错误,我只需要终止,然后重新启动项目即可。 这里发生了什么?eclipse是否无法即时编译jstl?有什么我可以更改的,所以我不必每次进行更改都重新部署吗? 堆栈跟踪 问题答案: java.lang.NoSuchFieldEr