다음을 통해 공유


Azure Kubernetes Fleet Manager 멤버 클러스터에서 다중 클러스터 계층 4 부하 분산 설정(미리 보기)

여러 클러스터에 배포된 애플리케이션의 경우 관리자는 들어오는 트래픽을 클러스터 간에 라우팅하려는 경우가 많습니다.

이 문서에 따라 이러한 다중 클러스터 애플리케이션에 대해 레이어 4 부하 분산을 설정할 수 있습니다.

Important

Azure Kubernetes Fleet Manager 미리 보기 기능은 셀프 서비스, 옵트인 기반으로 제공됩니다. 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. Azure Kubernetes Fleet Manager 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다.

필수 조건

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

  • 이 문서에서 참조하는 ServiceExportMultiClusterService 개체에 대한 설명을 제공하는 이 기능의 개념적 개요를 읽어보세요.

  • 허브 클러스터 및 멤버 클러스터가 있는 Fleet 리소스가 있어야 합니다. 이 리소스가 없는 경우 빠른 시작: Fleet 리소스를 만들고 멤버 클러스터에 조인을 따르세요.

  • 워크로드가 배포되는 대상 AKS(Azure Kubernetes Service) 클러스터는 동일한 가상 네트워크 또는 피어링된 가상 네트워크에 있어야 합니다.

  • Access Fleet Hub 클러스터 Kubernetes API의 단계에 따라 허브 클러스터의 Kubernetes API액세스해야 합니다.

  • 다음 환경 변수를 설정하고 집합 및 모든 멤버 클러스터에 대한 kubeconfigs를 가져옵니다.

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBER_CLUSTER_1=aks-member-1
    export MEMBER_CLUSTER_2=aks-member-2
    
    az fleet get-credentials --resource-group ${GROUP} --name ${FLEET} --file fleet
    
    az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_1} --file aks-member-1
    
    az aks get-credentials --resource-group ${GROUP} --name ${MEMBER_CLUSTER_2} --file aks-member-2
    

Fleet 리소스의 멤버 클러스터에 워크로드 배포

참고 항목

  • 이 사용 방법 가이드의 단계는 데모용으로만 샘플 애플리케이션을 참조하세요. 기존 배포 및 서비스 개체를 이 워크로드로 대체할 수 있습니다.

  • 이 단계에서는 Kubernetes 구성 전파를 사용하여 Fleet 클러스터에서 멤버 클러스터로 샘플 워크로드를 배포합니다. 또는 이러한 Kubernetes 구성을 한 번에 하나씩 개별적으로 각 멤버 클러스터에 배포하도록 선택할 수 있습니다.

  1. 집합 클러스터에서 네임스페이스를 만듭니다.

    KUBECONFIG=fleet kubectl create namespace kuard-demo
    

    출력은 다음 예제와 유사합니다.

    namespace/kuard-demo created
    
  2. 배포, 서비스, ServiceExport 개체를 적용합니다.

    KUBECONFIG=fleet kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-export-service.yaml
    

    위 파일의 ServiceExport 사양을 사용하면 멤버 클러스터에서 Fleet 리소스로 서비스를 내보낼 수 있습니다. 성공적으로 내보내면 서비스와 모든 엔드포인트가 집합 클러스터에 동기화되고 이러한 엔드포인트에서 다중 클러스터 부하 분산을 설정하는 데 사용할 수 있습니다. 출력은 다음 예제와 유사합니다.

    deployment.apps/kuard created
    service/kuard created
    serviceexport.networking.fleet.azure.com/kuard created
    
  3. crp-2.yaml이라는 파일에 다음 ClusterResourcePlacement를 만듭니다. eastus 지역에서 클러스터를 선택하고 있습니다.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: kuard-demo
    spec:
      resourceSelectors:
        - group: ""
          version: v1
          kind: Namespace
          name: kuard-demo
      policy:
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      fleet.azure.com/location: eastus
    
  4. ClusterResourcePlacement를 적용합니다.

    KUBECONFIG=fleet kubectl apply -f crp-2.yaml
    

    성공하면 출력은 다음 예제와 유사하게 표시됩니다.

    clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
    
  5. ClusterResourcePlacement 상태를 확인합니다.

    KUBECONFIG=fleet kubectl get clusterresourceplacements
    

    성공하면 출력은 다음 예제와 유사하게 표시됩니다.

    NAME            GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
    kuard-demo      1     True        1              True      1            20s
    

MultiClusterService를 만들어 여러 멤버 클러스터의 서비스 엔드포인트 간에 부하 분산

  1. eastus 지역의 멤버 클러스터에 대해 서비스가 성공적으로 내보내졌는지 확인합니다.

    KUBECONFIG=aks-member-1 kubectl get serviceexport kuard --namespace kuard-demo
    

    출력은 다음 예제와 유사합니다.

    NAME    IS-VALID   IS-CONFLICTED   AGE
    kuard   True       False           25s
    
    KUBECONFIG=aks-member-2 kubectl get serviceexport kuard --namespace kuard-demo
    

    출력은 다음 예제와 유사합니다.

    NAME    IS-VALID   IS-CONFLICTED   AGE
    kuard   True       False           55s
    

    서비스가 내보내기에 유효하고(IS-VALID 필드는 true) 다른 내보내기와 충돌하지 않는지 확인해야 합니다(IS-CONFLICTfalse).

    참고 항목

    ServiceExport가 전파되는 데 1~2분 정도 걸릴 수 있습니다.

  2. 한 멤버에 MultiClusterService를 만들어 다음 클러스터의 서비스 엔드포인트에서 부하를 분산합니다.

    KUBECONFIG=aks-member-1 kubectl apply -f https://raw.githubusercontent.com/Azure/AKS/master/examples/fleet/kuard/kuard-mcs.yaml
    

    참고 항목

    공용 IP 대신 내부 IP를 통해 서비스를 노출하려면 MultiClusterService에 주석을 추가합니다.

    apiVersion: networking.fleet.azure.com/v1alpha1
    kind: MultiClusterService
    metadata:
      name: kuard
      namespace: kuard-demo
      annotations:
         service.beta.kubernetes.io/azure-load-balancer-internal: "true"
      ...
    

    출력은 다음 예제와 유사합니다.

    multiclusterservice.networking.fleet.azure.com/kuard created
    
  3. 다음 명령을 실행하여 MultiClusterService가 유효한지 확인합니다.

    KUBECONFIG=aks-member-1 kubectl get multiclusterservice kuard --namespace kuard-demo
    

    출력은 다음 예제와 유사하게 표시됩니다.

    NAME    SERVICE-IMPORT   EXTERNAL-IP     IS-VALID   AGE
    kuard   kuard            <a.b.c.d>       True       40s
    

    IS-VALID 필드는 출력에서 true여야 합니다. 출력에서 외부 부하 분산 장치 IP 주소(EXTERNAL-IP)를 확인합니다. 가져오기가 완전히 처리되고 IP 주소를 사용할 수 있게 되기까지 다소 시간이 걸릴 수 있습니다.

  4. 외부 부하 분산 장치 IP 주소를 사용하여 다음 명령을 여러 번 실행합니다.

    curl <a.b.c.d>:8080 | grep addrs 
    

    요청을 제공하는 Pod의 IP가 변경되고 있으며 이러한 Pod는 eastus 지역의 멤버 클러스터 aks-member-1aks-member-2에 있습니다. eastus 지역의 클러스터에서 다음 명령을 실행하여 Pod IP를 확인할 수 있습니다.

    KUBECONFIG=aks-member-1 kubectl get pods -n kuard-demo -o wide
    
    KUBECONFIG=aks-member-2 kubectl get pods -n kuard-demo -o wide