Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Разработчикам приложений часто требуется развернуть ресурсы Kubernetes в нескольких кластерах, расположенных в облачных и локальных средах. Операторы парка часто должны выбирать лучшие кластеры для рабочих нагрузок на основе эвристики (например, затрат на вычислительные ресурсы) или доступных ресурсов (таких как память и ЦП). Он мучен для создания, обновления и отслеживания этих ресурсов Kubernetes в нескольких кластерах вручную. В этой статье описывается, как устранить эти сценарии с помощью интеллектуальной возможности размещения ресурсов Kubernetes в Диспетчере флотов Azure Kubernetes.
Fleet Manager поддерживает интеллектуальное размещение для ресурсов с областью действия кластера (ClusterResourcePlacement) и пространства имен (ResourcePlacement). Возможность размещения ресурсов может принимать решения о планировании на основе следующих свойств кластера:
- Число узлов
- Стоимость вычислительных ресурсов и памяти в целевых кластерах-членах
- Доступность ресурсов (ЦП/памяти) в целевых кластерах-членах
Дополнительные сведения о понятиях, описанных в этой статье, см. в разделе размещение ресурсов в области кластера и размещение ресурсов в области пространства имен.
Необходимые компоненты
Вам потребуется учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
У вас должен быть диспетчер флота с кластером концентратора и одним или несколькими кластерами-членами. Если у вас нет одного, следуйте краткому руководству по созданию диспетчера флота с кластером концентратора. Затем присоедините поддерживаемые кластеры Kubernetes в качестве участников.
Совет
Убедитесь, что кластеры Kubernetes настроены таким образом, чтобы можно было протестировать размещение с помощью свойств кластера, интересующих вас (расположение, количество узлов, ресурсы или затраты).
Установите указанные ниже переменные среды.
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>Чтобы завершить эту статью, вам потребуется Azure CLI версии 2.58.0 или более поздней. Чтобы выполнить установку или обновление Azure CLI, ознакомьтесь с этой статьей.
Если у вас еще нет интерфейса командной строки Kubernetes (kubectl), его можно установить с помощью этой команды:
az aks install-cliВам потребуется
fleetрасширение Azure CLI. Установите его, выполнив следующую команду:az extension add --name fleetaz extension updateВыполните команду, чтобы обновить до последней версии расширения:az extension update --name fleetАвторизация kubectl для подключения к кластеру концентратора Fleet Manager:
az fleet get-credentials --resource-group $GROUP --name $FLEET
Проверка свойств кластера членов
Получение меток, свойств и ресурсов для кластера-члена путем запроса к кластеру концентратора. Выходные данные в виде YAML, чтобы вы могли прочитать результаты.
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
Полученный ФАЙЛ YAML содержит сведения (метки и свойства), которые можно использовать для создания политик размещения. Приведем пример:
apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
annotations:
...
labels:
fleet.azure.com/location: eastus2
fleet.azure.com/resource-group: resource-group
fleet.azure.com/subscription-id: aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
name: cluster01
resourceVersion: "123456"
uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
...
status:
...
properties:
kubernetes-fleet.io/node-count:
observationTime: "2024-09-19T01:33:54Z"
value: "2"
kubernetes.azure.com/per-cpu-core-cost:
observationTime: "2024-09-19T01:33:54Z"
value: "0.073"
kubernetes.azure.com/per-gb-memory-cost:
observationTime: "2024-09-19T01:33:54Z"
value: "0.022"
resourceUsage:
allocatable:
cpu: 3800m
memory: 10320392Ki
available:
cpu: 2740m
memory: 8821256Ki
capacity:
cpu: "4"
memory: 14195208Ki
Повторите этот шаг для каждого добавляемого кластера элементов, чтобы определить метки и свойства, которые можно использовать в политике.
Подготовка рабочей нагрузки для размещения
Затем опубликуйте рабочую нагрузку в кластер концентратора, чтобы его можно было поместить в кластеры-члены:
Создайте пространство имен для рабочей нагрузки в кластере концентратора:
kubectl create namespace test-appПример рабочей нагрузки можно развернуть в новом пространстве имен в кластере концентратора. Так как эти типы ресурсов Kubernetes не требуют инкапсулирования, их можно развернуть без изменений.
Сохраните следующий YAML в файл с именем
sample-workload.yaml:apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test-app spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test-app spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16.1 ports: - containerPort: 80Разверните определение рабочей нагрузки в кластере концентратора:
kubectl apply -f sample-workload.yaml
После развертывания определения рабочей нагрузки теперь можно протестировать интеллектуальную возможность размещения диспетчера флота.
Тестирование политик размещения рабочей нагрузки
Приведенные ниже примеры можно использовать в качестве руководства для написания собственных объектов размещения ресурсов. Дополнительные сведения см. в документации по размещению ресурсов в области кластера и документации по размещению ресурсов с областью пространства имен.
В каждом примере показаны варианты ClusterResourcePlacement (для ресурсов с областью кластера и целых пространств имен) и варианты ResourcePlacement (для определенных ресурсов с областью имен).
Примечание.
Чтобы попробовать каждую выборку политики, удалите предыдущую ClusterResourcePlacement или ResourcePlacement перед применением следующей.
Размещение на основе количества узлов кластера
В этом примере показан сортировщик свойств, использующий Descending порядок. Этот порядок означает, что диспетчер флота предпочитает кластеры с более высоким числом узлов.
Кластер с наибольшим числом узлов получает вес 20, а кластер с наименьшим числом получает вес 0. Другие кластеры получают пропорциональные весовые значения, вычисляемые с помощью формулы вычисления веса.
Пример размещения ресурсов кластера
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
Пример ResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-demo
namespace: test-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: nginx-deployment
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
Размещение с селектором меток и сортировщиком свойств
В этом примере кластер получает вес только в том случае, если он имеет метку env=prod. Если кластер удовлетворяет этому ограничению метки, Диспетчер флотилии присваивает ему пропорциональный вес на основе количества общего ЦП в этом кластере.
В этом примере показано, как использовать селектор меток и средство сортировки свойств для preferredDuringSchedulingIgnoredDuringExecution сопоставления. Кластер-член, который завершается сбоем селектора меток, не получает никакого веса. Кластеры членов, удовлетворяющие селектору меток, получают пропорциональные веса, как указано в сортировщике свойств.
Пример размещения ресурсов кластера
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
labelSelector:
matchLabels:
env: prod
propertySorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
Пример ResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-demo
namespace: test-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: nginx-deployment
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
labelSelector:
matchLabels:
env: prod
propertySorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
Размещение на основе ресурсов памяти и ядра ЦП
Так как в этом примере сортировщик имеет Ascending заказ, диспетчер флотов предпочитает кластеры с более низкими затратами на память и ядро ЦП. Кластер с наименьшей стоимостью памяти и ядра ЦП получает вес 20, а кластер с наибольшим количеством получает вес 0. Другие кластеры получают пропорциональные весовые значения, вычисляемые с помощью формулы вычисления веса.
Пример размещения ресурсов кластера
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 2
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-gb-memory-core-cost
sortOrder: Ascending
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-cpu-core-cost
sortOrder: Ascending
Пример ResourcePlacement
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-demo
namespace: test-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: nginx-deployment
version: v1
policy:
placementType: PickN
numberOfClusters: 2
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-gb-memory-core-cost
sortOrder: Ascending
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-cpu-core-cost
sortOrder: Ascending
Просмотр состояния размещения
Состояние размещения можно просмотреть с помощью портала Azure или команды kubectl.
Подробности о том, как ознакомиться с ходом размещения:
- Дополнительные сведения
ClusterResourcePlacementсм. в разделе "Использование API ClusterResourcePlacement для распространения ресурсов в кластеры-члены". - Чтобы узнать больше о
ResourcePlacement, см. Использование ResourcePlacement для размещения ресурсов с областью видимости пространства имен.
Очистка ресурсов
Чтобы удалить размещение ресурсов, выполните приведенные выше действия.
- Дополнительные сведения см. в
ClusterResourcePlacementразделе "Очистка ресурсов". - Дополнительные сведения см. в
ResourcePlacementразделе "Очистка ресурсов".
Дальнейшие шаги
- Размещение ресурсов на уровне кластера с помощью ClusterResourcePlacement
- Размещение ресурсов в пределах пространства имен с помощью ResourcePlacement
- Использование размещения ресурсов кластера для развертывания рабочих нагрузок в нескольких кластерах
- Использование размещения ресурсов в пределах пространства имен для развертывания рабочих нагрузок в нескольких кластерах
- Определение стратегии развертывания для размещения ресурсов