Как мне включить grpc на порту 443 в nginx, не нарушая http на порту 80 в kubernetes?

#nginx #grpc #kubernetes-ingress #tensorflow-serving #nginx-ingress

#nginx #grpc #kubernetes-вход #обслуживание тензорного потока #nginx-вход

Вопрос:

Я использую Nginx на Kubernetes 1.19 (пытаюсь использовать как docker desktop, так и GKE) и пытаюсь предоставить сервисы gRPC. Я установил Nginx с помощью следующей команды и подтверждаю, что могу предоставлять службы REST на порту 80 и службы gRPC с правильной конфигурацией на порту 443.

 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml
 

Однако после создания входа gRPC я больше не могу получить доступ к стандартным службам REST на порту 80. Я столкнулся с 502, когда nginx пытается передать этот трафик HTTP / 1 в мою службу gRPC. Если я это сделаю kubectl get ingress , я увижу, что вход доступен на портах 80 и 443, тогда как мне нужен только 443. Вот вход (извините за все аннотации — пробую что-то).

 apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    allowed-values: CN=client
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "false"
    nginx.ingress.kubernetes.io/auth-tls-secret: default/localhost
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
    nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
    nginx.ingress.kubernetes.io/grpc-backend: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 64ms
  name: tfserving-ingress
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - backend:
          serviceName: tfserving-service
          servicePort: 8500
  tls:
  - secretName: localhost
    hosts:
      - localhost
 

Как мне создать вход для этого домена с помощью TLS, который также не перенаправляет http-трафик на мои службы gRPC?

Ответ №1:

Вы можете попробовать добавить multipke ingress на один и тот же хост, один с tls, а другой без tls.

 apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    allowed-values: CN=client
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "false"
    nginx.ingress.kubernetes.io/auth-tls-secret: default/localhost
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
    nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
    nginx.ingress.kubernetes.io/grpc-backend: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 64ms
  name: tfserving-ingress
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - backend:
          serviceName: gRPC-service
          servicePort: 8500
  tls:
  - secretName: localhost
    hosts:
      - localhost

---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    allowed-values: CN=client
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/proxy-body-size: 64ms
  name: rest-http-ingress
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - backend:
          serviceName: http-rest-service
          servicePort: 8080
 

Комментарии:

1. Спасибо за ваш ответ! Да, это работает, если я укажу путь, отличный от / , и я также могу получить доступ к http-входу на 80. Однако, если я не укажу путь, он не сработает: Error from server (BadRequest): error when creating "other-ingress.yaml": admission webhook "validate.nginx.ingress.kubernetes.io" denied the request: host "localhost" and path "/" is already defined in ingress default/tfserving-ingress