ПР. Автомасштабирование в Yandex Managed Kubernetes

Кратко:

  • Создание манифеста load-balancer-hpa.yaml для горизонтального автомасштабирования в Kubernetes.
  • Использование меток (labels) для контейнеров с меткой "nginx-hpa".
  • Изменение образа контейнера с Yandex Container Registry на k8s.gcr.io/hpa-example для создания высокой нагрузки на процессор.
  • Добавление настроек ресурсов (requests и limits) для контейнера nginx-hpa.
  • Создание манифеста Horizontal Pod Autoscaler с настройками minReplicas, maxReplicas и targetCPUUtilizationPercentage.
  • Применение манифеста и ожидание запуска компонентов.
  • Создание рабочей нагрузки с помощью утилиты wget.
  • Наблюдение за увеличением числа подов и узлов в кластере.

Практическая работа. Автомасштабирование в Yandex Managed Kubernetes

В этой работе вы увидите, как в Kubernetes® выполняется горизонтальное автомасштабирование.
  1. Создайте манифест load-balancer-hpa.yaml.
    Для начала скопируйте в него настройки спецификаций, которые вы составляли на предыдущих уроках: из my-nginx.yaml (в примере ниже это раздел Deployment) и из load-balancer.yaml (раздел Service).
    Поскольку новый балансировщик должен отслеживать отдельную группу контейнеров, используйте для контейнеров другие метки (labels), например nginx-hpa.
    ---
    ### Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-loadbalancer-hpa
      labels:
        app: nginx-hpa
    spec:
      replicas: 1
      selector:
        matchLabels:
               app: nginx-hpa
      template:
        metadata:
             name: nginx-hpa
             labels:
                  app: nginx-hpa
        spec:
             containers:
                 - name: nginx-hpa
                   image: cr.yandex/<registry ID>/ubuntu-nginx:latest
     
     
    ---
    ### Service
    apiVersion: v1
    kind: Service
    metadata:
      name: my-loadbalancer-hpa
    spec:
      selector:
         app: nginx-hpa
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
 
  1. В разделе Deployment смените образ с Yandex Container Registry на k8s.gcr.io/hpa-example — это специальный тестовый образ из публичного репозитория, создающий высокую нагрузку на процессор. Так вам будет удобно отслеживать работу Horizontal Pod Autoscaler.
           ...
           spec:
              containers:
                  - name: nginx-hpa
                  image: k8s.gcr.io/hpa-example 
 
  1. Теперь добавьте в шаблон контейнера настройки requests и limits: мы попросим по умолчанию 256 мебибайтов памяти и 500 милли-CPU (половину ядра), а ограничим контейнер 500 мебибайтами и 1 CPU.
        ...
        spec:
         containers:
           - name: nginx-hpa
             image: k8s.gcr.io/hpa-example
             resources:
               requests:
                 memory: "256Mi"
                 cpu: "500m"
               limits:
                 memory: "500Mi"
                 cpu: "1" 
 
  1. Дополните манифест настройками для Horizontal Pod Autoscaler:
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: my-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: my-nginx-deployment-hpa
      minReplicas: 1
      maxReplicas: 5
      targetCPUUtilizationPercentage: 20
 
 
  1. В результате должен получиться такой манифест:
    ---
    ### Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-nginx-deployment-hpa
      labels:
        app: nginx-hpa
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx-hpa
      template:
        metadata:
          name: nginx-hpa
          labels:
            app: nginx-hpa
        spec:
          containers:
            - name: nginx-hpa
              image: k8s.gcr.io/hpa-example
              resources:
                requests:
                  memory: "256Mi"
                  cpu: "500m"
                limits:
                  memory: "500Mi"
                  cpu: "1"
     
    ---
    ### Service
    apiVersion: v1
    kind: Service
    metadata:
      name: my-loadbalancer-hpa
    spec:
      selector:
        app: nginx-hpa
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
     
    ---
    ### HPA
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: my-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: my-nginx-deployment-hpa
      minReplicas: 1
      maxReplicas: 5
      targetCPUUtilizationPercentage: 20
 
  1. Примените манифест:
    kubectl apply -f <путь_к_load-balancer-hpa.yaml>
 
Вы увидите три сообщения:
deployment.apps/my-nginx-deployment-hpa created
service/my-loadbalancer-hpa created
horizontalpodautoscaler.autoscaling/my-hpa created
  1. В консоли управления перейдите в раздел Network Load Balancer. Дождитесь, пока статус my-nginx-deployment-hpa станет Running, после чего посмотрите IP-адрес балансировщика. Убедитесь, что в браузере этот адрес доступен. В терминале сохраните IP-адрес в переменную. Например, так:
    LOAD_BALANCER_IP=<IP-адрес балансировщика>
 
  1. Запустите в отдельном окне отслеживание интересующих вас компонентов кластера Kubernetes:
    while true; do kubectl get pod,svc,hpa,nodes -o wide; sleep 5; done
 
  1. Теперь сымитируйте рабочую нагрузку на приложение. Для этого подойдёт утилита wget (установите её с помощью пакетного менеджера или с сайта).
    while true; do wget -q -O- http://$LOAD_BALANCER_IP; done
 
Вы увидите, что сначала увеличится число подов, а затем добавятся узлы. Число узлов ограничено настройками группы узлов кластера, которые вы задали при создании кластера (в нашем случае максимальное количество узлов — пять).
  1. Остановите цикл создания нагрузки на приложение (комбинация клавиш Ctrl + C). В окне консоли с отслеживанием компонентов кластера вы увидите, как удаляются узлы и поды без нагрузки.