【问题标题】:Nginx ingress configuration after migration迁移后的 Nginx 入口配置
【发布时间】:2021-01-08 18:20:28
【问题描述】:

我有以下工作正常的 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;

                }                

关于配置应该如何的任何想法?如何将其拆分为相关位置? 谢谢。

【问题讨论】:

  • 你好。要将您的configuration-snippets 放在特定位置,您可以根据使用的annotations 拆分Ingress 资源。我将跟进如何实现这一目标的答案。

标签: kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

TL;DR

我认为帖子会问以下问题:

如何为每个路径设置某些注释,例如configuration-snippet

可以通过任何一种方式解决此特定设置:

  • 通过使用每个 Annotations 拆分 Ingress 资源。
  • 通过配置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(/|$)(.*)

我强烈建议您查看有关路径匹配的官方文档:

其他资源:

【讨论】:

  • @Dawid Kruk 为什么我必须使用 kubernetes.io/ingress.class: "nginx" ?这与 Kubernetes 1.13.4 兼容吗?
  • @user515576 我重写了这一段。我包含此注释以防您的设置中有多个 Ingress 控制器。在这里您可以阅读更多相关信息:kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress。请考虑是否可以升级您的 Kubernetes 集群,因为它落后于最新 (1.20) 的 7 个主要版本。
  • @Dawid Kruk 具有两个路径配置的一个入口运行良好,但是当我将入口控制器从 0.20.0 更新到 0.30.0 时,此配置破坏了控制器功能。我可以尝试其他配置吗?
  • 您可能想要检查从 0.20.0 到 0.30.0 及以后发生的变化。 github.com/kubernetes/ingress-nginx/blob/master/Changelog.md 在最近的版本中,入口语法有一些变化。 Ingress 概念页面详细介绍了它:kubernetes.io/docs/concepts/services-networking/ingress/…
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2020-08-13
  • 2021-03-09
  • 1970-01-01
相关资源
最近更新 更多