Kubernetes gRPC&;GKE入口上的HTTP服务器未通过gRPC后端的healthcheck

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

我想在GKE上部署一个带有HTTP/2和相互TLS的gRPC+HTTP服务器。我的部署既有就绪探测,也有具有自定义路径的活动探测。我通过入口公开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
节点端口服务:

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),并且