为什么LoadBalancer在GKE上工作时Ingress会失败?
由于健康检查失败,我无法让Ingress在GKE上工作。我已经尝试了所有我能想到的调试步骤,包括:为什么LoadBalancer在GKE上工作时Ingress会失败?
- 验证我不是
- 验证的任何配额所剩无几,我的服务是从集群
- 验证中访问该我的服务在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"}
检查在GKE Web控制台的入口后端的状态下,我看到了同样的事情:
健康检查细节出现预期:
...并在我的群集吊舱内我可以调用成功服务:
# 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中设置负载平衡器服务,导致在的工作就好了一个网站)
我也看到healthz
抽查合格的为Stackdriver日志:
有关配额,我检查,看看我只使用3月30日的后端服务:
$ gcloud compute project-info describe | grep -A 1 -B 1 BACKEND_SERVICES
- limit: 30.0
metric: BACKEND_SERVICES
usage: 3.0
几个星期前有类似的问题。为我解决的问题是在服务描述中添加一个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
这可能需要一些时间进入到选择这个了。您可以重新创建入口以加快速度。
使用的服务类型':每https://kubernetes.io/docs/concepts/services- NodePort'(“NodePort和ClusterIP服务,其外部负载平衡器将路线,自动创建。”:LoadBalancer'意味着'型网络/服务/#type-loadbalancer,我在上面的日志中显示了这一点)。 – Bosh
好点@Bosh我读过,但比我困惑你为什么创建一个LoadBalancer类型和一个入口控制器。 LoadBalancer应该已经给你一个外部IP,但是也许你有一个像SSL这样的用例。您是否尝试将NodeB类型的LoadBalancer类型换成只是为了排除问题? –
我开始使用NodePort并看到相同的行为;我切换到LoadBalancer,以便我可以记录在互联网上运行的服务(并显示它如何通过LoadBalancer而不是通过Ingress)。 – Bosh
不知道如果这会引起你的问题,但至少在你张贴在这里的入口是一个错字,在“kubernetes.io/ingress.class”注释“kubernetes”与“N”来代替“s”结尾 –
感谢您的密切阅读 - 只是我的文章中的一个错字(我更新以解决错字;问题依然存在)。 – Bosh
您的Ingress部署是否为HTTP(S)负载均衡器/运行状况检查器创建了所需的防火墙规则?有关防火墙规则的详细信息,请访问[本文](https://cloud.google.com/compute/docs/load-balancing/http/#firewall_rules)。 – Kamran