如何为GKE gRPC设置NGINX Ingress

时间:2020-03-23 18:17:17

标签: nginx kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress

在过去的两周中,我一直在努力部署gRPC服务(也带有gRPC网关)。我在很多地方陷入了很多困境,但仍然行不通...为什么?我不确定是否知道。

我最初使用的是Google的Ingress,但无法与gRPC配合使用,因此我移至Ingress NGINX,但仍然有问题...

我从https://kubernetes.github.io/ingress-nginx/deploy/#gce-gke安装了NGINX

我添加了一些注释:

kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
nginx.ingress.kubernetes.io/grpc-backend: "true"

service.yaml (包含我的服务,部署,入口(gRPC)和入口(REST))

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gkegrpcservice
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: gkegrpcservice
  template:
    metadata:
      labels:
        run: gkegrpcservice
    spec:
      containers:
        - name: gkegrpcservice
          image: gcr.io/<PROJECT_ID>/gkegrpcservice:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
            - containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/app-protocols: '{"grpc":"HTTP2"}'
  name: gkegrpcservice
  namespace: default
spec:
  type: NodePort
  selector:
    run: gkegrpcservice
  ports:
    # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.
    - port: 8080
      targetPort: 8080
      protocol: TCP
      name: grpc
    # Port that accepts REST requests over HTTP.
    - port: 8081
      targetPort: 8081
      protocol: TCP
      name: rest
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gkegrpcservice-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    nginx.ingress.kubernetes.io/grpc-backend: "true"
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /GKEgRPCService.GKEgRPCService/*
            backend:
              serviceName: gkegrpcservice
              servicePort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gkegrpcservice-gateway-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - http:
        paths:
          - path: /rest/*
            backend:
              serviceName: gkegrpcservice
              servicePort: 8081

我还创建了一个github存储库,因此您可以访问整个代码/配置,还可以访问Dockerfile和service.yaml:https://github.com/Emixam23/GKE-gRPC-Service-Ingress

基于上述内容,然后我描述我的Ingress:

MacBook-Pro-de-Emixam23:src emixam23$ kubectl describe ingress
Name:             gkegrpcservice-gateway-ingress
Namespace:        default
Address:          35.228.118.83
Default backend:  default-http-backend:80 (10.4.2.7:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *     
        /rest/*   gkegrpcservice:8081 (10.4.1.25:8081)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/ssl-redirect":"false"},"name":"gkegrpcservice-gateway-ingress","namespace":"default"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"gkegrpcservice","servicePort":8081},"path":"/rest/*"}]}}]}}

  kubernetes.io/ingress.class:               nginx
  nginx.ingress.kubernetes.io/ssl-redirect:  false
Events:
  Type    Reason  Age                 From                      Message
  ----    ------  ----                ----                      -------
  Normal  CREATE  26m                 nginx-ingress-controller  Ingress default/gkegrpcservice-gateway-ingress
  Normal  UPDATE  115s (x3 over 26m)  nginx-ingress-controller  Ingress default/gkegrpcservice-gateway-ingress


Name:             gkegrpcservice-ingress
Namespace:        default
Address:          35.228.118.83
Default backend:  default-http-backend:80 (10.4.2.7:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *     
        /GKEgRPCService.GKEgRPCService/*   gkegrpcservice:8080 (10.4.1.25:8080)
Annotations:
  nginx.ingress.kubernetes.io/backend-protocol:      GRPC
  nginx.ingress.kubernetes.io/grpc-backend:          true
  nginx.ingress.kubernetes.io/ssl-redirect:          false
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/backend-protocol":"GRPC","nginx.ingress.kubernetes.io/grpc-backend":"true","nginx.ingress.kubernetes.io/ssl-redirect":"false"},"name":"gkegrpcservice-ingress","namespace":"default"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"gkegrpcservice","servicePort":8080},"path":"/GKEgRPCService.GKEgRPCService/*"}]}}]}}

  kubernetes.io/ingress.class:  nginx
Events:
  Type    Reason  Age    From                      Message
  ----    ------  ----   ----                      -------
  Normal  CREATE  6m43s  nginx-ingress-controller  Ingress default/gkegrpcservice-ingress
  Normal  UPDATE  6m6s   nginx-ingress-controller  Ingress default/gkegrpcservice-ingress

从此处, 35.228.118.83/rest/health_check 应该返回

200 {} 但是只有404返回...

enter image description here

但是,这(对我而言)是没有意义的,即使删除 / rest / ,我也应该得到答复,但好的,那是行不通的。

然后,我将转到上面link刚创建的入口控制器。我得到的日志是:

enter image description here

我不太了解所有日志,但似乎并没有显示关于我的ping操作...

有人对实际发生的事情有任何想法吗?是否有办法调试某些东西?因为目前基于互联网,我很乐意去旅行,但实际上,似乎什么都没有...

0 个答案:

没有答案