練習 - 建立您的 HorizontalPodAutoscaler

已完成

練習 - 調整應用程式

建立 AKS 叢集

您必須先建立具有必要資源的 AKS 叢集,才能開始調整應用程式。

  1. 使用您想要將資源部署到的帳戶登入 Azure Cloud Shell ,然後選取 Bash 作為執行中的殼層。

  2. 使用 az group create 命令建立資源群組。 下列範例會在位置中eastus建立名為 myResourceGroup 的資源群組:

    az group create --name myResourceGroup --location eastus
    
  3. 使用 az aks create 命令建立 AKS 叢集。 下列範例會在資源群組中建立名為 myAKSClustermyResourceGroup 叢集。 叢集有一個節點,並使用 Standard_DS2_v2 VM 大小。

    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. 在 Cloud Shell 編輯器中建立名為 deployment.yml 的新檔案,並將下列 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. 使用 az network dns zone create 命令建立 Azure DNS 區域。 下列範例會建立名為 contoso-website.comDNS 區域:

    az network dns zone create --resource-group myResourceGroup --name contoso-website.com
    
  2. 使用 az network dns zone show 命令取得 DNS 區域的資源識別碼,並將輸出儲存至名為 DNS_ZONE_ID變數。

    DNS_ZONE_ID=$(az network dns zone show --resource-group myResourceGroup --name contoso-website.com --query id --output tsv)
    
  3. 更新應用程式路由叢集附加元件,以使用 az aks approuting zone 命令啟用 Azure DNS 整合。

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${DNS_ZONE_ID} --attach-zones
    
  4. 在 Cloud Shell 編輯器中建立名為 ingress.yml 的檔案,並將下列 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. 在 Cloud Shell 編輯器中建立名為 service.yml 的檔案,並將下列 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
    

建立 HorizontalPodAutoscaler

  1. 在 Cloud Shell 編輯器中建立名為 hpa.yml 的檔案,並將下列 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 索引鍵必須與所建立的部署資源相同。 在您的案例中,您所建立的部署具有 apiVersionapps/v1 且稱為 contoso-website。 此 HPA 已設定為查詢原生 CPU 計量。 如果此計量超過指定時間的 20% 平均值,則會在單位中調整部署。 用來計算此計量的演算法是根據此數學方程式:

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

    minReplicasmaxReplicas 索引鍵會定義部署可擁有的複本數目下限和上限。 金鑰 metrics 會定義 HPA 查詢用來調整部署的計量。 在此情況下,HPA 會查詢CPU和記憶體計量。 如果 CPU 計量超過 20%,或記憶體計量超過 50%,HPA 就會相應放大部署。

  2. 儲存檔案。

  3. 使用 kubectl apply 命令建立 HPA。

    kubectl apply -f hpa.yml
    

    您的輸出看起來應類似下列範例輸出:

    horizontalpodautoscaler.autoscaling/contoso-website created
    

檢查結果

  1. 使用 kubectl get hpa 命令查詢 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 中定義的計量目前使用量。 在此情況下,CPU 使用量為 0%,記憶體使用量為 0%。 這是因為應用程式未接收任何流量。

    注意

    HPA 可能會在嘗試到達計量 API 以從伺服器擷取這些計量時,顯示其前幾秒的 unknown 計量。