Настройка балансировки нагрузки с несколькими кластерами уровня 4 в кластерах членов Диспетчера парка Azure Kubernetes (предварительная версия)
Для приложений, развернутых в нескольких кластерах, администраторы часто хотят направлять входящий трафик в кластеры.
Вы можете следовать этому документу, чтобы настроить балансировку нагрузки уровня 4 для таких приложений с несколькими кластерами.
Внимание
Предварительные версии функций Azure Kubernetes Fleet Manager доступны на основе самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии Диспетчера флотов Azure Kubernetes частично охватываются поддержкой клиентов на основе лучших усилий. Следовательно, эти функции не предназначены для использования в рабочей среде.
Необходимые компоненты
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
Ознакомьтесь с концептуальным обзором этой функции, которая содержит описание
ServiceExport
иMultiClusterService
объекты, на которые ссылается этот документ.У вас должен быть ресурс Fleet с кластером концентратора и кластерами-членами. Если у вас нет этого ресурса, выполните краткое руководство. Создайте ресурс флота и присоедините кластеры участников.
Целевые кластеры Служба Azure Kubernetes (AKS), в которых развернуты рабочие нагрузки, должны присутствовать в одной виртуальной сети или в одноранговых виртуальных сетях.
- Эти целевые кластеры должны быть добавлены в качестве кластеров-членов в ресурс Fleet.
- Эти целевые кластеры должны использовать сети Azure CNI (сетевой интерфейс контейнера).
Чтобы получить доступ к API Kubernetes кластера концентратора, выполните действия, описанные в API Kubernetes кластера Access Hub.
Задайте следующие переменные среды и получите 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
Используйте среду 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 в каждом кластере-члене по отдельности.
Создайте пространство имен в кластере парка:
KUBECONFIG=fleet kubectl create namespace kuard-demo
Выходные данные выглядят примерно так:
namespace/kuard-demo created
Примените объекты 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
Создайте следующий
ClusterResourcePlacement
код в файле с именемcrp-2.yaml
. Обратите внимание, что мы выбираем кластеры в регионе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
Примените следующие
ClusterResourcePlacement
функции:KUBECONFIG=fleet kubectl apply -f crp-2.yaml
В случае успешного выполнения выходные данные выглядят примерно так:
clusterresourceplacement.placement.kubernetes-fleet.io/kuard-demo created
Проверьте состояние
ClusterResourcePlacement
:KUBECONFIG=fleet kubectl get clusterresourceplacements
В случае успешного выполнения выходные данные выглядят примерно так:
NAME GEN SCHEDULED SCHEDULEDGEN APPLIED APPLIEDGEN AGE kuard-demo 1 True 1 True 1 20s
Создание MultiClusterService для балансировки нагрузки между конечными точками службы в нескольких кластерах-членах
Проверьте, успешно ли экспортируется служба для кластеров-членов в
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
isfalse
).Примечание.
Для распространения ServiceExport может потребоваться несколько минут.
Создайте
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
Убедитесь, что 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-адрес становится доступным.Выполните следующую команду несколько раз с помощью 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
Azure Kubernetes Service