GKE Ingress上的gRPC和HTTP服务器无法进行gRPC后端的运行状况检查

时间:2019-05-23 14:55:03

标签: kubernetes google-kubernetes-engine grpc kubernetes-ingress kubernetes-health-check

我想在具有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,更改“就绪”探针的路径即可解决此问题。

2 个答案:

答案 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后端的运行状况检查也无济于事,它是重新创建的。仅对其进行编辑以使用其他端口和路径有所帮助。