使用带路径重定向的 nginx kubernetes 路由 LoadBalancer 时,为什么我无法正确访问我的服务?
When using a nginx kubernetes routing LoadBalancer with path redirects, why can I not access my service correctly?
我正在使用 AKS 和 Helm v2.2 来尝试部署一个图表,该图表利用 nginx LoadBalancer Pod 来控制通过单个 IP 地址进入我的服务的所有入口。这在很大程度上处于实验阶段,但我已经证明,当我为我的 .net 核心 webapi 服务使用以下 Helm 入口配置时:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host:
paths:
- /
然后我确实可以访问我暴露的 api 并在
看到大摇大摆的 ui
http://[My External IP]/index.html
然后我想做的是将多个服务放在同一个 LoadBalancer 后面(如您所愿),所以我的期望是我可以将上述服务配置更改为如下所示:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host:
paths:
- /serviceA
这应该意味着我可以通过现在更新的 url:
访问相同的服务
http://[My External IP]/serviceA/index.html
这是我应该期待的工作吗?我是否需要使用任何类型的重写系统,因为我从这个 url 中得到错误,说它找不到某些缺失的资源。任何使用重写注释的尝试也没有帮助我。有人可以帮我指出我可能做错了什么吗?使用新的 url 路径,我最终遇到以下类型的错误,这些错误似乎是 index.html 页面试图加载的文件,表明它工作了一半但需要重写或其他东西?
Failed to load resource: the server responded with a status of 404 ()
由于 Helm 图表模板引擎,创建了以下入口 yaml 文件:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myrelease-release-manager
labels:
app.kubernetes.io/name: release-manager
helm.sh/chart: release-manager-0.1.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0"
app.kubernetes.io/managed-by: Tiller
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /serviceA
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host:
http:
paths:
- path: /serviceA
backend:
serviceName: myrelease-release-manager
servicePort: 80
由于这个入口文件,当我使用路径 /serviceA/index.html.
访问我的外部 IP 地址时,我想访问此服务
关闭,您需要将重写目标更新为/$2
nginx.ingress.kubernetes.io/rewrite-target: /
重写
/serviceB/foo -> /foo
/serviceA/foo -> /foo
但是每个人都将被定向到该路径的服务
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myrelease-release-manager
labels:
app.kubernetes.io/name: release-manager
helm.sh/chart: release-manager-0.1.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0"
app.kubernetes.io/managed-by: Tiller
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- backend:
serviceName: serviceB
servicePort: 80
path: /serviceB(/|$)(.*)
- backend:
serviceName: serviceA
servicePort: 80
path: /serviceA(/|$)(.*)
我正在使用 AKS 和 Helm v2.2 来尝试部署一个图表,该图表利用 nginx LoadBalancer Pod 来控制通过单个 IP 地址进入我的服务的所有入口。这在很大程度上处于实验阶段,但我已经证明,当我为我的 .net 核心 webapi 服务使用以下 Helm 入口配置时:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host:
paths:
- /
然后我确实可以访问我暴露的 api 并在
看到大摇大摆的 uihttp://[My External IP]/index.html
然后我想做的是将多个服务放在同一个 LoadBalancer 后面(如您所愿),所以我的期望是我可以将上述服务配置更改为如下所示:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host:
paths:
- /serviceA
这应该意味着我可以通过现在更新的 url:
访问相同的服务http://[My External IP]/serviceA/index.html
这是我应该期待的工作吗?我是否需要使用任何类型的重写系统,因为我从这个 url 中得到错误,说它找不到某些缺失的资源。任何使用重写注释的尝试也没有帮助我。有人可以帮我指出我可能做错了什么吗?使用新的 url 路径,我最终遇到以下类型的错误,这些错误似乎是 index.html 页面试图加载的文件,表明它工作了一半但需要重写或其他东西?
Failed to load resource: the server responded with a status of 404 ()
由于 Helm 图表模板引擎,创建了以下入口 yaml 文件:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myrelease-release-manager
labels:
app.kubernetes.io/name: release-manager
helm.sh/chart: release-manager-0.1.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0"
app.kubernetes.io/managed-by: Tiller
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /serviceA
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host:
http:
paths:
- path: /serviceA
backend:
serviceName: myrelease-release-manager
servicePort: 80
由于这个入口文件,当我使用路径 /serviceA/index.html.
访问我的外部 IP 地址时,我想访问此服务关闭,您需要将重写目标更新为/$2
nginx.ingress.kubernetes.io/rewrite-target: /
重写
/serviceB/foo -> /foo
/serviceA/foo -> /foo
但是每个人都将被定向到该路径的服务
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: myrelease-release-manager
labels:
app.kubernetes.io/name: release-manager
helm.sh/chart: release-manager-0.1.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0"
app.kubernetes.io/managed-by: Tiller
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- backend:
serviceName: serviceB
servicePort: 80
path: /serviceB(/|$)(.*)
- backend:
serviceName: serviceA
servicePort: 80
path: /serviceA(/|$)(.*)