Упражнение. Создание HorizontalPodAutoscaler

Завершено

Упражнение. Масштабирование приложения

Создание кластера AKS

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

  1. Войдите в Azure Cloud Shell с учетной записью, в которую вы хотите развернуть ресурсы, и выберите Bash в качестве запущенной оболочки.

  2. Создайте группу ресурсов с помощью az group create команды. В следующем примере создается группа ресурсов с именем myResourceGroup в расположении eastus:

    az group create --name myResourceGroup --location eastus
    
  3. Создайте кластер AKS с помощью az aks create команды. В следующем примере создается кластер с именем myAKSCluster в myResourceGroup группе ресурсов. Кластер имеет один узел и использует размер виртуальной Standard_DS2_v2 машины.

    az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 1 --node-vm-size Standard_DS2_v2 --enable-app-routing --generate-ssh-keys
    

    Выполнение команды занимает несколько минут.

  4. Получите учетные данные для кластера с помощью az aks get-credentials команды.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  5. Убедитесь, что кластер запущен и к нему можно подключиться с помощью kubectl get nodes команды.

    kubectl get nodes
    

    Команда должна возвращать один узел с состоянием Ready.

Развертывание ресурсов приложения

Теперь, когда у вас есть кластер, вы можете развернуть приложение в нем.

Развертывание приложения

  1. Создайте пространство имен приложения с помощью kubectl create namespace команды.

    kubectl create namespace hpa-contoso
    
  2. Создайте файл с именем deployment.yml в редакторе Cloud Shell и вставьте в него следующий код YAML:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: contoso-website
      namespace: hpa-contoso
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: contoso-website
      template:
        metadata:
          labels:
            app: contoso-website
        spec:
          containers:
            - name: contoso-website
              image: mcr.microsoft.com/mslearn/samples/contoso-website
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 250m
                  memory: 256Mi
              ports:
                - containerPort: 80
    
  3. Сохраните файл.

  4. Разверните приложение в кластере kubectl apply с помощью команды.

    kubectl apply -f deployment.yml
    

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

    deployment.apps/contoso-website created
    

Создание зоны DNS и развертывание ресурса входящего трафика

  1. Создайте зону Azure DNS с помощью az network dns zone create команды. В следующем примере создается зона DNS с именем contoso-website.com:

    az network dns zone create --resource-group myResourceGroup --name contoso-website.com
    
  2. Получите идентификатор ресурса для зоны DNS с помощью az network dns zone show команды и сохраните выходные данные в переменную с именем DNS_ZONE_ID.

    DNS_ZONE_ID=$(az network dns zone show --resource-group myResourceGroup --name contoso-website.com --query id --output tsv)
    
  3. Обновите надстройку кластера маршрутизации приложений, чтобы включить интеграцию Azure DNS с помощью az aks approuting zone команды.

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${DNS_ZONE_ID} --attach-zones
    
  4. Создайте файл с именем ingress.yml в редакторе Cloud Shell и вставьте в него следующий код YAML. Обязательно замените <dns-zone-name> заполнитель именем зоны DNS.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: contoso-website
      namespace: hpa-contoso
      annotations:
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <dns-zone-name>
        http:
          paths:
          - backend:
              service:
                name: contoso-website
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  5. Сохраните файл.

  6. Разверните ресурс входящего трафика в кластер с помощью kubectl apply команды.

    kubectl apply -f ingress.yml
    

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

    ingress.networking.k8s.io/contoso-website created
    

Создание ресурса службы

  1. Создайте файл с именем service.yml в редакторе Cloud Shell и вставьте в него следующий код YAML:

    apiVersion: v1
    kind: Service
    metadata:
      name: contoso-website
      namespace: hpa-contoso
    spec:
      type: ClusterIP
      ports:
        - port: 80
          targetPort: 80
      selector:
        app: contoso-website
    
  2. Сохраните файл.

  3. Разверните ресурс службы в кластере с помощью kubectl apply команды.

    kubectl apply -f service.yml
    

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

    service/contoso-website created
    

Создание горизонтального устройстваPodAutoscaler

  1. Создайте файл с именем hpa.yml в редакторе Cloud Shell и вставьте в него следующий код YAML:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: contoso-website
      namespace: hpa-contoso
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: contoso-website
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 20
        - type: Resource
          resource:
            name: memory
            target:
              type: Utilization
              averageUtilization: 50
    

    Важно учитывать, что ключи scaleTargetRef должны совпадать с созданным ресурсом развертывания. В вашем случае созданное развертывание имеет apiVersion как apps/v1 и вызывается contoso-website. Эта hpA настроена для запроса собственной метрики ЦП. Если эта метрика превышает среднее значение 20 % в течение указанного времени, она масштабирует развертывание в единице. Алгоритм, используемый для вычисления этой метрики, основан на этом математическом уравнении:

    desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
    

    maxReplicas Ключи minReplicas определяют минимальное и максимальное количество реплика может иметь развертывание. Ключ metrics определяет метрики запросов HPA для масштабирования развертывания. В этом случае HPA запрашивает метрики ЦП и памяти. Если метрика ЦП превышает 20 %, или метрика памяти превышает 50%, hpA масштабирует развертывание.

  2. Сохраните файл.

  3. Создайте HPA с помощью kubectl apply команды.

    kubectl apply -f hpa.yml
    

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

    horizontalpodautoscaler.autoscaling/contoso-website created
    

Проверка результатов

  1. Запросите метрики и использование HPA с помощью kubectl get hpa команды.

    kubectl get hpa --namespace hpa-contoso
    

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

    NAME              REFERENCE                    TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
    contoso-website   Deployment/contoso-website   0%/20%, 0%/50%   1         10        1          83s
    

    Обратите внимание на TARGETS столбец. В нем показано текущее использование метрик, определенных в HPA. В этом случае загрузка ЦП составляет 0%, а использование памяти — 0%. Это связано с тем, что приложение не получает никакого трафика.

    Примечание.

    Возможно, ресурс HPA покажет метрики unknown в течение первых нескольких секунд, так как он пытается связаться с API метрик для получения данных с сервера.