#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