Упражнение. Создание HorizontalPodAutoscaler
Упражнение. Масштабирование приложения
Создание кластера AKS
Прежде чем начать масштабирование приложения, необходимо создать кластер AKS с необходимыми ресурсами.
Войдите в Azure Cloud Shell с учетной записью, в которую вы хотите развернуть ресурсы, и выберите Bash в качестве запущенной оболочки.
Создайте группу ресурсов с помощью
az group create
команды. В следующем примере создается группа ресурсов с именемmyResourceGroup
в расположенииeastus
:az group create --name myResourceGroup --location eastus
Создайте кластер 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
Выполнение команды занимает несколько минут.
Получите учетные данные для кластера с помощью
az aks get-credentials
команды.az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Убедитесь, что кластер запущен и к нему можно подключиться с помощью
kubectl get nodes
команды.kubectl get nodes
Команда должна возвращать один узел с состоянием
Ready
.
Развертывание ресурсов приложения
Теперь, когда у вас есть кластер, вы можете развернуть приложение в нем.
Развертывание приложения
Создайте пространство имен приложения с помощью
kubectl create namespace
команды.kubectl create namespace hpa-contoso
Создайте файл с именем
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
Сохраните файл.
Разверните приложение в кластере
kubectl apply
с помощью команды.kubectl apply -f deployment.yml
Выходные данные должны выглядеть примерно так:
deployment.apps/contoso-website created
Создание зоны DNS и развертывание ресурса входящего трафика
Создайте зону Azure DNS с помощью
az network dns zone create
команды. В следующем примере создается зона DNS с именем contoso-website.com:az network dns zone create --resource-group myResourceGroup --name contoso-website.com
Получите идентификатор ресурса для зоны 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)
Обновите надстройку кластера маршрутизации приложений, чтобы включить интеграцию Azure DNS с помощью
az aks approuting zone
команды.az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${DNS_ZONE_ID} --attach-zones
Создайте файл с именем
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
Сохраните файл.
Разверните ресурс входящего трафика в кластер с помощью
kubectl apply
команды.kubectl apply -f ingress.yml
Выходные данные должны выглядеть примерно так:
ingress.networking.k8s.io/contoso-website created
Создание ресурса службы
Создайте файл с именем
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
Сохраните файл.
Разверните ресурс службы в кластере с помощью
kubectl apply
команды.kubectl apply -f service.yml
Выходные данные должны выглядеть примерно так:
service/contoso-website created
Создание горизонтального устройстваPodAutoscaler
Создайте файл с именем
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 масштабирует развертывание.Сохраните файл.
Создайте HPA с помощью
kubectl apply
команды.kubectl apply -f hpa.yml
Выходные данные должны выглядеть примерно так:
horizontalpodautoscaler.autoscaling/contoso-website created
Проверка результатов
Запросите метрики и использование 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 метрик для получения данных с сервера.