Kubernetes 当LoadBalancer在GKE上工作时,为什么Ingress会失败?

Kubernetes 当LoadBalancer在GKE上工作时,为什么Ingress会失败?,kubernetes,google-kubernetes-engine,kubernetes-health-check,Kubernetes,Google Kubernetes Engine,Kubernetes Health Check,由于健康检查失败,我无法让Ingress在GKE上工作。我已经尝试了我能想到的所有调试步骤,包括: 验证了我的配额没有不足 已验证是否可以从群集中访问我的服务 验证了我的服务在k8s/GKE负载平衡器后面工作 已验证healthz检查是否正在传入Stackdriver日志 。。。我想听听关于如何调试或修复的建议。详情如下 我已在GKE上设置了类型为LoadBalancer的服务。通过外部IP工作非常好: apiVersion: v1 kind: Service metadata: na

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

  • 验证了我的配额没有不足
  • 已验证是否可以从群集中访问我的服务
  • 验证了我的服务在k8s/GKE负载平衡器后面工作
  • 已验证
    healthz
    检查是否正在传入Stackdriver日志
。。。我想听听关于如何调试或修复的建议。详情如下


我已在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"}

您已将超时值配置为1秒。也许将时间增加到5秒可以解决这个问题

几周前也有类似的问题。对我来说,解决这个问题的方法是在服务描述中添加一个节点端口,这样Google云负载均衡器就可以探测这个节点端口。为我工作的配置:

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

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

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

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


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

不知道这是否会导致您的问题,但至少在您发布的入口中有一个输入错误,在“kubernetes.io/ingres.class”注释中,“kubernetes”以“n”结尾,而不是“s”感谢您的仔细阅读-只是我文章中的一个输入错误(我已更新以修复该输入错误;问题仍然存在)。您的入口部署是否为HTTP(S)负载平衡器/健康检查器创建了所需的防火墙规则?有关防火墙规则的详细信息,请访问。是的,防火墙规则是在引擎盖下自动创建的。使用服务
type:LoadBalancer
意味着
type:NodePort
(“外部负载平衡器将路由到的NodePort和ClusterIP服务是自动创建的。”per和我在上面的日志中显示了这一点).Good point@Bosh我读了一遍,但我不明白为什么要创建一个LoadBalancer类型和入口控制器。LoadBalancer应该已经为您提供了一个外部ip,但您可能已经有了类似SSL的使用案例。您是否尝试过将LoadBalancer类型替换为NodePort类型以排除问题?我从NodePort开始看到了相同的行为;我切换到了负载均衡器,这样我就可以记录该服务在互联网上的工作情况(并展示它是如何通过负载均衡器而不是入口工作的)。谢谢,@VincentH。你救了我。服务会在几毫秒内响应请求。我不知道1s超时怎么会导致这种情况。
# curl  -vvv 10.0.1.1:31102  2>&1 | grep "< HTTP" 
< HTTP/1.0 200 OK
$ gcloud compute project-info describe | grep -A 1 -B 1  BACKEND_SERVICES
- limit: 30.0
  metric: BACKEND_SERVICES
  usage: 3.0
apiVersion: v1
kind: Service
metadata: 
  name: some-service
spec: 
  selector: 
    name: some-app
  type: NodePort
  ports: 
    - port: 80
      targetPort: 8080
      nodePort: 32000
      protocol: TCP