我有两个服务托管在不同的端口上,并且我创建了一个如下所示的入口资源
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: mynamespace
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /svc1/
backend:
serviceName: app1-svc
servicePort: 3000
- path: /svc2/
backend:
serviceName: app2-svc
servicePort: 8080
在此之上,我创建了一个 NodePort 类型入口 Controller 。
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-ingress
name: controller-nginx-ingress-controller
spec:
clusterIP: 10.88.18.191
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 30080
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 31442
port: 443
protocol: TCP
targetPort: https
selector:
app: nginx-ingress
component: controller
release: controller
最后,设置一个云负载均衡器来访问在我的 K8S 集群上运行的应用程序。
问题: 我无法使用 URL 路由访问我的任何应用程序
任何人都可以告诉我我做错了什么吗?以及如何解决这个问题?
最佳答案
根据您在评论中提到的内容,我很确定问题可以通过路径重写来解决。
现在,当您使用 path:/svc1/
向 /svc1/
发送请求时,该请求将转发到 app1-svc
> 路径设置为 /svc1/
并且您收到 404 错误,因为 app1 中没有这样的路径。根据您提到的情况,您很可能可以使用重写来解决问题。您可以使用 nginx.ingress.kubernetes.io/rewrite-target 注释来实现它,因此您的入口将如下所示:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: mynamespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /svc1(/|$)(.*)
backend:
serviceName: app1-svc
servicePort: 3000
- path: /svc2(/|$)(.*)
backend:
serviceName: app2-svc
servicePort: 8080
在这种情况下,当发送路径设置为 /svc1/something
的请求时,请求将转发到 app1,路径重写为 /something
。
另请参阅 ingress docs for more explanation .
请告诉我是否解决了您的问题。
关于kubernetes - 无法从托管在不同端口上的入口 Controller 访问多个服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60373100/