Kubernetes gRPC&;GKE入口上的HTTP服务器未通过gRPC后端的healthcheck
我想在GKE上部署一个带有HTTP/2和相互TLS的gRPC+HTTP服务器。我的部署既有就绪探测,也有具有自定义路径的活动探测。我通过入口公开gRPC和HTTP服务器 部署的探测器和暴露的端口:Kubernetes gRPC&;GKE入口上的HTTP服务器未通过gRPC后端的healthcheck,kubernetes,google-kubernetes-engine,grpc,kubernetes-ingress,kubernetes-health-check,Kubernetes,Google Kubernetes Engine,Grpc,Kubernetes Ingress,Kubernetes Health Check,我想在GKE上部署一个带有HTTP/2和相互TLS的gRPC+HTTP服务器。我的部署既有就绪探测,也有具有自定义路径的活动探测。我通过入口公开gRPC和HTTP服务器 部署的探测器和暴露的端口: livenessProbe: failureThreshold: 3 httpGet: path: /_ah/health port: 8443 scheme: HTTPS periodSeconds: 10
livenessProbe:
failureThreshold: 3
httpGet:
path: /_ah/health
port: 8443
scheme: HTTPS
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /_ah/health
port: 8443
scheme: HTTPS
name: grpc-gke
ports:
- containerPort: 8443
protocol: TCP
- containerPort: 50052
protocol: TCP
节点端口服务:
apiVersion: v1
kind: Service
metadata:
name: grpc-gke-nodeport
labels:
app: grpc-gke
annotations:
cloud.google.com/app-protocols: '{"grpc":"HTTP2","http":"HTTP2"}'
service.alpha.kubernetes.io/app-protocols: '{"grpc":"HTTP2", "http": "HTTP2"}'
spec:
type: NodePort
ports:
- name: grpc
port: 50052
protocol: TCP
targetPort: 50052
- name: http
port: 443
protocol: TCP
targetPort: 8443
selector:
app: grpc-gke
入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: grpc-gke-ingress
annotations:
kubernetes.io/ingress.allow-http: "false"
#kubernetes.io/ingress.global-static-ip-name: "grpc-gke-ip"
labels:
app: grpc-gke
spec:
rules:
- http:
paths:
- path: /_ah/*
backend:
serviceName: grpc-gke-nodeport
servicePort: 443
backend:
serviceName: grpc-gke-nodeport
servicePort: 50052
pod确实存在,并且在创建活动性和就绪性探测器之前处于“绿色”状态。我在服务器上看到定期日志,kube探测器调用/\u ah/live
和/\u ah/ready
,服务器响应200
我在负载平衡器(LB)上使用Google管理的TLS证书。我的HTTP服务器创建了一个自签名证书——灵感来自
我在开始查看探测器日志后创建入口。之后,它创建一个具有两个后端的LB,一个用于HTTP,一个用于gRPC。HTTP后端的运行状况检查正常,并且可以从Internet访问HTTP服务器。gRPC后端的运行状况检查失败,因此LB不会路由gRPC协议,我收到502
错误响应
这是关于GKE master 1.12.7-GKE.10的。我还尝试了较新的1.13和较旧的1.11主机。群集已启用HTTP负载平衡和VPC本机。有防火墙规则允许从LB访问我的POD(我甚至尝试允许所有IP地址的所有端口)。延迟探测也无济于事
有趣的是,我部署了几乎相同的设置,只是服务器的Docker映像不同,几个月前,它运行时没有任何问题。我甚至可以部署服务器的新Docker映像,一切都很好。我看不出这两者有什么区别
还有一个问题,入口在“创建入口”状态下停留了数天。它从未完成,也从未看到LB。Ingress的LB从来没有前端,我总是必须手动添加一个HTTP/2前端,带有静态IP和Google管理的TLS证书。这应该只发生在创建时没有“HTTP负载平衡”的集群上,但在我的情况下,每次都会发生在所有“启用HTTP负载平衡”的集群上。工作部署已处于此状态数月
即使我看到kube probe调用了就绪性和活动性端点的日志,您知道为什么gRPC后端的健康检查可能会失败吗
编辑:
描述svc grpc gke节点端口
Name: grpc-gke-nodeport
Namespace: default
Labels: app=grpc-gke
Annotations: cloud.google.com/app-protocols: {"grpc":"HTTP2","http":"HTTP2"}
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"cloud.google.com/app-protocols":"{\"grpc\":\"HTTP2\",\"http\":\"HTTP2\"}",...
service.alpha.kubernetes.io/app-protocols: {"grpc":"HTTP2", "http": "HTTP2"}
Selector: app=grpc-gke
Type: NodePort
IP: 10.4.8.188
Port: grpc 50052/TCP
TargetPort: 50052/TCP
NodePort: grpc 32148/TCP
Endpoints: 10.0.0.25:50052
Port: http 443/TCP
TargetPort: 8443/TCP
NodePort: http 30863/TCP
Endpoints: 10.0.0.25:8443
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
名称:grpc gke节点端口
名称空间:默认值
标签:app=grpc gke
注释:cloud.google.com/app-protocols:{“grpc”:“HTTP2”,“http”:“HTTP2”}
kubectl.kubernetes.io/last-applicated-configuration:
{“apiVersion”:“v1”,“种类”:“服务”,“元数据”:{“注释”:{“cloud.google.com/app protocols”:“{\“grpc\”:“HTTP2\”,“http\”:“HTTP2\”,。。。
service.alpha.kubernetes.io/app-protocols:{“grpc”:“HTTP2”,“http”:“HTTP2”}
选择器:app=grpc gke
类型:节点端口
IP:10.4.8.188
端口:grpc 50052/TCP
目标端口:50052/TCP
节点端口:grpc 32148/TCP
终点:10.0.0.25:50052
端口:http 443/TCP
目标端口:8443/TCP
节点端口:http 30863/TCP
终点:10.0.0.25:8443
会话关联:无
外部流量策略:群集
活动:
gRPC后端的运行状况检查是一个HTTP/2 GET,使用端口32148
上的路径/
。它的描述是“默认kubernetes L7负载平衡运行状况检查”。其中,HTTP后端运行状况检查的描述是“kubernetes L7运行状况检查通过就绪探测设置生成”。因此,gRPC后端的运行状况检查不是从就绪探测创建的
编辑运行状况检查以指向端口
30863
更改准备就绪探测器的路径可以解决此问题。GKE ingress最近刚刚开始在beta版中支持gRPC的完整支持(而HTTP2 ro HTTP1.1转换在过去使用过)。不过,要使用gRCP,您需要在ingress中添加注释“cloud.google.com/app-protocols:“{”http2服务“:“http2”}”。
有关更多详细信息。编辑运行状况检查以指向就绪探测器的路径,并将端口更改为HTTP后端中的一个端口修复了此问题(在HTTP后端的运行状况检查中查找端口。它是节点端口)。它运行时不会出现任何问题
对gRPC后端使用与HTTP后端相同的运行状况检查不起作用,它被重置回自己的运行状况检查。即使删除gRPC后端的运行状况检查也没有帮助,它被重新创建。只有编辑它以使用不同的端口和路径才有帮助。我在入口和旧部署中使用了HTTP2注释有效,但在本例中无效。您能否验证用于gRPC后端的运行状况检查是否与就绪探测匹配?可能是LB运行状况检查创建不正确,或者它使用的是以前创建的运行状况检查。它与就绪探测不匹配。它从未匹配过,即使在正在运行的gRPC服务部署的几个月内也是如此以前。它总是指向
/
并使用gRPC服务的端口。HTTP后端的运行状况检查使用就绪探测。编辑运行状况检查以指向就绪探测的路径并将端口更改为HTTP后端之一可修复此问题。但编辑自动生成的运行状况检查(从入口)不建议使用…我从周五早上开始测试这个编辑的健康检查,它仍然在工作…它们不会完全匹配,准备就绪探测器将是443,其中,作为lB的HC应该是节点端口(3xxx),并且