我一直在尝试基于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
入口控制器(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
错误。
我期望收到与基于主机的路由相同的响应。但这似乎不起作用。
答案 0 :(得分:2)
所以最终我不得不使用清单而不是头盔图表(边缘版本)来安装控制器。
我从这里(https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal)安装它,将NodePort更改为LoadBalancer以获取LoadBalancer IP。我在BareMetal上使用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。
我希望它能对某人有所帮助。我仍然需要弄清楚“舵图”的设置。