Сопоставление путей Ingress-ресурсов с помощью регулярных выражений#

Здесь показано, как настроить пути в ресурсах Ingress и Mergeable Ingress с помощью аннотации path-regex и регулярных выражений.

Для аннотации path-regex возможны следующие значения:

  • case_insensitive - этот модификатор удобно использовать для маршрутизации, когда регистр не важен, и вы хотите избежать проблем, например с неправильным вводом URL пользователями (запросы на /Tea, /tea, и /TEA будут направлены на один и тот же ресурс).

  • case_sensitive - этот модификатор можно использовать для более строгого контроля маршрутизации, когда регистр имеет значение, например в API (/User/123 и /user/123 могут означать разные сущности).

Рекомендуем также ознакомиться с работой директивы location в документации Angie.

Пример настройки ресурса Ingress#

Чтобы настроить регулярные выражения для путей ресурса Ingress, выполните следующие шаги:

  1. Добавьте в файл cafe-ingress.yaml аннотацию angie.software/path-regex со значением case_sensitive.

    Пример
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
        name: cafe-ingress
        annotations:
        angie.software/path-regex: "case_sensitive"
    spec:
        tls:
        - hosts:
            - cafe.example.com
            secretName: cafe-secret
        rules:
        - host: cafe.example.com
            http:
            paths:
                - path: /tea/[A-Z0-9]
                backend:
                    serviceName: tea-svc
                    servicePort: 80
                - path: /coffee/[A-Z0-9]
                backend:
                    serviceName: coffee-svc
                    servicePort: 80
    
  2. Выполните команду:

    kubectl create -f cafe-ingress.yaml
    

    Пути tea и coffee в конфигурации Angie будут выглядеть следующим образом:

    location ~ "^/tea/[A-Z0-9]"
    
    location ~ "^/coffee/[A-Z0-9]"
    

    Примечание

    Обратите внимание, что модификатор регулярного выражения case_sensitive применяется ко всем путям.

  3. Если вы хотите изменить значение на case_insensitive, обновите файл.

    Пример
       apiVersion: networking.k8s.io/v1
       kind: Ingress
       metadata:
           name: cafe-ingress
           annotations:
           angie.software/path-regex: "case_insensitive"
       spec:
           tls:
           - hosts:
           - cafe.example.com
           secretName: cafe-secret
           rules:
           - host: cafe.example.com
           http:
               paths:
               - path: /tea/[A-Z0-9]
               backend:
                   serviceName: tea-svc
                   servicePort: 80
               - path: /coffee/[A-Z0-9]
               backend:
                   serviceName: coffee-svc
                   servicePort: 80
    

    Теперь пути /tea/[A-Z0-9] и /coffee/[A-Z0-9] в конфигурации Angie будут выглядеть так:

    location ~* "^/tea/[A-Z0-9]"
    
    location ~* "^/coffee/[A-Z0-9]"
    

    Примечание

    Обратите внимание, что модификатор регулярного выражения case_insensitive применяется ко всем путям.

Пример настройки ресурса Mergeable Ingress#

Создание Master Ingress и Minion Ingress#

  1. Создайте Master Ingress в файле cafe-master.yaml.

    Пример
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
        name: cafe-ingress-master
        annotations:
        angie.software/mergeable-ingress-type: "master"
    spec:
        ingressClassName: angie
        tls:
        - hosts:
        - cafe.example.com
        secretName: cafe-secret
        rules:
        - host: cafe.example.com
    
  2. Выполните команду:

    kubectl create -f cafe-master.yaml
    
  3. Проверьте, что Master Ingress создан:

    kubectl get ingress cafe-ingress-master
    
    NAME                  CLASS   HOSTS              PORTS     AGE
    cafe-ingress-master   angie   cafe.example.com   80, 443   29s
    
    kubectl describe ingress cafe-ingress-master
    
    Name:             cafe-ingress-master
    Labels:           <none>
    Namespace:        default
    Address:
    Ingress Class:    angie
    Default backend:  <default>
    TLS:
    cafe-secret terminates cafe.example.com
    Rules:
    Host        Path  Backends
    ----        ----  --------
    *           *     <default>
    Annotations:  angie.software/mergeable-ingress-type: master
    Events:
    Type    Reason          Age   From                      Message
    ----    ------          ----  ----                      -------
    Normal  AddedOrUpdated  62s   angie-ingress-controller  Configuration for default/cafe-ingress-master was added or updated
    
  4. Создайте первый Minion Ingress для tea в файле tea-minion.yaml.

    Пример
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
        name: cafe-ingress-tea-minion
        annotations:
        angie.software/mergeable-ingress-type: "minion"
    spec:
        ingressClassName: angie
        rules:
        - host: cafe.example.com
        http:
            paths:
            - path: /tea
            pathType: Prefix
            backend:
                service:
                name: tea-svc
                port:
                    number: 80
    
  5. Выполните команду:

    kubectl create -f tea-minion.yaml
    
  6. Проверьте, что Minion Ingress создан:

    kubectl get ingress cafe-ingress-tea-minion
    
    NAME                      CLASS   HOSTS              ADDRESS   PORTS   AGE
    cafe-ingress-tea-minion   angie   cafe.example.com             80      23m
    
    kubectl describe ingress cafe-ingress-tea-minion
    
    Name:             cafe-ingress-tea-minion
    Labels:           <none>
    Namespace:        default
    Address:
    Ingress Class:    angie
    Default backend:  <default>
    Rules:
    Host              Path   Backends
    ----              ----   --------
    cafe.example.com
                      /tea   tea-svc:80 (10.244.0.6:8080,10.244.0.7:8080,10.244.0.8:8080)
    Annotations:        angie.software/mergeable-ingress-type: minion
    Events:
    Type    Reason          Age   From                      Message
    ----    ------          ----  ----                      -------
    Normal  AddedOrUpdated  24m   angie-ingress-controller  Configuration for default/cafe-ingress-tea-minion was added or updated
    
  7. Создайте второй Minion Ingress для coffee в файле coffee-minion.yaml.

    Пример
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: cafe-ingress-coffee-minion
    annotations:
        angie.software/mergeable-ingress-type: "minion"
    spec:
    ingressClassName: angie
    rules:
    - host: cafe.example.com
        http:
        paths:
        - path: /coffee
            pathType: Prefix
            backend:
            service:
                name: coffee-svc
                port:
                number: 80
    
  8. Выполните команду:

    kubectl create -f coffee-minion.yaml
    
  9. Проверьте, что Minion Ingress создан:

    kubectl get ingress cafe-ingress-coffee-minion
    
    NAME                         CLASS   HOSTS              ADDRESS   PORTS   AGE
    cafe-ingress-coffee-minion   angie   cafe.example.com             80      5m21s
    
    kubectl describe ingress cafe-ingress-coffee-minion
    
    Name:             cafe-ingress-coffee-minion
    Labels:           <none>
    Namespace:        default
    Address:
    Ingress Class:    angie
    Default backend:  <default>
    Rules:
    Host              Path      Backends
    ----              ----      --------
    cafe.example.com
                      /coffee   coffee-svc:80 (10.244.0.6:8080,10.244.0.7:8080,10.244.0.8:8080)
    Annotations:        angie.software/mergeable-ingress-type: minion
    Events:
    Type    Reason          Age    From                      Message
    ----    ------          ----   ----                      -------
    Normal  AddedOrUpdated  5m52s  angie-ingress-controller  Configuration for default/cafe-ingress-coffee-minion was added or updated
    

Теперь у вас есть Master Ingress и два Minion Ingress. Два Minion Ingress определяются путями /tea и /coffee.

Модификация путей с помощью регулярных выражений#

Ниже показано, как изменить пути /tea и /coffee с помощью регулярных выражений.

  1. Добавьте аннотацию path-regex со значением case_insensitive в Minion Ingress (tea) и измените путь с помощью регулярных выражений (в примере ниже: /tea/[A-Z0-9]).

    Пример
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
        name: cafe-ingress-tea-minion
        annotations:
        angie.software/mergeable-ingress-type: "minion"
        angie.software/path-regex: "case_insensitive"
    spec:
        ingressClassName: angie
        rules:
        - host: cafe.example.com
        http:
            paths:
            - path: /tea/[A-Z0-9]
            pathType: Prefix
            backend:
                service:
                name: tea-svc
                port:
                    number: 80
    
  2. Примените изменения:

    kubectl apply -f tea-minion.yaml
    
  3. Проверьте, что изменения применились:

    kubectl describe ingress cafe-ingress-tea-minion
    
    Name:             cafe-ingress-tea-minion
    Labels:           <none>
    Namespace:        default
    Address:
    Ingress Class:    angie
    Default backend:  <default>
    Rules:
    Host              Path            Backends
    ----              ----            --------
    cafe.example.com
                      /tea/[A-Z0-9]   tea-svc:80 (10.244.0.6:8080,10.244.0.7:8080,10.244.0.8:8080)
    Annotations:        angie.software/mergeable-ingress-type: minion
                        angie.software/path-regex: case_insensitive
    Events:
    Type    Reason          Age                From                      Message
    ----    ------          ----               ----                      -------
    Normal  AddedOrUpdated  47s (x2 over 34m)  angie-ingress-controller  Configuration for default/cafe-ingress-tea-minion was added or updated
    

    Добавленная аннотация path-regex обновляет путь /tea/[A-Z0-9] с использованием модификатора регулярного выражения case_insensitive.

    Обновленный путь (location) в конфигурационном файле Angie будет выглядеть так:

    location ~* "^/tea/[A-Z0-9]"
    

    Примечание

    Обратите внимание, что аннотация path-regex применяется только к путям, определенным в соответствующем Minion Ingress (tea). Пути, определенные во втором Minion Ingress (coffee), не меняются.

  4. Аналогичным образом используйте модификатор регулярного выражения case_sensitive для второго Minion Ingress (coffee) в файле coffee-minion.yaml.

    Пример
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
        name: cafe-ingress-coffee-minion
        annotations:
        angie.software/mergeable-ingress-type: "minion"
        angie.software/path-regex: "case_sensitive"
    spec:
        ingressClassName: angie
        rules:
        - host: cafe.example.com
        http:
            paths:
            - path: /coffee/[A-Za-z0-9]
            pathType: Prefix
            backend:
                service:
                name: coffee-svc
                port:
                    number: 80
    
  5. Примените изменения:

    kubectl apply -f coffee-minion.yaml
    
  6. Проверьте, что изменения применились:

    kubectl describe ingress cafe-ingress-coffee-minion
    
    Name:             cafe-ingress-coffee-minion
    Labels:           <none>
    Namespace:        default
    Address:
    Ingress Class:    angie
    Default backend:  <default>
    Rules:
    Host              Path                 Backends
    ----              ----                 --------
    cafe.example.com
                     /coffee/[A-Za-z0-9]   coffee-svc:80 (10.244.0.10:8080,10.244.0.9:8080)
    Annotations:        angie.software/mergeable-ingress-type: minion
                        angie.software/path-regex: case_sensitive
    Events:
    Type    Reason          Age   From                      Message
    ----    ------          ----  ----                      -------
    Normal  AddedOrUpdated  11m   angie-ingress-controller  Configuration for default/cafe-ingress-coffee-minion was added or updated
    

    Добавленная аннотация path-regex обновляет путь /coffee/[A-Za-z0-9], используя модификатор регулярного выражения case_sensitive.

    Обновленный путь в конфигурационном файле Angie будет выглядеть так:

    location ~ "^/coffee/[A-Za-z0-9]"