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

当LoadBalancer在GKE上工作时,为什么入口失败?

胥宏义
2023-03-14

由于健康检查失败,我无法进入GKE工作。我已经尝试了我能想到的所有调试步骤,包括:

  • 已验证我没有任何配额不足
  • 验证我的服务可以从集群内访问
  • 验证我的服务在k8s/GKE负载均衡器后面工作。
  • 验证Health z检查正在传递Stackdrigs日志

...我很乐意获得有关如何调试或修复的任何建议。详情如下!

我在GKE上设置了一个类型为LoadBalancer的服务。通过外部IP效果很好:

apiVersion: v1
kind: Service
metadata:
  name: echoserver
  namespace: es
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  type: LoadBalancer
  selector:
    app: echoserver

然后,我尝试在同一服务上设置入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoserver-ingress
  namespace: es
  annotations:
    kubernetes.io/ingress.class: "gce"
    kubernetes.io/ingress.global-static-ip-name: "echoserver-global-ip"
spec:
  backend:
    serviceName: echoserver
    servicePort: 80

入口已创建,但它认为后端节点不健康:

$ kubectl --namespace es describe ingress echoserver-ingress | grep backends
  backends:     {"k8s-be-31102--<snipped>":"UNHEALTHY"}

在GKE web控制台中检查入口后端的状态,我看到了同样的情况:

运行状况检查详细信息按预期显示:

... 我可以在群集中的pod内成功调用该服务:

# curl  -vvv echoserver  2>&1 | grep "< HTTP"
< HTTP/1.0 200 OK

# curl  -vvv echoserver/healthz  2>&1 | grep "< HTTP"
< HTTP/1.0 200 OK

我可以通过NodePort对服务进行寻址:

# curl  -vvv 10.0.1.1:31102  2>&1 | grep "< HTTP" 
< HTTP/1.0 200 OK

(这是不言而喻的,因为我在步骤1中设置的负载平衡器服务生成了一个工作正常的网站。)

我还看到Health z检查在StackDrive日志中传递:

关于配额,我检查发现我只使用了30个后端服务中的3个:

$ gcloud compute project-info describe | grep -A 1 -B 1  BACKEND_SERVICES
- limit: 30.0
  metric: BACKEND_SERVICES
  usage: 3.0

共有3个答案

邓鸿信
2023-03-14

我有这个问题,最终遇到了https://stackoverflow.com/a/50645953/9276,这让我查看了防火墙设置。果不其然,我添加的最后几个节点端口服务没有在防火墙规则中启用,因此来自指向它们的入口的健康检查都失败了。手动将新主机端口添加到防火墙规则为我解决了此问题。

但是,与链接的答案不同,我没有正在使用的无效证书。我猜还有其他错误或奇怪的状态会导致这种行为,但我还没有找到规则停止自动管理的原因。

可能无关,我在我们的qa环境中没有这个问题,只是生产,所以可能有GCP项目级别的设置在起作用。

郭翰翮
2023-03-14

您已将超时值配置为1秒。也许将其增加到5秒会解决问题。

戈博易
2023-03-14

几周前也有类似的问题。对我来说,修复它的方法是在服务描述中添加一个NodePort,以便Google Cloud Loadbalancer可以探测这个NodePort。对我有用的配置:

apiVersion: v1
kind: Service
metadata: 
  name: some-service
spec: 
  selector: 
    name: some-app
  type: NodePort
  ports: 
    - port: 80
      targetPort: 8080
      nodePort: 32000
      protocol: TCP

入口可能需要一段时间才能发现这一点。您可以重新创建入口以加快速度。

 类似资料:
  • 我目前正在试验java awt机器人,现在我想尝试在我的游戏窗口中按下一些东西。 为了蒸汽。exe时,我设置了以下属性:“与Windows 7的兼容性”、“始终以管理员身份运行”。 然后,我用这个启动了游戏“反击:全球进攻”。bat文件: 游戏启动了,现在我想用下面的代码点击游戏中的一些东西: 鼠标会转到正确的位置,但当它应该点击某个东西时,游戏不会做出反应或识别它。 然而,如果我不把蒸汽。exe

  • 在我开始之前,我想提一下,我正在使用GKE的免费试用版。我有一个在GKE集群中运行的简单服务器。我有一个用于公开服务器的服务。我正在尝试配置入口控制器并将其连接到此服务。 如果我的服务是LoadBalancer、NodePort类型,那么一切都会完美工作。但是,如果我的服务是ClusterIP类型,则会出现以下错误 然后,GKE停止尝试为入口配置IP。为什么我不能配置集群IP类型的服务,是否有解决

  • 我了解kubernetes服务,因为LoadBalancer服务是NodePort和ClusterIP的扩展,后者已经是POD的负载平衡器层。当我们使用NodePort或CluserIP和ingress时,我们已经能够使用负载平衡器(内部)在服务中通过域访问应用程序。那么,为什么我们还有另一个选择是LoadBalancer服务(外部云提供商)?

  • 库伯内特斯同时拥有入口(在服务前面)和类型为: LoadBalancer的服务。它们似乎做着相同的事情:允许公共流量进入与服务选择器匹配的pod。两者的优点和缺点是什么?在什么情况下我会选择一个而不是另一个?

  • 笔记: 必须安装Java。获取JRE(http://www.java.com)或者JDK 从环境变量JAVA_HOME(C:\Program Files\Java\jdk1.8.0_251)...13:07:44.382[main]ERRORegistry.java:35ServiceDiscoveryIorg.kie.api.KieService: 131-加载失败,因为已经存在一个服务ervi

  • 我尝试为一个简单的spring引导控制器创建第一个测试,但得到的是。在浏览器中,代码是工作的,但测试失败。我的应用程序使用spring-安全。请帮助我解决问题,并理解我的错误。谢谢你。 这是控制器: 这是个考验。 这是结果日志: mockHttpServletRequest:HTTP方法=GET请求URI=/get_all_items参数={}Headers={accept=[text/html]