Интеллектуальное размещение ресурсов Kubernetes между кластерами с помощью Azure Kubernetes Fleet Manager
Разработчикам приложений часто требуется развернуть ресурсы Kubernetes в нескольких кластерах. Операторы парка часто должны выбирать лучшие кластеры для рабочих нагрузок на основе эвристики (например, затрат на вычислительные ресурсы) или доступных ресурсов (таких как память и ЦП). Он мучен для создания, обновления и отслеживания этих ресурсов Kubernetes в нескольких кластерах вручную. В этой статье описывается, как устранить эти сценарии с помощью интеллектуальной возможности размещения ресурсов Kubernetes в Диспетчере флотов Azure Kubernetes (Kubernetes Fleet).
Возможность размещения ресурсов Kubernetes Fleet может принимать решения о планировании на основе следующих свойств кластера:
- Число узлов
- Стоимость вычислительных ресурсов и памяти в целевых кластерах-членах
- Доступность ресурсов (ЦП/памяти) в целевых кластерах-членах
Дополнительные сведения о концепциях, описанных в этой статье, см. в статье о размещении ресурсов Kubernetes из концентратора в кластеры-члены.
Необходимые компоненты
Вам потребуется учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
У вас должен быть ресурс Kubernetes Fleet с одним или несколькими кластерами-членами. Если у вас нет одного, следуйте краткому руководству по созданию ресурса Kubernetes Fleet с кластером концентратора. Затем присоедините кластеры Служба Azure Kubernetes (AKS) в качестве членов.
Совет
Убедитесь, что кластеры членов AKS настроены таким образом, чтобы можно было протестировать размещение с помощью свойств кластера, интересующих вас (расположение, количество узлов, ресурсы или затраты).
Установите указанные ниже переменные среды.
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 fleet
az extension update
Выполните команду, чтобы обновить до последней версии расширения:az extension update --name fleet
Авторизуйте kubectl для подключения к кластеру концентратора Kubernetes Fleet:
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: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
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
После развертывания определения рабочей нагрузки теперь можно протестировать интеллектуальную возможность размещения Kubernetes Fleet.
Тестирование политик размещения рабочей нагрузки
Вы можете использовать следующие примеры вместе с концептуальной документацией в качестве руководства по написанию собственного ClusterResourcePlacement
объекта.
Примечание.
Если вы хотите попробовать каждую примерную политику, обязательно удалите предыдущий ClusterResourcePlacement
объект.
Размещение на основе количества узлов кластера
В этом примере показан сортировщик свойств, использующий Descending
порядок. Этот порядок означает, что Kubernetes Fleet предпочитает кластеры с более высоким числом узлов.
Кластер с наибольшим числом узлов получает вес 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:
metricSorter:
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
metricSorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
Размещение на основе ресурсов памяти и ядра ЦП
Так как в этом примере сортировщик имеет Ascending
порядок, Kubernetes Fleet предпочитает кластеры с более низкими затратами на память и ядро ЦП. Кластер с наименьшей стоимостью памяти и ядра ЦП получает вес 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
Просмотр состояния размещения
Если вы хотите просмотреть состояние размещения, можно использовать портал Azure или команду kubectl.
Дополнительные сведения о том, как просмотреть ход размещения в API ClusterResourcePlacement для распространения ресурсов в кластеры-члены.
Очистка ресурсов
Дополнительные сведения о том, как удалить размещение ресурсов кластера с помощью портал Azure или команды kubectl, см. в статье "Очистка ресурсов" в статье о распространении ресурсов.
Связанный контент
- Дополнительные сведения о распространении ресурсов см. в документации по Kubernetes с открытым исходным кодом.
Azure Kubernetes Service