Esercizio - Creare la risorsa HorizontalPodAutoscaler

Completato

Lo script init ha già creato tutte le risorse dell'applicazione. Ora spetta all'utente definire le regole di scalabilità che determineranno l'aumento o la riduzione del numero di istanze.

Creare una risorsa HPA

Per avviare il processo di scalabilità, sarà necessario creare una risorsa HorizontalPodAutoscaler nel cluster, che farà riferimento alla distribuzione del sito Web.

Nota

Se la versione del cluster del servizio Azure Kubernetes è precedente alla 1.10, il server delle metriche richiesto non sarà installato per impostazione predefinita. Le risorse HPA possono funzionare solo con un'installazione valida del server delle metriche. È possibile installare il server delle metriche nel cluster scaricando la versione più recente del file components.yaml.

Installazione di esempio:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Come per tutte le risorse di Kubernetes, è possibile creare una nuova HPA scrivendo un file YAML denominato hpa.yaml.

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: contoso-website

Ora è necessario definire la destinazione da ridimensionare. Poiché si sta ridimensionando il sito Web di distribuzione, si definirà una chiave scaleTargetRef che fa riferimento a tale risorsa:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: contoso-website
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: contoso-website

È importante sottolineare che le chiavi scaleTargetRef devono essere uguali a quelle della risorsa di distribuzione creata. In questo caso, la distribuzione creata ha apiVersion come apps/v1 e viene chiamata contoso-website.

A questo punto è possibile definire le metriche di cui questa HPA sarà in ascolto e il numero di repliche che si vuole ottenere. A tale scopo, verrà definita una nuova chiave:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: contoso-website
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

Questa HPA è configurata per eseguire una query sulla metrica della CPU nativa. Se questa metrica supera la media del 20% per un periodo di tempo specificato, alla distribuzione verrà aggiunta un'unità.

L'algoritmo usato per calcolare questa metrica si basa su questa equazione matematica:

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

Poiché l'applicazione è un sito Web, è consigliabile monitorare l'utilizzo della memoria della distribuzione. Per calcolare queste metriche, sarà necessario aggiungere un altro elemento alla matrice metrics:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: contoso-website
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

Creare la risorsa HPA eseguendo kubectl apply -f hpa.yaml nella stessa directory del file creato.

Controllare i risultati

Ora che la risorsa HPA è stata creata, è possibile eseguire una query sulle metriche e sull'utilizzo ottenendo la risorsa HPA stessa con kubectl get hpa contoso-website.

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

Nota

È possibile che la risorsa HPA visualizzi le metriche come unknown per alcuni secondi mentre prova a raggiungere l'API Metriche per recuperarle dal server.

Se si genera traffico Web sufficiente, si noterà che la scalabilità viene applicata quando una delle metriche definite supera la soglia stabilita.

Ad esempio, generare il traffico usando uno strumento denominato hey. Si eseguirà il comando hey -n 100000 -c 100 -m GET <your ingress URL> per controllare la scalabilità. Questo strumento genererà 100.000 richieste da 100 client diversi. Se si monitora la risorsa HPA con kubectl get hpa contoso-website -w e si fa lo stesso con la distribuzione tramite kubectl get deploy contoso-website -w, si noterà la fluttuazione nell'utilizzo della CPU:

NAME              REFERENCE                    TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
contoso-website   Deployment/contoso-website   5%/50%, 1%/20%   1         10        1          4m4s
contoso-website   Deployment/contoso-website   5%/50%, 31%/20%  1         10        1          4m36s
contoso-website   Deployment/contoso-website   5%/50%, 31%/20%  1         10        2          4m51s
contoso-website   Deployment/contoso-website   3%/50%, 19%/20%  1         10        2          5m37s

Si noti la colonna REPLICAS. Eseguire quindi una query sulla distribuzione per controllare la risorsa dimensionata:

NAME              READY   UP-TO-DATE   AVAILABLE   AGE
contoso-website   2/2     2            2           5m40s