我想在具有HTTP / 2和相互TLS的GKE上部署gRPC + HTTP服务器。我的部署同时具有就绪探针和活动探针以及自定义路径。我通过Ingress公开了gRPC和HTTP服务器。
部署的探针和暴露的端口:
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
NodePort服务:
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
在创建活动性和就绪性探针之前,该容器确实存在并且具有“绿色”状态。我在服务器上看到常规日志,其中/_ah/live
和/_ah/ready
都由kube-probe调用,并且服务器以200
响应进行响应。
我在负载均衡器(LB)上使用Google托管的TLS证书。我的HTTP服务器创建了一个自签名证书-受this blog的启发。
我开始查看探针日志后创建了Ingress。之后,它将创建一个具有两个后端的LB,一个后端用于HTTP,一个后端用于gRPC。 HTTP后端的运行状况检查正常,并且可以从Internet访问HTTP服务器。 gRPC后端的运行状况检查失败,因此LB无法路由gRPC协议,并且我收到了502
错误响应。
这是与GKE主版本1.12.7-gke.10一起使用的。我还尝试了较新的1.13和较旧的1.11大师。群集启用了HTTP负载平衡,并启用了VPC本机。有防火墙规则允许从LB访问我的Pod(我什至尝试允许所有IP地址的所有端口)。延迟探测也无济于事。
有趣的是,几个月前我部署了几乎相同的设置,只是服务器的Docker映像有所不同,并且运行时没有任何问题。我什至可以部署服务器的新Docker映像,一切都很好。我找不到这两者之间的任何区别。
还有另一个问题,Ingress在几天内一直处于“正在创建Ingress”状态。它永远不会完成,也永远不会看到LB。 Ingress的LB从没有前端,我总是必须手动添加具有静态IP和Google托管TLS证书的HTTP / 2前端。这仅应针对没有创建“ HTTP负载平衡”的群集而发生,但是对于我所有的“启用HTTP负载平衡”的群集而言,这种情况每次都会发生。工作部署处于这种状态已经有几个月了。
即使我看到日志显示kube-probe调用了就绪和活跃性端点,为什么gRPC后端的运行状况检查可能会失败?
编辑:
describe svc grpc-gke-nodeport
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后端的运行状况检查是使用端口/
上的路径32148
的HTTP / 2 GET。其描述为“默认kubernetes L7负载平衡运行状况检查”。 HTTP后端运行状况检查的描述是“使用就绪探测器设置生成的Kubernetes L7运行状况检查”。因此,不是通过就绪探针创建gRPC后端的运行状况检查。
编辑运行状况检查以指向端口30863
,更改“就绪”探针的路径即可解决此问题。
答案 0 :(得分:0)
GKE入口最近才开始在beta中支持完整的gRPC支持(而过去使用HTTP2 ro HTTP1.1转换)。不过,要使用gRCP,您需要在入口“ cloud.google.com/app-protocols:'{” http2-service“:” HTTP2“}'”上添加注释。 Refer to this how-to doc了解更多详情。
答案 1 :(得分:0)
编辑运行状况检查以指向就绪探针的路径,并将端口更改为HTTP后端之一,从而解决了此问题(请在HTTP后端的运行状况检查中查找端口。它是NodePort的端口。) 。它运行知道没有任何问题。
对gRPC后端使用与HTTP后端相同的运行状况检查不起作用,因此将其重置为自己的运行状况检查。即使删除gRPC后端的运行状况检查也无济于事,它是重新创建的。仅对其进行编辑以使用其他端口和路径有所帮助。