Распространение ресурсов Kubernetes из концентратора в кластеры-члены
В этой статье описывается концепция распространения ресурсов Kubernetes из центральных кластеров в кластеры-члены с помощью диспетчера флотов Azure Kubernetes (Fleet).
Администраторы платформы часто должны развертывать ресурсы Kubernetes в нескольких кластерах по различным причинам, например:
- Управление доступом с помощью ролей и привязок ролей в нескольких кластерах.
- Запуск приложений инфраструктуры, таких как Prometheus или Flux, которые должны находиться во всех кластерах.
Разработчики приложений часто должны развертывать ресурсы Kubernetes в нескольких кластерах по различным причинам, например:
- Развертывание приложения для обслуживания видео в нескольких кластерах в разных регионах для низкой задержки при просмотре.
- Развертывание приложения корзины для покупок в двух парных регионах для клиентов, которые будут продолжать работать в магазине во время сбоя в одном регионе.
- Развертывание пакетного вычислительного приложения в кластерах с доступными недорогими пулами точечных узлов.
Он мучен для создания, обновления и отслеживания этих ресурсов Kubernetes в нескольких кластерах вручную. Флот предоставляет распространение ресурсов Kubernetes для обеспечения масштабируемого управления ресурсами Kubernetes. С помощью Fleet можно создать ресурсы Kubernetes в кластере концентратора и распространить их на выбранные кластеры-члены с помощью пользовательских ресурсов Kubernetes: MemberCluster
и ClusterResourcePlacement
. Fleet поддерживает эти пользовательские ресурсы на основе облачного решения с открытым исходным кодом с несколькими кластерами. Дополнительные сведения см. в документации по вышестоящему флоту.
Внимание
Предварительные версии функций Azure Kubernetes Fleet Manager доступны на основе самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии Диспетчера флотов Azure Kubernetes частично охватываются поддержкой клиентов на основе лучших усилий. Следовательно, эти функции не предназначены для использования в рабочей среде.
Рабочий процесс распространения ресурсов
Что такое MemberCluster
?
После присоединения кластера к флоту создается соответствующий MemberCluster
пользовательский ресурс в кластере концентратора. Этот пользовательский ресурс можно использовать для выбора целевых кластеров в распространении ресурсов.
Следующие метки можно использовать для выбора целевого кластера в распространении ресурсов и автоматически добавляться во все кластеры-члены:
fleet.azure.com/location
fleet.azure.com/resource-group
fleet.azure.com/subscription-id
Дополнительные сведения см. в справочнике по API MemberCluster.
Что такое ClusterResourcePlacement
?
Объект ClusterResourcePlacement
используется для того, чтобы сообщить планировщику парка, как поместить заданный набор объектов с областью кластера из концентратора в кластеры-члены. Объекты с областью действия пространства имен, такие как Deployments, StatefulSets, DaemonSets, ConfigMaps, Secret и PersistentVolumeClaims, включаются при выборе их содержащего пространства имен.
С помощью ClusterResourcePlacement
:
- Выберите, какие ресурсы Kubernetes в области кластера будут распространяться на кластеры-члены.
- Укажите политики размещения, чтобы вручную или автоматически выбрать подмножество или все кластеры-члены в качестве целевых кластеров.
- Укажите стратегии развертывания для безопасного развертывания всех обновлений выбранных ресурсов Kubernetes в нескольких целевых кластерах.
- Просмотрите ход распространения по отношению к каждому целевому кластеру.
Объект ClusterResourcePlacement
поддерживает использование ConfigMap для конверта объекта для распространения в кластеры-члены без каких-либо непреднамеренных побочных эффектов. К методам выбора относятся:
- Группа, версия и тип: выберите и поместите все ресурсы заданного типа.
- Группа, версия, тип и имя: выберите и поместите один конкретный ресурс заданного типа.
- Группа, версия, тип и метки: выберите и поместите все ресурсы заданного типа, соответствующие предоставленным меткам.
Дополнительные сведения см. в справочнике ClusterResourcePlacement
по API.
При создании ClusterResourcePlacement
можно указать следующие типы сходства:
- requiredDuringSchedulingIgnoredDuringExecution: так как это сходство является обязательным типом во время планирования, он фильтрует кластеры на основе их свойств.
- preferredDuringSchedulingIgnoredDuringExecution: так как это сходство относится только к предпочтительному типу, но не требуется во время планирования, он обеспечивает привилегированное ранжирование кластеров на основе свойств, указанных вами, таких как стоимость или доступность ресурсов.
Для управления количеством кластеров, в которых необходимо распространить ресурс Kubernetes, доступны несколько типов размещения:
PickAll
помещает ресурсы во все доступные кластеры-члены. Эта политика полезна для размещения рабочих нагрузок инфраструктуры, таких как мониторинг кластера или приложения отчетов.PickFixed
помещает ресурсы в определенный список кластеров-членов по имени.PickN
является наиболее гибким вариантом размещения и позволяет выбирать кластеры на основе ограничений сходства или топологии и полезно при распространении рабочих нагрузок по нескольким соответствующим кластерам, чтобы обеспечить доступность.
PickAll
Политика размещения
Политику размещения можно использовать PickAll
для развертывания рабочей нагрузки во всех кластерах-членах в флоте (при необходимости соответствует набору критериев).
В следующем примере показано, как развернуть prod-deployment
пространство имен и все его объекты во всех кластерах, помеченных следующим environment: production
образом:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp-1
spec:
policy:
placementType: PickAll
affinity:
clusterAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
clusterSelectorTerms:
- labelSelector:
matchLabels:
environment: production
resourceSelectors:
- group: ""
kind: Namespace
name: prod-deployment
version: v1
Эта простая политика принимает prod-deployment
пространство имен и все ресурсы, содержащиеся в нем, и развертывает его во всех кластерах-членах в флоте с заданной environment
меткой. Если все кластеры нужны, можно полностью удалить affinity
термин.
PickFixed
Политика размещения
Если вы хотите развернуть рабочую нагрузку в известном наборе кластеров-членов, можно использовать PickFixed
политику размещения для выбора кластеров по имени.
В следующем примере показано, как развернуть test-deployment
пространство имен в кластерах-членах cluster1
и cluster2
:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp-2
spec:
policy:
placementType: PickFixed
clusterNames:
- cluster1
- cluster2
resourceSelectors:
- group: ""
kind: Namespace
name: test-deployment
version: v1
PickN
Политика размещения
Политика PickN
размещения является наиболее гибким вариантом и позволяет размещать ресурсы в настраиваемом количестве кластеров на основе ограничений сходства и топологии.
PickN
сходствами
Использование сопоставлений PickN
с функциями политики размещения аналогично использованию сходства с планированием pod. Можно задать как обязательные, так и предпочитаемые сходства. Обязательные сходства предотвращают размещение кластеров, которые не соответствуют им указанным сходствам, и предпочтительный сходства позволяют упорядочивать набор допустимых кластеров при принятии решения о размещении.
В следующем примере показано, как развернуть рабочую нагрузку в трех кластерах. Только кластеры с critical-allowed: "true"
меткой являются допустимыми целевыми объектами размещения, а предпочтения предоставляются кластерам с меткой critical-level: 1
:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp
spec:
resourceSelectors:
- ...
policy:
placementType: PickN
numberOfClusters: 3
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
weight: 20
preference:
- labelSelector:
matchLabels:
critical-level: 1
requiredDuringSchedulingIgnoredDuringExecution:
clusterSelectorTerms:
- labelSelector:
matchLabels:
critical-allowed: "true"
PickN
с ограничениями распространения топологии
Ограничения распространения топологии можно использовать для принудительного разделения размещения кластера по границам топологии, чтобы удовлетворить требования к доступности, например разделение размещения между регионами или кольцами обновления. Можно также настроить ограничения распространения топологии, чтобы предотвратить планирование, если ограничение не удается выполнить (whenUnsatisfiable: DoNotSchedule
) или запланировать максимально возможное (whenUnsatisfiable: ScheduleAnyway
).
В следующем примере показано, как распределить заданный набор ресурсов между несколькими регионами и попытаться запланировать кластеры членов с разными днями обновления:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp
spec:
resourceSelectors:
- ...
policy:
placementType: PickN
topologySpreadConstraints:
- maxSkew: 2
topologyKey: region
whenUnsatisfiable: DoNotSchedule
- maxSkew: 2
topologyKey: updateDay
whenUnsatisfiable: ScheduleAnyway
Дополнительные сведения см. в документации по расширенным ограничениям топологии По флоту.
Стратегия обновления
Флот использует стратегию последовательного обновления для управления развертыванием обновлений в нескольких размещениях кластера.
В следующем примере показано, как настроить стратегию последовательного обновления с помощью параметров по умолчанию:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp
spec:
resourceSelectors:
- ...
policy:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
unavailablePeriodSeconds: 60
Планировщик развертывает обновления для каждого кластера последовательно, ожидая по крайней мере unavailablePeriodSeconds
между кластерами. Состояние развертывания считается успешным, если все ресурсы были правильно применены к кластеру. Проверка состояния развертывания не каскадно выполняется для дочерних ресурсов, например не подтверждает, что модули pod, созданные развертыванием, становятся готовыми.
Дополнительные сведения см. в документации по стратегии развертывания upstream Fleet.
Состояние размещения
Планировщик флота обновляет сведения и состояние о принятии ClusterResourcePlacement
решений о размещении на объекте. Эти сведения можно просмотреть с помощью kubectl describe crp <name>
команды. Выходные данные содержат следующие сведения:
- Условия, которые в настоящее время применяются к размещению, в том числе, если размещение было успешно завершено.
- Раздел состояния размещения для каждого кластера-члена, который показывает состояние развертывания в этом кластере.
В следующем примере показано ClusterResourcePlacement
, что развертывание test
пространства имен и test-1
ConfigMap в двух кластерах-членах используется PickN
. Размещение было успешно завершено, а ресурсы были помещены в aks-member-1
кластеры и aks-member-2
кластеры.
Name: crp-1
Namespace:
Labels: <none>
Annotations: <none>
API Version: placement.kubernetes-fleet.io/v1beta1
Kind: ClusterResourcePlacement
Metadata:
...
Spec:
Policy:
Number Of Clusters: 2
Placement Type: PickN
Resource Selectors:
Group:
Kind: Namespace
Name: test
Version: v1
Revision History Limit: 10
Status:
Conditions:
Last Transition Time: 2023-11-10T08:14:52Z
Message: found all the clusters needed as specified by the scheduling policy
Observed Generation: 5
Reason: SchedulingPolicyFulfilled
Status: True
Type: ClusterResourcePlacementScheduled
Last Transition Time: 2023-11-10T08:23:43Z
Message: All 2 cluster(s) are synchronized to the latest resources on the hub cluster
Observed Generation: 5
Reason: SynchronizeSucceeded
Status: True
Type: ClusterResourcePlacementSynchronized
Last Transition Time: 2023-11-10T08:23:43Z
Message: Successfully applied resources to 2 member clusters
Observed Generation: 5
Reason: ApplySucceeded
Status: True
Type: ClusterResourcePlacementApplied
Placement Statuses:
Cluster Name: aks-member-1
Conditions:
Last Transition Time: 2023-11-10T08:14:52Z
Message: Successfully scheduled resources for placement in aks-member-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
Observed Generation: 5
Reason: ScheduleSucceeded
Status: True
Type: ResourceScheduled
Last Transition Time: 2023-11-10T08:23:43Z
Message: Successfully Synchronized work(s) for placement
Observed Generation: 5
Reason: WorkSynchronizeSucceeded
Status: True
Type: WorkSynchronized
Last Transition Time: 2023-11-10T08:23:43Z
Message: Successfully applied resources
Observed Generation: 5
Reason: ApplySucceeded
Status: True
Type: ResourceApplied
Cluster Name: aks-member-2
Conditions:
Last Transition Time: 2023-11-10T08:14:52Z
Message: Successfully scheduled resources for placement in aks-member-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
Observed Generation: 5
Reason: ScheduleSucceeded
Status: True
Type: ResourceScheduled
Last Transition Time: 2023-11-10T08:23:43Z
Message: Successfully Synchronized work(s) for placement
Observed Generation: 5
Reason: WorkSynchronizeSucceeded
Status: True
Type: WorkSynchronized
Last Transition Time: 2023-11-10T08:23:43Z
Message: Successfully applied resources
Observed Generation: 5
Reason: ApplySucceeded
Status: True
Type: ResourceApplied
Selected Resources:
Kind: Namespace
Name: test
Version: v1
Kind: ConfigMap
Name: test-1
Namespace: test
Version: v1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal PlacementScheduleSuccess 12m (x5 over 3d22h) cluster-resource-placement-controller Successfully scheduled the placement
Normal PlacementSyncSuccess 3m28s (x7 over 3d22h) cluster-resource-placement-controller Successfully synchronized the placement
Normal PlacementRolloutCompleted 3m28s (x7 over 3d22h) cluster-resource-placement-controller Resources have been applied to the selected clusters
Изменения размещения
Планировщик флота определяет стабильность существующих размещения рабочих нагрузок. Эта приоритетность может ограничить количество изменений, из-за которых рабочая нагрузка будет удалена и перепланирована. Следующие сценарии могут активировать изменения размещения:
- Изменения политики размещения в объекте
ClusterResourcePlacement
могут активировать удаление и изменение планирования рабочей нагрузки.- Операции горизонтального масштабирования (увеличивающееся
numberOfClusters
без других изменений) размещают рабочие нагрузки только в новых кластерах и не влияют на существующие размещения.
- Операции горизонтального масштабирования (увеличивающееся
- Изменения кластера, в том числе:
- Новый кластер, который становится допустимым, может активировать размещение, если он соответствует политике размещения, например, политике
PickAll
. - Кластер с размещением удаляется из парка, попытается заменить все затронутые рабочие нагрузки, не затрагивая их другие размещения.
- Новый кластер, который становится допустимым, может активировать размещение, если он соответствует политике размещения, например, политике
Изменения только для ресурсов (обновление ресурсов или обновление ResourceSelector
в объекте ClusterResourcePlacement
) постепенно развертывается в существующих размещениях, но не активируют перепланирование рабочей нагрузки.
Допуски
ClusterResourcePlacement
объекты поддерживают спецификацию толерации, которые применяются к объекту ClusterResourcePlacement
. Каждый объект терпимости состоит из следующих полей:
key
: ключ терпимости.value
: значение толерации.effect
: эффект толерации, напримерNoSchedule
.operator
: оператор толерации, напримерExists
илиEqual
.
Каждая терпимость используется для того, чтобы терпеть один или несколько конкретных запятых, примененных к .ClusterResourcePlacement
После того как все ограничения на наличие ограничений MemberCluster
допускаются, планировщик может затем распространять ресурсы в кластер. Невозможно обновить или удалить терпимые данные из ClusterResourcePlacement
объекта после его создания.
Дополнительные сведения см . в документации по вышестоящему флоту.
Доступ к API Kubernetes кластера ресурсов Fleet
Если вы создали ресурс Azure Kubernetes Fleet Manager с включенным кластером концентратора, его можно использовать для централизованного управления сценариями распространения объектов Kubernetes. Чтобы получить доступ к API Kubernetes кластера ресурсов Fleet, выполните действия, описанные в статье "Доступ к API Kubernetes кластера ресурсов флота" с помощью диспетчера флота Azure Kubernetes.
Следующие шаги
Настройте распространение ресурсов Kubernetes из концентратора в кластеры-члены.
Azure Kubernetes Service