Ćwiczenie — tworzenie narzędzia HorizontalPodAutoscaler

Ukończone

Ćwiczenie — skalowanie aplikacji

Tworzenie klastra AKS

Przed rozpoczęciem skalowania aplikacji należy utworzyć klaster usługi AKS z wymaganymi zasobami.

  1. Zaloguj się do usługi Azure Cloud Shell przy użyciu konta, w którym chcesz wdrożyć zasoby, i wybierz pozycję Bash jako działającą powłokę.

  2. Utwórz grupę zasobów przy użyciu az group create polecenia . Poniższy przykład obejmuje tworzenie grupy zasobów o nazwie myResourceGroup w lokalizacji eastus:

    az group create --name myResourceGroup --location eastus
    
  3. Utwórz klaster usługi AKS przy użyciu az aks create polecenia . Poniższy przykład tworzy klaster o nazwie myAKSCluster w myResourceGroup grupie zasobów. Klaster ma jeden węzeł i używa rozmiaru Standard_DS2_v2 maszyny wirtualnej.

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

    Wykonanie tego polecenia zajmie kilka minut.

  4. Pobierz poświadczenia dla klastra przy użyciu az aks get-credentials polecenia .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  5. Sprawdź, czy klaster jest uruchomiony i czy możesz nawiązać z nim połączenie przy użyciu kubectl get nodes polecenia .

    kubectl get nodes
    

    Polecenie powinno zwrócić jeden węzeł ze stanem Ready.

Wdrażanie zasobów aplikacji

Teraz, gdy masz klaster, możesz wdrożyć w niej aplikację.

Wdrażanie aplikacji

  1. Utwórz przestrzeń nazw aplikacji przy użyciu kubectl create namespace polecenia .

    kubectl create namespace hpa-contoso
    
  2. Utwórz nowy plik o nazwie deployment.yml w edytorze usługi Cloud Shell i wklej do niego następujący kod 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. Zapisz plik.

  4. Wdróż aplikację w klastrze przy użyciu kubectl apply polecenia .

    kubectl apply -f deployment.yml
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    deployment.apps/contoso-website created
    

Tworzenie strefy DNS i wdrażanie zasobu ruchu przychodzącego

  1. Utwórz strefę usługi Azure DNS przy użyciu az network dns zone create polecenia . Poniższy przykład tworzy strefę DNS o nazwie contoso-website.com:

    az network dns zone create --resource-group myResourceGroup --name contoso-website.com
    
  2. Pobierz identyfikator zasobu dla strefy DNS przy użyciu az network dns zone show polecenia i zapisz dane wyjściowe w zmiennej o nazwie DNS_ZONE_ID.

    DNS_ZONE_ID=$(az network dns zone show --resource-group myResourceGroup --name contoso-website.com --query id --output tsv)
    
  3. Zaktualizuj dodatek klastra routingu aplikacji, aby włączyć integrację usługi Azure DNS przy użyciu az aks approuting zone polecenia .

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${DNS_ZONE_ID} --attach-zones
    
  4. Utwórz plik o nazwie ingress.yml w edytorze usługi Cloud Shell i wklej do niego następujący kod YAML. Pamiętaj, aby zastąpić <dns-zone-name> symbol zastępczy nazwą strefy 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. Zapisz plik.

  6. Wdróż zasób ruchu przychodzącego w klastrze przy użyciu kubectl apply polecenia .

    kubectl apply -f ingress.yml
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

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

Tworzenie zasobu usługi

  1. Utwórz plik o nazwie service.yml w edytorze usługi Cloud Shell i wklej do niego następujący kod 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. Zapisz plik.

  3. Wdróż zasób usługi w klastrze przy użyciu kubectl apply polecenia .

    kubectl apply -f service.yml
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    service/contoso-website created
    

Tworzenie narzędzia HorizontalPodAutoscaler

  1. Utwórz plik o nazwie hpa.yml w edytorze usługi Cloud Shell i wklej do niego następujący kod 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
    

    Ważne jest, aby podkreślić, że scaleTargetRef klucze muszą być takie same jak utworzony zasób wdrożenia. W Twoim przypadku utworzone wdrożenie ma apiVersion wartość jako apps/v1 i nosi nazwę contoso-website. Ta usługa HPA jest skonfigurowana do wykonywania zapytań dotyczących natywnej metryki procesora CPU. Jeśli ta metryka przekroczy średnią 20% przez określony czas, skaluje wdrożenie w poziomie w jednostce. Algorytm używany do obliczania tej metryki jest oparty na tym równaniu matematycznym:

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

    Klucze minReplicas i maxReplicas definiują minimalną i maksymalną liczbę replik, które może mieć wdrożenie. Klucz metrics definiuje metryki zapytań HPA w celu skalowania wdrożenia. W tym przypadku narzędzie HPA wykonuje zapytania dotyczące metryk procesora CPU i pamięci. Jeśli metryka procesora CPU przekroczy 20% lub metryka pamięci przekroczy 50%, narzędzie HPA skaluje wdrożenie w poziomie.

  2. Zapisz plik.

  3. Utwórz narzędzie HPA przy użyciu kubectl apply polecenia .

    kubectl apply -f hpa.yml
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    horizontalpodautoscaler.autoscaling/contoso-website created
    

Sprawdzanie wyników

  1. Wykonaj zapytanie dotyczące metryk i użycia narzędzia HPA przy użyciu kubectl get hpa polecenia .

    kubectl get hpa --namespace hpa-contoso
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

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

    Zwróć uwagę na kolumnę TARGETS . Przedstawia bieżące użycie metryk zdefiniowanych w narzędziu HPA. W takim przypadku użycie procesora CPU wynosi 0%, a użycie pamięci wynosi 0%. Dzieje się tak, ponieważ aplikacja nie odbiera żadnego ruchu.

    Uwaga

    Możliwe, że narzędzie HPA wyświetla unknown metryki przez pierwsze kilka sekund, ponieważ próbuje uzyskać dostęp do interfejsu API metryk, aby pobrać te metryki z serwera.