我最近正在尝试为我的 Kubernetes 集群构建一个 Nginx Ingress 网络。我通过入口控制器映像 docker.io/nginx/nginx-ingress:alpine 使用 Kubernetes 1.15.0 和 Nginx 1.17.2。
我正在使用一个简单的服务器进行测试,它只告诉客户端请求的路径是什么。这是为了了解 Ingress 资源配置中的重写目标和路径规则。下面是我正在使用的入口配置文件,
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-test
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: "/"
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: kubernetes-brion-us
http:
paths:
- backend:
serviceName: test
servicePort: 1000
path: "/test"
- backend:
serviceName: test
servicePort: 1000
path: "/abc/(.*)"
以下是尝试访问这些服务的输出,
> curl http://kubernetes-brion-us/test
incoming url /test
> curl http://kubernetes-brion-us/abc/test
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.2</center>
</body>
</html>
> curl "http://kubernetes-brion-us/abc/(.*)"
incoming url /abc/(.*)
在控制器 Pod 中,Nginx 配置反映了上述行为,
/ # grep location /etc/nginx/conf.d/default-ingress-test.conf
location /test {
location /abc/(.*) {
/ # grep root /etc/nginx/conf.d/default-ingress-test.conf
/ #
根据 Kubernetes 文档,ingress.spec.rules.http.paths.path 资源“是与传入请求的路径匹配的扩展 POSIX 正则表达式”。
除了我怀疑 Nginx 配置文件未使用正则表达式规则的“location ~ /abc/(.*)”语法之外,location 指令没有“root”重写目标。我的简单服务器也表明了这一点。
我用了nginxinc/kubernetes-ingress安装 Nginx 入口控制器。
欢迎回答以下问题
- 我的 nginx.ingress.kubernetes.io 注释未应用吗?如果是,为什么?
- 为什么 Nginx 控制器不遵守我提供的正则表达式规则?
- 我是否下载了错误的 nginx-ingress 镜像?如果是,我应该下载哪个?
- 这是询问的正确地方吗?还是我应该将其移至 nginx-ingress 项目的 github 问题?
答案1
我使用了错误的 nginxinc/kubernetes-ingress 镜像和安装过程。我需要改用这个https://github.com/kubernetes/ingress-nginx。