用 nginx-ingress 控制器重写
Rewrite with nginx-ingress controller
我是 运行 带有 nginx-ingress 控制器的 Kubernetes 内部端口上的 celery flower
我想根据他们的文档重写 /flower/(.*) 请求转到 /$1 的位置:
https://flower.readthedocs.io/en/latest/config.html?highlight=nginx#url-prefix
server {
listen 80;
server_name example.com;
location /flower/ {
rewrite ^/flower/(.*)$ / break;
proxy_pass http://example.com:5555;
proxy_set_header Host $host;
}
}
我想出了以下ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: backend-airflow-ingress
namespace: edna
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/use-regex: "true"
ingress.kubernetes.io/rewrite-target: /
# nginx.ingress.kubernetes.io/app-root: /flower
spec:
rules:
- host:
http:
paths:
- path: /flower(/|$)(.*)
backend:
serviceName: airflow-flower-service
servicePort: 5555
里面POD运行花,我成功拿到了
curl localhost:5555/dashboard
但是,如果进入 POD 运行 Nginx 控制器,则失败。
curl localhost/flower/dashboard
我得到花的回应:
<div class="span12">
<p>
Error, page not found
</p>
</div>
这是我在 nginx.conf in nginx-controller pod
中看到的内容
server {
server_name _ ;
listen 80 default_server reuseport backlog=511 ;
listen 443 default_server reuseport backlog=511 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
location ~* "^/flower(/|$)(.*)" {
set $namespace "edna";
set $ingress_name "backend-airflow-ingress";
set $service_name "";
set $service_port "";
set $location_path "/flower(/|${literal_dollar})(.*)";
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
ssl_redirect = true,
force_no_ssl_redirect = false,
use_port_in_redirects = false,
})
balancer.rewrite()
plugins.run()
}
# be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any
# will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)`
# other authentication method such as basic auth or external auth useless - all requests will be allowed.
#access_by_lua_block {
#}
header_filter_by_lua_block {
lua_ingress.header()
plugins.run()
}
body_filter_by_lua_block {
}
好的,明白了
ingress.kubernetes.io/rewrite-target: /
在我的例子中应该是不同的注释
nginx.ingress.kubernetes.io/rewrite-target: /
我是 运行 带有 nginx-ingress 控制器的 Kubernetes 内部端口上的 celery flower
我想根据他们的文档重写 /flower/(.*) 请求转到 /$1 的位置: https://flower.readthedocs.io/en/latest/config.html?highlight=nginx#url-prefix
server {
listen 80;
server_name example.com;
location /flower/ {
rewrite ^/flower/(.*)$ / break;
proxy_pass http://example.com:5555;
proxy_set_header Host $host;
}
}
我想出了以下ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: backend-airflow-ingress
namespace: edna
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/use-regex: "true"
ingress.kubernetes.io/rewrite-target: /
# nginx.ingress.kubernetes.io/app-root: /flower
spec:
rules:
- host:
http:
paths:
- path: /flower(/|$)(.*)
backend:
serviceName: airflow-flower-service
servicePort: 5555
里面POD运行花,我成功拿到了
curl localhost:5555/dashboard
但是,如果进入 POD 运行 Nginx 控制器,则失败。
curl localhost/flower/dashboard
我得到花的回应:
<div class="span12">
<p>
Error, page not found
</p>
</div>
这是我在 nginx.conf in nginx-controller pod
中看到的内容server {
server_name _ ;
listen 80 default_server reuseport backlog=511 ;
listen 443 default_server reuseport backlog=511 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
location ~* "^/flower(/|$)(.*)" {
set $namespace "edna";
set $ingress_name "backend-airflow-ingress";
set $service_name "";
set $service_port "";
set $location_path "/flower(/|${literal_dollar})(.*)";
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
ssl_redirect = true,
force_no_ssl_redirect = false,
use_port_in_redirects = false,
})
balancer.rewrite()
plugins.run()
}
# be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any
# will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)`
# other authentication method such as basic auth or external auth useless - all requests will be allowed.
#access_by_lua_block {
#}
header_filter_by_lua_block {
lua_ingress.header()
plugins.run()
}
body_filter_by_lua_block {
}
好的,明白了
ingress.kubernetes.io/rewrite-target: /
在我的例子中应该是不同的注释
nginx.ingress.kubernetes.io/rewrite-target: /