nginx - 如何使用 nginx 入口 Controller 拥有 header 路由逻辑?

标签 nginx kubernetes routing http-headers nginx-ingress

我正在尝试使用 nginx 实现 header 路由入口规则。为什么 ?因为相同的路径应该根据 header 转到不同的后端。这是我尝试过的:

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";
[...]

我究竟做错了什么 ?是不是可以重新定义服务名称带注释的变量 配置片段 ?还有其他方法吗?

编辑:我在 nginx 方面的错误是由于 set $service_name 和 backend-data 之间缺少确切的空格。然后 nginx 正确生成了配置,但它仍然没有路由到另一个 kubernetes 服务。

最佳答案

你被 YAML 主义咬了:

您的第二个缩进 if block 与其他的缩进不同,因此 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"
      }

关于nginx - 如何使用 nginx 入口 Controller 拥有 header 路由逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59805433/

相关文章:

Nginx:你应该增加 server_names_hash_bucket_size: 32 - 这样做了但没有效果

ruby-on-rails - 为什么 ActionDispatch::Request.original_url 返回错误的方案?

amazon-web-services - 在 Elastic BeansTalk、Tomcat、Nginx 中将 Http 重定向到 Https

flask - Kubernetes : Session invalidated when using ELB 上的 PGadmin4

logging - 如何监控Linux路由器上的路由决策

ruby-on-rails - 可选的 belongs_to 和 Rails 路由

routing - 用 flutter 嵌套路由

Nginx 自定义 error_page 413

node.js - 从 .env 文件创建 kubernetes env var secret

kubernetes - GCP K8的 native 入口保留客户端IP