Поделиться через


Интеллектуальное размещение ресурсов 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

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

Подготовка рабочей нагрузки для размещения

Затем опубликуйте рабочую нагрузку в кластер концентратора, чтобы его можно было поместить в кластеры-члены:

  1. Создайте пространство имен для рабочей нагрузки в кластере концентратора:

    kubectl create namespace test-app 
    
  2. Пример рабочей нагрузки можно развернуть в новом пространстве имен в кластере концентратора. Так как эти типы ресурсов Kubernetes не требуют инкапсулирования, их можно развернуть без изменений.

    1. Сохраните следующий 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
      
    2. Разверните определение рабочей нагрузки в кластере концентратора:

      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 с открытым исходным кодом.