Compartir a través de


Habilitar la compatibilidad con varios espacios de nombres en un clúster de AKS mediante AGIC

Los espacios de nombres de Kubernetes permiten que un clúster de Kubernetes se particione y asigne a subgrupos de un equipo mayor. Estos subgrupos pueden implementar y administrar la infraestructura con controles más finos de recursos, seguridad y configuración. Kubernetes permite definir uno o varios recursos de entrada de forma independiente dentro de cada espacio de nombres.

A partir de la versión 0.7, el controlador de entrada de Kubernetes de Application Gateway (AGIC) puede ingerir eventos desde y observar varios espacios de nombres. Si un administrador de Azure Kubernetes Service (AKS) decide usar Azure Application Gateway como entrada, todos los espacios de nombres usan la misma implementación de Application Gateway. Una única instalación de AGIC supervisa los espacios de nombres accesibles y configura la implementación de Application Gateway a la que está asociada.

La versión 0.7 de AGIC sigue observando exclusivamente el espacio de nombres default, a menos que lo cambie explícitamente a uno o varios espacios de nombres diferentes en la configuración de Helm.

Sugerencia

Considere Puerta de enlace de aplicaciones para contenedores como solución de entrada de Kubernetes.

Habilitar la compatibilidad con varios espacios de nombres

  1. Modifique el archivo helm-config.yaml de una de las siguientes maneras:

    • Elimine la clave de watchNamespace por completo de helm-config.yaml. AGIC observa todos los espacios de nombres.
    • Establezca watchNamespace en una cadena vacía. AGIC observa todos los espacios de nombres.
    • Agregue varios espacios de nombres separados por una coma (por ejemplo, watchNamespace: default,secondNamespace). AGIC observa estos espacios de nombres exclusivamente.
  2. Aplique los cambios de plantilla de Helm mediante la ejecución de helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure.

Después de implementar AGIC con la capacidad de observar varios espacios de nombres, realiza las siguientes acciones:

  • Enumera los recursos de entrada de todos los espacios de nombres accesibles
  • Filtra los recursos de entrada anotados con kubernetes.io/ingress.class: azure/application-gateway
  • Compone un combinado de configuración de Application Gateway
  • Aplica la configuración a la implementación de Application Gateway asociada a través de Azure Resource Manager

Controlar configuraciones en conflicto

Varios recursos de entrada espacio de nombres podrían indicar a AGIC que crear configuraciones en conflicto para una sola implementación de Application Gateway. Es decir, dos entradas podrían reclamar el mismo dominio.

En la parte superior de la jerarquía, AGIC podría crear clientes de escucha (dirección IP, puerto y host) y reglas de enrutamiento (agente de escucha de enlace, grupo de back-end y configuración HTTP). Varios espacios de nombres y entradas podrían compartirlos.

Por otro lado, AGIC podría crear rutas de acceso, grupos de back-end, configuración HTTP y certificados TLS solo para un espacio de nombres y quitar duplicados.

Por ejemplo, considere los siguientes recursos de entrada duplicados definidos en los espacios de nombres staging y production para 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

A pesar de los dos recursos de entrada que exigen tráfico para que www.contoso.com se enrute a los respectivos espacios de nombres de Kubernetes, solo un back-end puede atender el tráfico. AGIC crea una configuración sobre una base de "primera entrada y primera salida" para uno de los recursos. Si se crean dos recursos de entrada al mismo tiempo, el anterior en el alfabeto tiene prioridad. En función de esta propiedad, AGIC crea la configuración de la entrada production. Application Gateway se configurará con los siguientes recursos:

  • Cliente de escucha: fl-www.contoso.com-80
  • Regla de enrutamiento: rr-www.contoso.com-80
  • Grupo de back-end: pool-production-contoso-web-service-80-bp-80
  • Configuración HTTP: bp-production-contoso-web-service-80-80-websocket-ingress
  • Sondeo de estado: pb-production-contoso-web-service-80-websocket-ingress

Nota:

A excepción del cliente de escucha y la regla de enrutamiento, los recursos de Application Gateway creados incluyen el nombre del espacio de nombres (production) para el que AGIC los creó.

Si los dos recursos de entrada se introducen en el clúster de AKS en distintos momentos, es probable que AGIC termine en un escenario en el que vuelva a configurar Application Gateway y vuelva a enrutar el tráfico de namespace-B a namespace-A.

Por ejemplo, si agrega staging primero, AGIC configura Application Gateway para enrutar el tráfico al grupo de back-end de almacenamiento provisional. En una fase posterior, la introducción de la entrada de production, provocará que AGIC reprograme Application Gateway, lo que iniciará el enrutamiento del tráfico al grupo de back-end de production.

Restringir acceso a espacios de nombres

De forma predeterminada, AGIC configura Application Gateway en función de la entrada anotada dentro de cualquier espacio de nombres. Si desea limitar este comportamiento, tiene las siguientes opciones:

  • Limite los espacios de nombres al definir explícitamente los espacios de nombres que AGIC debe observar a través de la clave de YAML watchNamespace en helm-config.yaml.
  • Use objetos Rol y RoleBinding para limitar AGIC a espacios de nombres específicos.

Archivo de configuración de Helm de ejemplo

    # 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>