Udostępnij za pośrednictwem


Włączanie obsługi wielu przestrzeni nazw w klastrze usługi AKS przy użyciu programu AGIC

Przestrzenie nazw Kubernetes umożliwiają partycjonowanie klastra Kubernetes i przydzielanie ich do podgrup większego zespołu. Te podgrupy mogą następnie wdrażać infrastrukturę i zarządzać nią za pomocą bardziej precyzyjnych mechanizmów kontroli zasobów, zabezpieczeń i konfiguracji. Platforma Kubernetes umożliwia niezależne definiowanie co najmniej jednego zasobu przychodzącego w każdej przestrzeni nazw.

Od wersji 0.7 kontroler ruchu przychodzącego (AGIC) usługi Application Gateway może pozyskiwać zdarzenia z wielu przestrzeni nazw i obserwować je. Jeśli administrator usługi Azure Kubernetes Service (AKS) zdecyduje się użyć bramy aplikacja systemu Azure jako ruchu przychodzącego, wszystkie przestrzenie nazw używają tego samego wdrożenia usługi Application Gateway. Pojedyncza instalacja programu AGIC monitoruje dostępne przestrzenie nazw i konfiguruje wdrożenie usługi Application Gateway skojarzone z nim.

Wersja 0.7 programu AGIC będzie nadal obserwować default wyłącznie przestrzeń nazw, chyba że jawnie zmienisz ją na co najmniej jedną inną przestrzeń nazw w konfiguracji programu Helm.

Napiwek

Rozważ użycie usługi Application Gateway dla kontenerów dla rozwiązania ruchu przychodzącego Kubernetes.

Włączanie obsługi wielu przestrzeni nazw

  1. Zmodyfikuj plik helm-config.yaml na jeden z następujących sposobów:

    • watchNamespace Usuń klucz całkowicie z pliku helm-config.yaml. Program AGIC obserwuje wszystkie przestrzenie nazw.
    • Ustaw watchNamespace wartość na pusty ciąg. Program AGIC obserwuje wszystkie przestrzenie nazw.
    • Dodaj wiele przestrzeni nazw rozdzielonych przecinkami (na przykład watchNamespace: default,secondNamespace). AGIC obserwuje te przestrzenie nazw wyłącznie.
  2. Zastosuj zmiany szablonu programu Helm, uruchamiając polecenie helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure.

Po wdrożeniu programu AGIC z możliwością obserwowania wielu przestrzeni nazw wykonuje następujące akcje:

  • Wyświetla listę zasobów przychodzących ze wszystkich dostępnych przestrzeni nazw
  • Filtry do zasobów przychodzących z adnotacjami kubernetes.io/ingress.class: azure/application-gateway
  • Komponuje połączoną konfigurację usługi Application Gateway
  • Stosuje konfigurację do skojarzonego wdrożenia usługi Application Gateway za pośrednictwem usługi Azure Resource Manager

Obsługa konfiguracji powodującej konflikt

Zasoby przychodzące z wieloma przestrzeniami nazw mogą poinstruować program AGIC o utworzeniu konfiguracji powodujących konflikt dla pojedynczego wdrożenia usługi Application Gateway. Oznacza to, że dwa wejścia mogą uznać tę samą domenę.

W górnej części hierarchii program AGIC może tworzyć odbiorniki (adres IP, port i host) oraz reguły routingu (powiązanie odbiornika, puli zaplecza i ustawień PROTOKOŁU HTTP). Wiele przestrzeni nazw i ruchu przychodzącego może je udostępniać.

Z drugiej strony program AGIC może tworzyć ścieżki, pule zaplecza, ustawienia HTTP i certyfikaty TLS tylko dla jednej przestrzeni nazw i usuwać duplikaty.

Rozważmy na przykład następujące zduplikowane zasoby ruchu przychodzącego zdefiniowane w staging przestrzeniach nazw i production dla elementu 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

Pomimo dwóch zasobów przychodzących wymagających ruchu do www.contoso.com kierowania do odpowiednich przestrzeni nazw kubernetes, tylko jedno zaplecze może obsługiwać ruch. AGIC tworzy konfigurację na zasadzie "pierwszy na, pierwszy na wyjęcie" dla jednego z zasobów. Jeśli dwa zasoby ruchu przychodzącego są tworzone w tym samym czasie, pierwszeństwo ma jeden wcześniejszy alfabet. Na podstawie tej właściwości program AGIC tworzy ustawienia dla ruchu przychodzącego production . Usługa Application Gateway jest skonfigurowana przy użyciu następujących zasobów:

  • Słuchacz: fl-www.contoso.com-80
  • Reguła routingu: rr-www.contoso.com-80
  • Pula zaplecza: pool-production-contoso-web-service-80-bp-80
  • Ustawienia protokołu HTTP: bp-production-contoso-web-service-80-80-websocket-ingress
  • Sonda kondycji: pb-production-contoso-web-service-80-websocket-ingress

Uwaga

Z wyjątkiem reguły odbiornika i routingu utworzone zasoby usługi Application Gateway zawierają nazwę przestrzeni nazw (production), dla której zostały utworzone przez usługę AGIC.

Jeśli dwa zasoby ruchu przychodzącego zostaną wprowadzone do klastra usługi AKS w różnych punktach w czasie, usługa AGIC prawdopodobnie zakończy się w scenariuszu, w którym ponownie skonfiguruje usługę Application Gateway i przekierowuje ruch z namespace-B do namespace-Asystemu .

Jeśli na przykład dodasz staging najpierw, usługa AGIC skonfiguruje usługę Application Gateway do kierowania ruchu do przejściowej puli zaplecza. Na późniejszym etapie wprowadzenie production ruchu przychodzącego powoduje, że usługa AGIC przeprogramuje usługę Application Gateway, która rozpoczyna kierowanie ruchu do puli zaplecza production .

Ograniczanie dostępu do przestrzeni nazw

Domyślnie usługa AGIC konfiguruje usługę Application Gateway na podstawie adnotacji przychodzących w dowolnej przestrzeni nazw. Jeśli chcesz ograniczyć to zachowanie, masz następujące opcje:

  • Ogranicz przestrzenie nazw, jawnie definiując przestrzenie nazw, które program AGIC powinien obserwować za pośrednictwem watchNamespace klucza YAML w pliku helm-config.yaml.
  • Użyj obiektów Role i RoleBinding, aby ograniczyć AGIC do określonych przestrzeni nazw.

Przykładowy plik konfiguracji programu 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>