共用方式為


使用應用程式閘道輸入控制器在 AKS 叢集中啟用多命名空間支援

動機

Kubernetes 命名空間 可將 Kubernetes 叢集分割並配置給大型小組的子群組。 子群組可因此更精細地控管資源、安全性、設定等,藉此部署和管理基礎結構。透過 Kubernetes,可在每個命名空間內獨立定義一或多個輸入資源。

截至 0.7 版本,Azure 應用程式閘道 Kubernetes 輸入控制器 (AGIC) 可以擷取事件並觀察多個命名空間。 如果 AKS 系統管理員決定使用應用程式閘道作為輸入,則所有命名空間會使用相同的應用程式閘道執行個體。 輸入控制器的單一安裝會監視可存取的命名空間,並設定與其相關聯的應用程式閘道。

AGIC 0.7 版會繼續以獨佔方式觀察 default 命名空間,除非已明確在為 Helm 設定中變更一或多個不同命名空間。 請參閱下列各節。

提示

另請參閱什麼是適用於容器的應用程式閘道?本文目前為公開預覽狀態。

啟用多個命名空間支援

若要啟用多明明空間支援,方法如下:

  1. 以下列其中一種方式修改 helm-config.yaml 檔案:
    • helm-config.yaml 完全刪除 watchNamespace 金鑰 - 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 標註的輸入資源
  • 撰寫合併應用程式閘道設定
  • 透過 ARM 將設定套用至相關聯的應用程式閘道

衝突的設定

多命名空間的輸入資源可能會指示 AGIC 為單一應用程式閘道建立衝突的設定。 (兩個輸入針對執行個體宣告相同網域。)

在階層頂端,接聽程式 (IP 位址、連接埠和主機) 和路由規則 (繫結接聽程式、後端集區和 HTTP 設定) 可由多個命名空間/輸入建立和共用。

另一方面,路徑、後端集區、HTTP 設定和 TLS 憑證只能由一個命名空間建立,且系統會移除重複項目。

例如,請思考針對 www.contoso.com 定義的命名空間 stagingproduction 的下列重複輸入資源:

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

雖然有兩個輸入資源要求將流量 www.contoso.com 路由傳送至個別 Kubernetes 命名空間,但只有一個後端可以傳送流量。 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)。

如果兩個輸入資源在不同的時間點傳入 AKS 叢集,AGIC 最終可能會重新設定應用程式閘道,並將流量從 namespace-B 重新路由傳送至 namespace-A

例如,如果您先新增 staging,AGIC 會將應用程式閘道設定為將流量路由傳送至暫存後端集區。 在之後的階段中,引入 production 輸入會導致 AGIC 將應用程式閘道的程式重新設計,開始將流量路由傳送至 production 後端集區。

限制存取命名空間

預設上 AGIC 會根據任何命名空間內的標註輸入來設定應用程式閘道。 如果要限制此行為,可選擇下列選項:

  • 明確定義命名空間 AGIC 應透過 helm-config.yaml 中的 watchNamespace YAML 金鑰來觀察,藉此限制命名空間
  • 使用 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 acessible 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>