Настройка балансировки нагрузки с несколькими кластерами уровня 4 в кластерах членов Диспетчера парка Azure Kubernetes (предварительная версия)

Для приложений, развернутых в нескольких кластерах, администраторы часто хотят направлять входящий трафик в кластеры.

Вы можете следовать этому документу, чтобы настроить балансировку нагрузки уровня 4 для таких приложений с несколькими кластерами.

Внимание

Предварительные версии функций Azure Kubernetes Fleet Manager доступны на основе самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии Диспетчера флотов Azure Kubernetes частично охватываются поддержкой клиентов на основе лучших усилий. Следовательно, эти функции не предназначены для использования в рабочей среде.

Необходимые компоненты

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

Развертывание рабочей нагрузки в кластерах членов ресурса Fleet

Примечание.

  • Действия, описанные в этом руководстве, относятся только к примеру приложения для демонстрационных целей. Эту рабочую нагрузку можно заменить для любого из существующих объектов развертывания и службы.

  • Эти действия развертывают образец рабочей нагрузки из кластера Fleet в кластеры-члены с помощью распространения конфигурации Kubernetes. Кроме того, можно развернуть эти конфигурации Kubernetes в каждом кластере-члене по отдельности.

  1. Создайте пространство имен в кластере парка:

    KUBECONFIG=fleet kubectl create namespace kuard-demo
    

    Выходные данные выглядят примерно так:

    namespace/kuard-demo created
    
  2. Примените объекты Deployment, Service, 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. Создайте следующий ClusterResourcePlacement код в файле с именем crp-2.yaml. Обратите внимание, что мы выбираем кластеры в регионе eastus :

    apiVersion: placement.kubernetes-fleet.io/v1beta1
    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-CONFLICT is false).

    Примечание.

    Для распространения ServiceExport может потребоваться несколько минут.

  2. Создайте MultiClusterService один член для балансировки нагрузки между конечными точками службы в этих кластерах:

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

    Примечание.

    Чтобы предоставить службу через внутренний 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 
    

    Обратите внимание, что IP-адреса модулей pod, обслуживающих запрос, изменяются, и что эти модули pod находятся из кластеров aks-member-1 членов и aks-member-2 из eastus региона. Чтобы проверить IP-адреса pod, выполните следующие команды в кластерах из eastus региона:

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