如何解决迁移后的 Nginx 入口配置 拆分 Ingress 资源:配置 Ingress 资源,以便在两条路径上进行相应的路由
我有以下运行良好的 kubernetes 入口配置(nginx 入口控制器)。
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
name: test01-api-ingress
namespace: test01
spec:
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: test01-new-api-1
servicePort: 80
path: /test01/api1
- backend:
serviceName: test01-new-api-2
servicePort: 80
path: /test01/api2
以上创建如下配置(大部分省略)
location ~* "^/test01/api2\/?(?<baseuri>.*)" {
set $namespace "test01";
set $ingress_name "test01-api-ingress";
set $service_name "test01-new-api-2";
set $service_port "80";
set $location_path "/test01/api2";
rewrite "(?i)/test01/api2/(.*)" /$1 break;
rewrite "(?i)/test01/api2$" / break;
proxy_pass http://upstream_balancer;
proxy_redirect off;
}
location ~* "^/test01/api1\/?(?<baseuri>.*)" {
set $namespace "test01";
set $ingress_name "test01-api-ingress";
set $service_name "test01-new-api-1";
set $service_port "80";
set $location_path "/test01/api1";
rewrite "(?i)/test01/api1/(.*)" /$1 break;
rewrite "(?i)/test01/api1$" / break;
proxy_pass http://upstream_balancer;
proxy_redirect off;
}
对于nginx入口控制器的升级,以下配置应该改变(不知何故)。但是当我应用它的入口配置时:
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite "(?i)/test01/api1/(.*)" /$1 break;
rewrite "(?i)/test01/api1$" / break;
rewrite "(?i)/test01/ap21/(.*)" /$1 break;
rewrite "(?i)/test01/ap21$" / break;
name: test01-api-ingress
namespace: test01
spec:
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: test01-new-api-1
servicePort: 80
path: /test01/api1
- backend:
serviceName: test01-new-api-2
servicePort: 80
path: /test01/api2
我得到以下信息,但无法正常工作,因为它在两个位置都添加了 api1/api2。
location ~* "^/test01/api2" {
set $namespace "test01";
set $ingress_name "test01-api-ingress";
set $service_name "test01-new-api-2";
set $service_port "80";
set $location_path "/test01/api2";
rewrite "(?i)/test01/api1/(.*)" /$1 break;
rewrite "(?i)/test01/api1$" / break;
rewrite "(?i)/test01/ap21/(.*)" /$1 break;
rewrite "(?i)/test01/ap21$" / break;
proxy_pass http://upstream_balancer;
proxy_redirect off;
}
location ~* "^/test01/api1" {
set $namespace "test01";
set $ingress_name "test01-api-ingress";
set $service_name "test01-new-api-1";
set $service_port "80";
set $location_path "/test01/api1";
rewrite "(?i)/test01/api1/(.*)" /$1 break;
rewrite "(?i)/test01/api1$" / break;
rewrite "(?i)/test01/ap21/(.*)" /$1 break;
rewrite "(?i)/test01/ap21$" / break;
proxy_pass http://upstream_balancer;
proxy_redirect off;
}
关于配置应该如何的任何想法?如何将其拆分到相关位置? 谢谢。
解决方法
TL;DR
我认为该帖子会问以下问题:
如何设置某些注释,例如每个 path 的 configuration-snippet
。
此特定设置可以通过任何一种方式解决:
- 按使用的
Ingress
拆分Annotations
资源。 - 通过配置将在两条路径上相应路由的
Ingress
资源。
拆分 Ingress
资源:
您可以将您的 Ingress
资源拆分为多个对象(可以协同工作)。
Annotations
只能在整个 kubernetes 资源上设置,因为它们是资源 metadata
的一部分。 ingress spec
在较低级别不包含该功能。
-- Stackoverflow.com: Questions: Apply nginx-ingress annotations at path level
扩展答案以举例说明如何创建此类设置:
ingress-01.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite "(?i)/test01/api1/(.*)" /$1 break;
rewrite "(?i)/test01/api1$" / break;
name: test01-api-ingress-01
spec:
rules:
- host: example.com
http:
paths:
- path: /test01/api1
backend:
serviceName: test01-new-api-1
servicePort: 80
ingress-02.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite "(?i)/test01/api21/(.*)" /$1 break;
rewrite "(?i)/test01/api21$" / break;
name: test01-api-ingress-02
spec:
rules:
- host: example.com
http:
paths:
- path: /test01/api2
backend:
serviceName: test01-new-api-2
servicePort: 80
一些旁注!
检查您的 snippet
中是否存在潜在的错误类型:
-
rewrite "(?i)/test01/ap21/(.*)" /$1 break;
ap21 而不是api21
-
rewrite "(?i)/test01/ap21$" / break;
ap21 而不是api21
申请上述资源后,您将拥有 2 Ingress
个资源:
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
test01-api-ingress-01 <none> example.com localhost 80 42s
test01-api-ingress-02 <none> example.com localhost 80 42s
配置 Ingress
资源,以便在两条路径上进行相应的路由。
如上所述,您可以使用以下示例为您的 paths
设置路由方案:
此类设置的示例如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test01-api-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: test01-new-api-1
servicePort: 80
path: /test01/api1(/|$)(.*)
- backend:
serviceName: test01-new-api-2
servicePort: 80
path: /test01/api2(/|$)(.*)
我强烈建议您查看有关路径匹配的官方文档:
其他资源:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。