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


Интеллектуальное размещение ресурсов Kubernetes между кластерами с помощью Azure Kubernetes Fleet Manager

Разработчикам приложений часто требуется развернуть ресурсы 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 fleet
    

    az 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

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

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

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

  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
      

После развертывания определения рабочей нагрузки теперь можно протестировать интеллектуальную возможность размещения диспетчера флота.

Тестирование политик размещения рабочей нагрузки

Приведенные ниже примеры можно использовать в качестве руководства для написания собственных объектов размещения ресурсов. Дополнительные сведения см. в документации по размещению ресурсов в области кластера и документации по размещению ресурсов с областью пространства имен.

В каждом примере показаны варианты 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.

Подробности о том, как ознакомиться с ходом размещения:

Очистка ресурсов

Чтобы удалить размещение ресурсов, выполните приведенные выше действия.

Дальнейшие шаги