我一直在尝试我的 Nginx 基于路径的路由工作,但是,花了近 4 个小时后,我无法理解,为什么它不起作用。在有人降级我的问题之前,我已经在 StackOverflow 上浏览了几乎所有可能的答案,但没有一个对我有用。
所以我做了什么:
我使用 Helm 3 ( https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/ ) 在单独的命名空间中安装了 nginx-ingress - nginx-test:
helm install my-release nginx-stable/nginx-ingress
入口 Controller 的一个版本( https://hub.helm.sh/charts/nginx-edge/nginx-ingress ):
$ POD_NAME=$(kubectl get pods -l app=nginx-controller-nginx-ingress -o jsonpath='{.items[0].metadata.name}')
$
$ kubectl exec -it $POD_NAME -- /nginx-ingress --version
Version=edge GitCommit=50e908aa
$
有 2 个基本的 nginx 部署,已在同一命名空间中配置了 2 个服务,并且当我为它们配置基于主机的路由时工作正常。
下面的一个对我来说效果很好(当我定义基于主机的路由并在运行两个单独的 URL 时获取所需的页面 index.html 时):
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: nginx1.example.com
http:
paths:
- path: /
backend:
serviceName: nginx1
servicePort: 80
- host: nginx2.example.com
http:
paths:
- path: /
backend:
serviceName: nginx2
servicePort: 80
现在我想使用基于路径的路由实现相同的结果,其中将有 1 个 URL 和 2 个路径/nginx1 (指向 nginx1 服务)和/nginx2 (指向 nginx2 服务)。因此,我配置了以下入口资源(以及我根据互联网上的不同示例应用的许多排列和组合),但它们都不适合我。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-path-based
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: nginx.example.com
http:
paths:
- path: /nginx1
backend:
serviceName: nginx1
servicePort: 80
- path: /nginx2
backend:
serviceName: nginx2
servicePort: 80
当我直接访问服务时,它工作正常,但是当我尝试访问 - curl http://nginx.example.com/nginx1
或 curl http://nginx. example.com/nginx2
- 我收到 404 Not Found
错误。
我期望收到与基于主机的路由相同的响应。但似乎不起作用。
请您参考如下方法:
所以最后我不得不使用 list 安装 Controller ,而不是 helm 图表(边缘版本)。
我从这里安装了它( https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal ),将 NodePort 更改为 LoadBalancer 以获取 LoadBalancer IP。我正在使用MetalLB在裸机上。
$ POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/component=controller -o jsonpath='{.items[0].metadata.name}')
$ kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.32.0
Build: git-446845114
Repository: https://github.com/kubernetes/ingress-nginx
nginx version: nginx/1.17.10
-------------------------------------------------------------------------------
$
我的 Ingress 资源看起来与我在提问时发布的资源相同。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-path-based
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: nginx.gofork8s.com
http:
paths:
- path: /nginx1
backend:
serviceName: nginx1
servicePort: 80
- path: /nginx2
backend:
serviceName: nginx2
servicePort: 80
在/etc/hosts 文件中修改新的 LoadBalancer IP 以使域正常工作。
192.168.0.1 nginx.example.com
现在我可以访问 - http://nginx.example.com/nginx1和 http://nginx.example.com/nginx2 .
我希望它能对某人有所帮助。我仍然需要弄清楚 Helm Charts 的设置。