为什么只有 / 路径在 AKS 中与 NGINX Ingress Controller 一起工作
Why only / path works in AKS with NGINX Ingress Controller
我有一个干净的 Azure 订阅并使用标准 SKU 和非常基本的设置(2 D2as_v4 个节点,默认设置)创建了 AKS。像这样安装 NGINX:
helm install ingress-nginx ingress-nginx/ingress-nginx
然后放一个虚拟应用程序并使其可通过 Ingress + ClusterIP 服务访问:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-demo
spec:
replicas: 1
selector:
matchLabels:
app: ingress-demo
template:
metadata:
labels:
app: ingress-demo
spec:
containers:
- name: ingress-demo
image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ingress-demo
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: ingress-demo
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: development-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ingress-demo
port:
number: 80
这个 有效 并且我可以在分配给我的 Ingress (link) 的 Public IP 上访问虚拟应用程序。
问题:
我无法使用任何非默认路径配置访问我的应用程序。我得到 Error: Request timed out
除了 /
之外的任何其他内容。此 Ingress 更改对我不起作用:
- path: /foo
使用正则表达式的相同问题:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
...
- path: /dev(/|$)(.*)
更新
我已经尝试了 GitHub issue mentioned by silent 中建议的多个修复方法。
使用以下选项使 /foo
路径有效:
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
但它仍然不适用于正则表达式。要使 /dev(/|$)(.*)
之类的路径可操作,您需要更改 Azure Load Balancer 探针 from HTTP to TCP(保留端口)或使用此标志安装 NGINX 控制器:
--set controller.service.externalTrafficPolicy=Local
不太确定,但听起来您 运行 关注这个问题:https://github.com/Azure/AKS/issues/2903
解决方案post在此post中编辑:https://github.com/Azure/AKS/issues/2903#issuecomment-1109758644
我有一个干净的 Azure 订阅并使用标准 SKU 和非常基本的设置(2 D2as_v4 个节点,默认设置)创建了 AKS。像这样安装 NGINX:
helm install ingress-nginx ingress-nginx/ingress-nginx
然后放一个虚拟应用程序并使其可通过 Ingress + ClusterIP 服务访问:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-demo
spec:
replicas: 1
selector:
matchLabels:
app: ingress-demo
template:
metadata:
labels:
app: ingress-demo
spec:
containers:
- name: ingress-demo
image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ingress-demo
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: ingress-demo
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: development-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ingress-demo
port:
number: 80
这个 有效 并且我可以在分配给我的 Ingress (link) 的 Public IP 上访问虚拟应用程序。
问题:
我无法使用任何非默认路径配置访问我的应用程序。我得到 Error: Request timed out
除了 /
之外的任何其他内容。此 Ingress 更改对我不起作用:
- path: /foo
使用正则表达式的相同问题:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
...
- path: /dev(/|$)(.*)
更新
我已经尝试了 GitHub issue mentioned by silent 中建议的多个修复方法。
使用以下选项使 /foo
路径有效:
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
但它仍然不适用于正则表达式。要使 /dev(/|$)(.*)
之类的路径可操作,您需要更改 Azure Load Balancer 探针 from HTTP to TCP(保留端口)或使用此标志安装 NGINX 控制器:
--set controller.service.externalTrafficPolicy=Local
不太确定,但听起来您 运行 关注这个问题:https://github.com/Azure/AKS/issues/2903
解决方案post在此post中编辑:https://github.com/Azure/AKS/issues/2903#issuecomment-1109758644