Включение поддержки нескольких пространств имен в кластере AKS с помощью AGIC

Пространства имен Kubernetes позволяют разделять кластер в Kubernetes и выделять его подгруппам более крупной команды. Затем эти подгруппы могут развертывать инфраструктуру и управлять ими с более тонкими элементами управления ресурсами, безопасностью и конфигурацией. Kubernetes позволяет определять один или несколько ресурсов входящего трафика независимо в каждом пространстве имен.

Начиная с версии 0.7 и более поздних, контроллер Ingress Kubernetes для Application Gateway (AGIC) может получать события и наблюдать за несколькими пространствами имен. Если администратор Службы Azure Kubernetes (AKS) решает использовать Шлюз приложений Azure в качестве средства входа, все пространства имен используют одно и то же развертывание Шлюза приложений. Одна установка AGIC отслеживает доступные пространства имен и настраивает развертывание Шлюза приложений, с которым связано.

Версия 0.7 и выше AGIC продолжает исключительно наблюдать за пространством имен default, если вы не укажете в конфигурации Helm одно или несколько других пространств имен.

Совет

Рассмотрите Шлюз приложений для контейнеров в качестве решения для управления входящим трафиком Kubernetes. Дополнительные сведения см. в разделе Краткого руководства по развертыванию Шлюза приложений контроллера контейнеров ALB.

Включение поддержки нескольких пространств имен

  1. Измените файл helm-config.yaml одним из следующих способов:

    • watchNamespace Удалите ключ полностью из helm-config.yaml. AGIC мониторит все пространства имен.
    • Оставьте строку watchNamespace пустой. AGIC отслеживает все пространства имен.
    • Добавьте несколько пространств имен, разделенных запятой (например, watchNamespace: default,secondNamespace). AGIC учитывает только эти пространства имен.
  2. Примените изменения шаблона Helm, выполнив команду helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure.

После развертывания AGIC с возможностью наблюдения за несколькими пространствами имен он выполняет следующие действия:

  • Перечисляет ресурсы входящего трафика из всех доступных пространств имен
  • Фильтры для входящих ресурсов, аннотированных с помощью kubernetes.io/ingress.class: azure/application-gateway
  • Составляет объединенную конфигурацию шлюза приложений
  • Применяет конфигурацию посредством Azure Resource Manager к связанному развертыванию шлюза приложений.

Обработка конфликтующих конфигураций

Ресурсы с несколькими пространствами имен могут указать AGIC на создание конфликтующих конфигураций для развертывания одного Шлюза приложений. То есть два входящего трафика могут претендовать на один и тот же домен.

В верхней части иерархии AGIC может создавать прослушиватели (IP-адрес, порт и узел) и правила маршрутизации (прослушиватель привязки, внутренний пул и параметры HTTP). Несколько пространств имен и объектов ingress могут совместно их использовать.

С другой стороны, AGIC может создавать пути, серверные пулы, параметры HTTP и сертификаты TLS только для одного пространства имен и удалять дубликаты.

Например, рассмотрим следующие дублирующиеся ресурсы входящего трафика, определенные в пространствах имен staging и production для www.contoso.com.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-ingress
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
    - host: www.contoso.com
      http:
        paths:
          - backend:
              serviceName: web-service
              servicePort: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websocket-ingress
  namespace: production
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
    - host: www.contoso.com
      http:
        paths:
          - backend:
              serviceName: web-service
              servicePort: 80

Несмотря на то что два ресурса ingress требуют маршрутизации трафика для www.contoso.com в соответствующие пространства имен Kubernetes, обслуживать трафик может только один сервер. AGIC создает конфигурацию для одного из ресурсов по принципу "первым пришёл, первым обслужен". Если два ресурса входа создаются одновременно, то тот, который раньше в алфавите, имеет приоритет. На основе этого свойства AGIC создает параметры для production входа. Шлюз приложений настроен с помощью следующих ресурсов:

  • Слушатель: fl-www.contoso.com-80
  • Правило маршрутизации: rr-www.contoso.com-80
  • Серверный пул: pool-production-contoso-web-service-80-bp-80
  • Параметры HTTP: bp-production-contoso-web-service-80-80-websocket-ingress
  • Проба работоспособности: pb-production-contoso-web-service-80-websocket-ingress

Примечание.

Кроме прослушивателя и правила маршрутизации, созданные ресурсы Шлюза приложений включают имя пространства имен (production), для которого их создал AGIC.

Если два ресурса входящего трафика вводятся в кластер AKS в разные моменты времени, AGIC, скорее всего, попадёт в ситуацию, когда перенастраивает Шлюз приложений и перенаправляет трафик с namespace-B на namespace-A.

Например, при первом добавлении staging AGIC настраивает шлюз приложений для маршрутизации трафика в тестовый внутренний пул. На более позднем этапе введение production входа приводит к тому, что AGIC перепрограммирует Шлюз приложений, который начинает маршрутизацию трафика в backend production пул.

Ограничение доступа к пространствам имен

По умолчанию AGIC настраивает Шлюз приложений на основе аннотированных входных маршрутов в пределах любого пространства имен. Если вы хотите ограничить это поведение, у вас есть следующие параметры:

  • Ограничьте пространства имен, явно указав пространства имен, которые AGIC должен учитывать с помощью ключа YAML в файле watchNamespace.
  • Используйте объекты Role и RoleBinding, чтобы ограничить AGIC определенными пространствами имен.

Пример файла конфигурации Helm

    # This file contains the essential configs for the ingress controller helm chart

    # Verbosity level of the App Gateway Ingress Controller
    verbosityLevel: 3
    
    ################################################################################
    # Specify which application gateway the ingress controller manages
    #
    appgw:
        subscriptionId: <subscriptionId>
        resourceGroup: <resourceGroupName>
        name: <applicationGatewayName>
    
        # Setting appgw.shared to "true" creates an AzureIngressProhibitedTarget CRD.
        # This prohibits AGIC from applying config for any host/path.
        # Use "kubectl get AzureIngressProhibitedTargets" to view and change this.
        shared: false
    
    ################################################################################
    # Specify which kubernetes namespace the ingress controller watches
    # Default value is "default"
    # Leaving this variable out or setting it to blank or empty string would
    # result in Ingress Controller observing all accessible namespaces.
    #
    # kubernetes:
    #   watchNamespace: <namespace>
    
    ################################################################################
    # Specify the authentication with Azure Resource Manager
    #
    # Two authentication methods are available:
    # - Option 1: AAD-Pod-Identity (https://github.com/Azure/aad-pod-identity)
    armAuth:
        type: aadPodIdentity
        identityResourceID: <identityResourceId>
        identityClientID:  <identityClientId>
    
    ## Alternatively you can use Service Principal credentials
    # armAuth:
    #    type: servicePrincipal
    #    secretJSON: <<Generate this value with: "az ad sp create-for-rbac --subscription <subscription-uuid> --role Contributor --sdk-auth | base64 -w0" >>
    
    ################################################################################
    # Specify if the cluster is Kubernetes RBAC enabled or not
    rbac:
        enabled: false # true/false
    
    # Specify aks cluster related information. THIS IS BEING DEPRECATED.
    aksClusterConfiguration:
        apiServerAddress: <aks-api-server-address>