我正在尝试使用nginx实现标头路由入口规则。为什么呢因为相同的路径应该基于headers转到不同的后端。这是我尝试过的:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api-mutli-back
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
set $dataflag 0;
if ( $http_content_type ~ "multipart\/form-data.*" ){
set $dataflag 1;
}
if ( $dataflag = 1 ){
set $service_name "backend-data";
}
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: backend-default
servicePort: 80
path: /api
但是nginx的日志输出此错误:
unknown directive "set $service_name backend-data" in /tmp/nginx-cfg864446123:1237
对我来说似乎不合逻辑...如果我检查nginx生成的配置,则每条规则都会在开头处生成一个类似以下内容的位置:
[...]
location ~* "^/api" {
set $namespace "my-namespace";
set $ingress_name "api-multi-back";
set $service_name "backend-default";
[...]
我在做什么错?不能用注释configuration-snippet重新定义service_name变量吗?还有其他方法吗?
编辑:我在Nginx上的错误是由于set $ service_name和backend-data之间缺少确切的空格。然后,nginx正确生成了配置,但仍未路由到另一个kubernetes服务。
您被YAML主义所咬伤:
[您的第二个if
块的缩进与其他字符的缩进不同,因此YAML认为您正在annotations:
下开始一个新的键
您有
metadata:
name: api-mutli-back
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
set $dataflag 0;
if ( $http_content_type ~ "multipart\/form-data.*" ){
set $dataflag 1;
}
if ( $dataflag = 1 ){
set $service_name "backend-data"
}
但是您应该拥有:
metadata:
name: api-mutli-back
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
set $dataflag 0;
if ( $http_content_type ~ "multipart\/form-data.*" ){
set $dataflag 1;
}
if ( $dataflag = 1 ){
set $service_name "backend-data"
}