Jen*_*Jen 8 google-cloud-platform kubernetes
在我们的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
Run Code Online (Sandbox Code Playgroud)
我可以从群集内部访问此服务。如果在我们的一个Pod上(在Default命名空间中)运行这些命令,则会得到预期的结果:
bash-4.4$ nslookup 'php-services'
Name: php-services
Address 1: 10.15.250.136 php-services.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)
和
bash-4.4$ wget -q -O- 'php-services/health'
{"status":"ok"}
Run Code Online (Sandbox Code Playgroud)
因此,该服务已准备就绪,可以正确响应。我需要将此服务暴露给国外流量。我正在尝试通过以下配置使用Ingress进行操作:
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: /*
Run Code Online (Sandbox Code Playgroud)
但随后访问http://php.service.goout.net/health会出现502错误:
错误:服务器错误服务器遇到临时错误,
无法完成您的请求。
请在30秒后重试。
我们还有其他具有相同配置的服务,它们可以正常运行并且可以从外部访问。
我发现了一个类似的问题,但也没有带来足够的答案。
我也一直在关注调试服务文,但由于该服务本身还可以,因此也无济于事。
对此问题的任何帮助都将受到高度赞赏。
好的,所以我们已经找出了问题所在。
查看php-services服务部署的yaml定义:(已简化)
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
Run Code Online (Sandbox Code Playgroud)
映像中的Apache aerver的配置方式是,它从路径重定向而不会在斜杠后面加上斜线。因此,当您请求时/health,实际上收到的HTTP状态为301 /health/,然后返回200。
在kubernetes健康检查的范围内,这是可以的,因为“ 任何大于或等于200且小于400的代码都表示成功。 ”
但是,问题出在GKE负载平衡器中。它也具有自己的GKE健康检查,这些健康检查是从Deployment定义中的检查得出的。重要的区别是它仅接受HTTP状态200。而且,如果负载平衡器没有发现健康的后端服务,它也不会传递任何外部流量。
因此,我们有两个解决方案:
/health和/health/(或更确切地说,仅响应
/health)/health/。我们选择后者,它解决了问题。
| 归档时间: |
|
| 查看次数: |
2515 次 |
| 最近记录: |