练习 - 创建 HorizontalPodAutoscaler

已完成

练习 - 缩放应用程序

创建 AKS 群集

你需要先创建具有所需资源的 AKS 群集,然后才能开始缩放应用程序。

  1. 使用要将资源部署到的帐户登录到 Azure Cloud Shell,然后选择“Bash”作为运行的 shell。

  2. 使用 az group create 命令创建资源组。 以下示例在 eastus 位置创建一个名为 myResourceGroup 的资源组:

    az group create --name myResourceGroup --location eastus
    
  3. 使用 az aks create 命令创建 AKS 群集。 以下示例将在 myResourceGroup 资源组中创建一个名为 myAKSCluster 的群集。 该群集有一个节点,并使用 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.com 的 DNS 区域:

    az network dns zone create --resource-group myResourceGroup --name contoso-website.com
    
  2. 使用 az network dns zone show 命令获取 DNS 区域的资源 ID,并将输出保存到名为 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 键必须与创建的部署资源相同。 在此示例中,你创建的部署将 apiVersion 作为 apps/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 可能会在最初的几秒钟显示 unknown 指标,因为它正在尝试访问指标 API 来从服务器提取这些指标。