练习 - 创建 HorizontalPodAutoscaler
练习 - 缩放应用程序
创建 AKS 群集
你需要先创建具有所需资源的 AKS 群集,然后才能开始缩放应用程序。
使用要将资源部署到的帐户登录到 Azure Cloud Shell,然后选择“Bash”作为运行的 shell。
使用
az group create
命令创建资源组。 以下示例在eastus
位置创建一个名为myResourceGroup
的资源组:az group create --name myResourceGroup --location eastus
使用
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
该命令需要几分钟时间才能完成。
使用
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
在 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
保存文件。
使用
kubectl apply
命令将应用程序部署到群集。kubectl apply -f deployment.yml
输出应类似于以下示例输出:
deployment.apps/contoso-website created
创建 DNS 区域并部署入口资源
使用
az network dns zone create
命令创建 Azure DNS 区域。 以下示例将创建名为 contoso-website.com 的 DNS 区域:az network dns zone create --resource-group myResourceGroup --name contoso-website.com
使用
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)
更新应用程序路由群集加载项,以使用
az aks approuting zone
命令启用 Azure DNS 集成。az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${DNS_ZONE_ID} --attach-zones
在 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
保存文件。
使用
kubectl apply
命令将入口资源部署到群集。kubectl apply -f ingress.yml
输出应类似于以下示例输出:
ingress.networking.k8s.io/contoso-website created
创建服务资源
在 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
保存文件。
使用
kubectl apply
命令将服务资源部署到群集。kubectl apply -f service.yml
输出应类似于以下示例输出:
service/contoso-website created
创建 HorizontalPodAutoscaler
在 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 )]
minReplicas
和maxReplicas
键定义部署可以拥有的最小和最大副本数目。metrics
键定义 HPA 查询用于缩放部署的指标。 在此例中,HPA 会查询 CPU 和内存指标。 如果 CPU 指标超过 20%,或者内存指标超过 50%,HPA 将横向扩展部署。保存文件。
使用
kubectl apply
命令创建 HPA。kubectl apply -f hpa.yml
输出应类似于以下示例输出:
horizontalpodautoscaler.autoscaling/contoso-website created
检查结果
使用
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 来从服务器提取这些指标。