다음을 통해 공유


AGIC를 사용하여 AKS 클러스터에서 다중 네임스페이스 지원 사용

Kubernetes 네임스페이스를 사용하면 Kubernetes 클러스터를 분할하고 더 큰 팀의 하위 그룹에 할당할 수 있습니다. 그런 다음, 이러한 하위 그룹은 리소스, 보안 및 구성을 더 세부적으로 제어하여 인프라를 배포하고 관리할 수 있습니다. Kubernetes를 사용하면 각 네임스페이스 내에서 하나 이상의 수신 리소스를 독립적으로 정의할 수 있습니다.

버전 0.7 부터 AGIC(Application Gateway Kubernetes 수신 컨트롤러 )는 여러 네임스페이스에서 이벤트를 수집하고 관찰할 수 있습니다. AKS(Azure Kubernetes Service) 관리자가 Azure 애플리케이션 게이트웨이를 수신으로 사용하기로 결정한 경우 모든 네임스페이스는 Application Gateway의 동일한 배포를 사용합니다. AGIC의 단일 설치는 액세스 가능한 네임스페이스를 모니터링하고 연결된 Application Gateway 배포를 구성합니다.

HELM 구성에서 하나 이상의 다른 네임스페이스로 명시적으로 변경하지 않는 한 AGIC 버전 0.7은 계속해서 네임스페이스를 독점적으로 관찰 default 합니다.

Kubernetes 수신 솔루션에 대한 컨테이너용 Application Gateway를 고려합니다.

다중 네임스페이스 지원 사용

  1. 다음 방법 중 하나를 사용하여 helm-config.yaml 파일을 수정합니다.

    • watchNamespace helm-config.yaml에서 키를 완전히 삭제합니다. AGIC는 모든 네임스페이스를 관찰합니다.
    • watchNamespace를 빈 문자열로 설정합니다. AGIC는 모든 네임스페이스를 관찰합니다.
    • 쉼표로 구분된 여러 네임스페이스를 추가합니다(예: watchNamespace: default,secondNamespace). AGIC는 이러한 네임스페이스를 단독으로 관찰합니다.
  2. 를 실행 helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure하여 Helm 템플릿 변경 내용을 적용합니다.

여러 네임스페이스를 관찰하는 기능을 사용하여 AGIC를 배포한 후 다음 작업을 수행합니다.

충돌하는 구성 처리

여러 이름의 수신 리소스는 단일 Application Gateway 배포에 대해 충돌하는 구성을 만들도록 AGIC에 지시할 수 있습니다. 즉, 두 개의 수신이 동일한 도메인을 클레임할 수 있습니다.

계층 구조의 맨 위에서 AGIC는 수신기(IP 주소, 포트 및 호스트) 및 라우팅 규칙(바인딩 수신기, 백 엔드 풀 및 HTTP 설정)을 만들 수 있습니다. 여러 네임스페이스와 수신이 공유할 수 있습니다.

반면 AGIC는 하나의 네임스페이스에 대해서만 경로, 백 엔드 풀, HTTP 설정 및 TLS 인증서를 만들고 중복 항목을 제거할 수 있습니다.

예를 들어 다음에 대한 네임스페이스 및 production 네임스페이 staging 스에 정의된 다음과 같은 중복 수신 리소스를 고려합니다.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

www.contoso.com에 대한 트래픽을 각 Kubernetes 네임스페이스로 라우팅해야 하는 두 개의 수신 리소스가 있더라도 하나의 백 엔드만 트래픽을 처리할 수 있습니다. AGIC는 리소스 중 하나에 대해 "선착순으로" 구성을 만듭니다. 두 개의 수신 리소스가 동시에 만들어지면 알파벳 앞부분의 리소스가 우선합니다. 이 속성에 따라 AGIC는 수신에 production 대한 설정을 만듭니다. Application Gateway는 다음 리소스로 구성됩니다.

  • 수신기: 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

참고 항목

수신기라우팅 규칙을 제외하고 생성된 Application Gateway 리소스에는 AGIC에서 만든 네임스페이스(production)의 이름이 포함됩니다.

두 수신 리소스가 서로 다른 시점에 AKS 클러스터에 도입되는 경우 AGIC는 Application Gateway를 다시 구성하고 트래픽을 다시 라우팅하는 namespace-A시나리오에서 namespace-B 끝날 가능성이 높습니다.

예를 들어 먼저 추가하는 staging 경우 AGIC는 스테이징 백 엔드 풀로 트래픽을 라우팅하도록 Application Gateway를 구성합니다. 이후 단계에서 production 수신을 도입하면 AGIC가 Application Gateway를 다시 프로그래밍하여 production 백 엔드 풀에 대한 트래픽을 라우팅하기 시작합니다.

네임스페이스에 대한 액세스 제한

기본적으로 AGIC는 네임스페이스 내에서 주석이 추가된 수신을 기반으로 Application Gateway를 구성합니다. 이 동작을 제한하려면 다음 옵션이 있습니다.

  • HELM-config.yaml에서 YAML 키를 통해 watchNamespace AGIC에서 관찰해야 하는 네임스페이스를 명시적으로 정의하여 네임스페이스를 제한합니다.
  • 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>