在我们的GKE中,我们有一个名为php-services的服务。它的定义如下:
apiVersion: v1
kind: Service
metadata:
name: php-services
labels:
name: php-services
spec:
type: NodePort
ports:
- port: 80
selector:
name: php-services我可以从集群内部访问此服务。如果我在我们的一个豆荚上运行这些命令(在Default名称空间中),就会得到预期的结果:
bash-4.4$ nslookup 'php-services'
Name: php-services
Address 1: 10.15.250.136 php-services.default.svc.cluster.local和
bash-4.4$ wget -q -O- 'php-services/health'
{"status":"ok"}因此,服务已经准备就绪并正确响应。我需要把这项服务暴露在国外的交通上。我正试图使用以下配置来完成这一任务:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tls
annotations:
kubernetes.io/ingress.class: "gce"
kubernetes.io/tls-acme: "true"
kubernetes.io/ingress.global-static-ip-name: "kubernetes-ingress"
kubernetes.io/ingress.allow-http: "false"
external-dns.alpha.kubernetes.io/hostname: "gke-ingress.goout.net"
namespace: default
spec:
tls:
- hosts:
- php.service.goout.net
secretName: router-tls
rules:
- host: php.service.goout.net
http:
paths:
- backend:
serviceName: php-services
servicePort: 80
path: /*但是,访问http://php.service.goout.net/health会产生一个502错误:
错误:服务器错误服务器遇到一个临时错误,并且 没有完成你的请求。 请在30秒后再试。
我们还有其他具有相同配置的服务,可以运行ok,并且可以访问外部的表单。
我找到了一个相似问题,但这也不能给出足够的答案。
我也一直在关注调试服务的文章,但这也没有帮助,因为服务本身是可以的。
对此问题的任何帮助都表示高度赞赏。
发布于 2018-07-24 10:39:41
编辑TLDR
GKE负载平衡器只接受HTTP状态200,而Kubernetes健康检查接受大于或等于200但小于400的任何代码。
原语回答
好吧,我们已经弄清楚出了什么问题。
看看yaml对php-services服务的部署的定义:(缩写)
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: php-services
namespace: default
spec:
replicas: 1
selector:
matchLabels:
name: php-services
template:
metadata:
labels:
name: php-services
spec:
containers:
- name: php-services
image: IMAGE_TAG
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 80
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 60
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 80
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 60
successThreshold: 1
timeoutSeconds: 10
ports:
- containerPort: 80映像中的Apache服务器的配置方式是将其从路径重定向,而不尾随斜杠到它的路径。因此,当您请求/health时,您实际上得到了HTTP 301,指向/health/,然后响应为200。
在Kubernetes健康检查的范围内,这可以作为"任何大于或等于200或小于400的代码都表示成功。“
然而,问题在于GKE负载平衡器。它还拥有自己的GKE健康检查,这些健康检查来自于部署定义中的检查。重要的区别是它只接受HTTP状态200。如果负载平衡器找不到一个健康的后端服务,它就不会把任何外国的流量传递给它。
因此,我们有两种方法来解决这个问题:
/health和/health/ (或者更准确地说,只响应/health)readinessProbe和livenessProbe路径定义更改为/health/。我们选择后者,它解决了问题。
https://stackoverflow.com/questions/51486410
复制相似问题