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


Использование автомасштабирования вертикального модуля Pod в Служба Azure Kubernetes (AKS)

В этой статье показано, как использовать вертикальный модуль автомасштабирования Pod (VPA) в кластере Служба Azure Kubernetes (AKS). VPA автоматически настраивает запросы ЦП и памяти для модулей pod в соответствии с шаблонами использования рабочих нагрузок. Эта функция помогает оптимизировать производительность приложений и сократить затраты на выполнение рабочих нагрузок в AKS.

Дополнительные сведения см. в обзоре автомасштабирования вертикального модуля Pod.

Подготовка к работе

  • Если у вас есть существующий кластер AKS, убедитесь, что он работает под управлением Kubernetes версии 1.24 или более поздней.

  • Вам потребуется azure CLI версии 2.52.0 или более поздней версии. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

  • Если включить VPA в существующем кластере, убедитесь, что kubectl установлен и настроен для подключения к кластеру az aks get-credentials AKS с помощью команды.

    az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
    

Развертывание автомасштабирования вертикального модуля Pod в новом кластере

  • Создайте новый кластер AKS с включенным VPA с помощью az aks create команды с флагом --enable-vpa .

    az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

Обновление существующего кластера для использования автомасштабирования вертикального модуля Pod

  • Обновите существующий кластер, чтобы использовать VPA с помощью az aks update команды с флагом --enable-vpa .

    az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa 
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

Отключение автоматического масштабирования вертикального модуля Pod в существующем кластере

  • Отключите VPA в существующем кластере az aks update с помощью команды с флагом --disable-vpa .

    az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

Проверка установки автомасштабирования pod по вертикали pod

В следующем примере мы создадим развертывание с двумя модулями pod, каждый из которых выполняет один контейнер, который запрашивает 100 милликоров и пытается использовать чуть выше 500 милликоров. Мы также создадим конфигурацию VPA, указывающую на развертывание. VPA наблюдает поведение модулей pod, а через пять минут обновляет модули pod, чтобы запросить 500 милликоров.

  1. Создайте файл с именем hamster.yaml и скопируйте в следующем манифесте примера вертикального автомасштабирования Pod из репозитория kubernetes/autoscaler GitHub:

    apiVersion: "autoscaling.k8s.io/v1"
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: hamster
      resourcePolicy:
        containerPolicies:
          - containerName: '*'
            minAllowed:
              cpu: 100m
              memory: 50Mi
            maxAllowed:
              cpu: 1
              memory: 500Mi
            controlledResources: ["cpu", "memory"]
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hamster
    spec:
      selector:
        matchLabels:
          app: hamster
      replicas: 2
      template:
        metadata:
          labels:
            app: hamster
        spec:
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534
          containers:
            - name: hamster
              image: registry.k8s.io/ubuntu-slim:0.1
              resources:
                requests:
                  cpu: 100m
                  memory: 50Mi
              command: ["/bin/sh"]
              args:
                - "-c"
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
    
  2. Разверните пример автомасштабирования вертикального hamster.yaml модуля Pod с помощью kubectl apply команды.

    kubectl apply -f hamster.yaml
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

  3. Просмотрите выполняемые модули pod с помощью kubectl get команды.

    kubectl get pods -l app=hamster
    

    Выходные данные должны выглядеть примерно так:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. Просмотрите резервирования ЦП и памяти в одном из модулей pod с помощью kubectl describe команды. Убедитесь, что вы замените <example-pod> один из идентификаторов pod, возвращенных в выходных данных предыдущего шага.

    kubectl describe pod hamster-<example-pod>
    

    Выходные данные должны выглядеть примерно так:

     hamster:
        Container ID:  containerd://
        Image:         k8s.gcr.io/ubuntu-slim:0.1
        Image ID:      sha256:
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/sh
        Args:
          -c
          while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        State:          Running
          Started:      Wed, 28 Sep 2022 15:06:14 -0400
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        100m
          memory:     50Mi
        Environment:  <none>
    

    Модуль pod имеет 100 миллипу и 50 Мибибайт памяти, зарезервированных в этом примере. Для этого примера приложения модуль pod должен выполняться менее 100 миллипусов, поэтому емкость ЦП недоступна. Модули pod также резервирует меньше памяти, чем требуется. Развертывание вертикального модуля Pod Autoscaler vpa-recommender анализирует модули pod, в которых размещено приложение хомячки, чтобы узнать, соответствуют ли требования к ЦП и памяти. Если необходимы корректировки, vpa-updater повторно запускает модули pod с обновленными значениями.

  5. Отслеживайте модули pod с помощью kubectl get команды.

    kubectl get --watch pods -l app=hamster
    
  6. При запуске нового модуля pod хомяков можно просмотреть обновленные резервирования ЦП и памяти с помощью kubectl describe команды. Убедитесь, что вы замените <example-pod> один из идентификаторов pod, возвращенных в выходных данных предыдущего шага.

    kubectl describe pod hamster-<example-pod>
    

    Выходные данные должны выглядеть примерно так:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    В предыдущих выходных данных видно, что резервирование ЦП увеличилось до 587 миллипу, что превышает пять раз исходное значение. Память увеличилась до 262 144 Килобайт, что составляет около 250 Мибибайтов или пять раз исходного значения. Этот модуль pod был недостаточно ресурсоемким, и вертикальный модуль автомасштабирования pod исправил оценку с гораздо более подходящим значением.

  7. Просмотрите обновленные рекомендации из VPA с помощью kubectl describe команды, чтобы описать сведения о ресурсе хомяк-vpa.

    kubectl describe vpa/hamster-vpa
    

    Выходные данные должны выглядеть примерно так:

     State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

Настройка запросов автомасштабирования pod по вертикали

Объект VerticalPodAutoscaler автоматически задает запросы ресурсов на pod с помощью объекта updateMode Auto. Можно задать другое значение в зависимости от требований и тестирования. В этом примере мы создадим и тестируем манифест развертывания с двумя модулями pod, каждый из которых выполняет контейнер, который запрашивает 100 миллиСП и 50 МиБ памяти и задает значение updateMode Recreate.

  1. Создайте файл с именем azure-autodeploy.yaml и скопируйте его в следующем манифесте:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: vpa-auto-deployment
      template:
        metadata:
          labels:
            app: vpa-auto-deployment
        spec:
          containers:
          - name: mycontainer
            image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    
  2. Создайте pod с помощью kubectl create команды.

    kubectl create -f azure-autodeploy.yaml
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

  3. Просмотрите выполняемые модули pod с помощью kubectl get команды.

    kubectl get pods
    

    Выходные данные должны выглядеть примерно так:

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-kchc5   1/1     Running   0          52s
    vpa-auto-deployment-54465fb978-nhtmj   1/1     Running   0          52s
    
  4. Создайте файл с именем azure-vpa-auto.yaml и скопируйте его в следующем манифесте:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-auto
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       vpa-auto-deployment
      updatePolicy:
        updateMode: "Recreate"
    

    Значение targetRef.name указывает, что любой модуль, управляемый именем vpa-auto-deployment развертывания, принадлежит VerticalPodAutoscaler. Значение updateMode Recreate означает, что контроллер автомасштабирования вертикального модуля pod может удалить модуль pod, настроить запросы ЦП и памяти, а затем создать новый модуль pod.

  5. Примените манифест к кластеру kubectl apply с помощью команды.

    kubectl create -f azure-vpa-auto.yaml
    
  6. Подождите несколько минут, а затем просмотрите выполняемые модули pod с помощью kubectl get команды.

    kubectl get pods
    

    Выходные данные должны выглядеть примерно так:

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-qbhc4   1/1     Running   0          2m49s
    vpa-auto-deployment-54465fb978-vbj68   1/1     Running   0          109s
    
  7. Получите подробные сведения об одном из запущенных модулей pod с помощью kubectl get команды. Убедитесь, что вы замените <pod-name> имя одного из модулей pod из предыдущих выходных данных.

    kubectl get pod <pod-name> --output yaml
    

    Выходные данные должны выглядеть примерно так, как показано, что контроллер VPA увеличил запрос памяти до 262144k и ЦП-запрос на 25 миллиCPU:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaObservedContainers: mycontainer
        vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory
          request'
      creationTimestamp: "2022-09-29T16:44:37Z"
      generateName: vpa-auto-deployment-54465fb978-
      labels:
        app: vpa-auto-deployment
    
    spec:
      containers:
      - args:
        - -c
        - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        command:
        - /bin/sh
        image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        imagePullPolicy: IfNotPresent
        name: mycontainer
        resources:
          requests:
            cpu: 25m
            memory: 262144k
    
  8. Получите подробные сведения о вертикальном автомасштабировании pod и ее рекомендациях по ЦП и памяти с помощью kubectl get команды.

    kubectl get vpa vpa-auto --output yaml
    

    Выходные данные должны выглядеть примерно так:

     recommendation:
      containerRecommendations:
      - containerName: mycontainer
        lowerBound:
          cpu: 25m
          memory: 262144k
        target:
          cpu: 25m
          memory: 262144k
        uncappedTarget:
          cpu: 25m
          memory: 262144k
        upperBound:
          cpu: 230m
          memory: 262144k
    

    В этом примере результаты в атрибуте target указывают, что для оптимального выполнения контейнера не требуется изменять ЦП или целевой объект памяти. Однако результаты могут отличаться в зависимости от использования приложения и его ресурсов.

    Средство автомасштабирования вертикального модуля pod использует lowerBound и upperBound атрибуты, чтобы решить, следует ли удалить модуль pod и заменить его новым модулем pod. Если модуль pod запрашивает меньше нижней или больше верхней границы, средство автомасштабирования вертикального модуля pod удаляет модуль pod и заменяет его на pod, соответствующий целевому атрибуту.

Дополнительный рекомендуемый параметр для автомасштабирования вертикального модуля Pod

Средство рекомендаций предоставляет рекомендации по использованию ресурсов на основе использования ресурсов в режиме реального времени. AKS развертывает средство рекомендаций при включении VPA кластера. Вы можете развернуть настроенный рекомендуемый или дополнительный рекомендуемый объект с тем же изображением, что и по умолчанию. Преимущество настраиваемого средства рекомендаций заключается в том, что вы можете настроить логику рекомендаций. С помощью дополнительного средства рекомендаций можно секционировать виртуальные платформы для использования различных рекомендаций.

В следующем примере мы создадим дополнительный средство рекомендаций, применим к существующему объекту AKS clust и настроим объект VPA для использования дополнительного средства рекомендаций.

  1. Создайте файл с именем extra_recommender.yaml и скопируйте его в следующем манифесте:

    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: extra-recommender 
      namespace: kube-system 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: extra-recommender 
      template: 
        metadata: 
          labels: 
            app: extra-recommender 
        spec: 
          serviceAccountName: vpa-recommender 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534
          containers: 
          - name: recommender 
            image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 
            imagePullPolicy: Always 
            args: 
              - --recommender-name=extra-recommender 
            resources: 
              limits: 
                cpu: 200m 
                memory: 1000Mi 
              requests: 
                cpu: 50m 
                memory: 500Mi 
            ports: 
            - name: prometheus 
              containerPort: 8942 
    
  2. Разверните пример автомасштабирования вертикального extra-recomender.yaml модуля Pod с помощью kubectl apply команды.

    kubectl apply -f extra-recommender.yaml 
    

    Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

  3. Создайте файл с именем hamster-extra-recommender.yaml и скопируйте его в следующем манифесте:

    apiVersion: "autoscaling.k8s.io/v1" 
    kind: VerticalPodAutoscaler 
    metadata: 
      name: hamster-vpa 
    spec: 
      recommenders:  
        - name: 'extra-recommender' 
      targetRef: 
        apiVersion: "apps/v1" 
        kind: Deployment 
        name: hamster 
      updatePolicy: 
        updateMode: "Auto" 
      resourcePolicy: 
        containerPolicies: 
          - containerName: '*' 
            minAllowed: 
              cpu: 100m 
              memory: 50Mi 
            maxAllowed: 
              cpu: 1 
              memory: 500Mi 
            controlledResources: ["cpu", "memory"] 
    --- 
    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: hamster 
    spec: 
      selector: 
        matchLabels: 
          app: hamster 
      replicas: 2 
      template: 
        metadata: 
          labels: 
            app: hamster 
        spec: 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534 # nobody 
          containers: 
            - name: hamster 
              image: k8s.gcr.io/ubuntu-slim:0.1 
              resources: 
                requests: 
                  cpu: 100m 
                  memory: 50Mi 
              command: ["/bin/sh"] 
              args: 
                - "-c" 
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done" 
    

    Если memory этот параметр не указан, controlledResourcesсредство рекомендаций не отвечает на события OOM. В этом примере мы устанавливаем только ЦП.controlledValues controlledValues позволяет выбрать, следует ли обновлять запросы ресурсов контейнера с помощью параметра или какRequestsOnly по запросам ресурсов, так и по ограничениям, используя этот RequestsAndLimits параметр. Значение по умолчанию — RequestsAndLimits. Если вы используете RequestsAndLimits этот параметр, запросы вычисляются на основе фактического использования, а ограничения вычисляются на основе текущего запроса и соотношения ограничений pod.

    Например, если начать с модуля pod, который запрашивает 2 ЦП и ограничивает 4 ЦП, VPA всегда задает ограничение в два раза больше, чем запросы. Тот же принцип применяется к памяти. При использовании RequestsAndLimits режима он может служить схемой для первоначальных запросов и ограничений ресурсов приложения.

    Вы можете упростить объект VPA с помощью Auto рекомендаций по режиму и вычислениям для ЦП и памяти.

  4. hamster-extra-recomender.yaml Разверните пример с помощью kubectl apply команды.

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. Отслеживайте модули pod с помощью [kubectl getкоманды ]kubectl-get .

    kubectl get --watch pods -l app=hamster
    
  6. При запуске нового модуля pod хомяков просмотрите обновленные резервирования ЦП и памяти с помощью kubectl describe команды. Убедитесь, что вы замените <example-pod> один из идентификаторов pod.

    kubectl describe pod hamster-<example-pod>
    

    Выходные данные должны выглядеть примерно так:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  7. Просмотр обновленных рекомендаций из VPA с помощью kubectl describe команды.

    kubectl describe vpa/hamster-vpa
    

    Выходные данные должны выглядеть примерно так:

    State:          Running
     Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    Spec:
      recommenders:
        Name: customized-recommender
    

Устранение неполадок с автомасштабированием вертикального модуля Pod

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

  1. Убедитесь, что все системные компоненты выполняются с помощью следующей команды:

    kubectl --namespace=kube-system get pods|grep vpa
    

    Выходные данные должны содержать три модуля pod: рекомендации, средство обновления и контроллер допуска, все с состоянием Running.

  2. Для каждого из модулей pod, возвращенных в предыдущих выходных данных, убедитесь, что системные компоненты регистрируют любые ошибки с помощью следующей команды:

    kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  3. Убедитесь, что определение настраиваемого ресурса было создано с помощью следующей команды:

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

Следующие шаги

Дополнительные сведения об объекте VPA см. в справочнике по API автомасштабирования вертикальных модулей Pod.