在 Azure Kubernetes 服务上扩展智能应用程序
在本系列的最后一部分,我们将深入探讨如何利用 AKS 的自动缩放和高可用性等强大功能来管理可变工作负载并维持持续服务。
在本周的第一篇文章中,我们探讨了如何在Azure Kubernetes 服务 (AKS) 中使用 Azure AI Vision 来创建一个能够通过光学字符识别 (OCR) 分析图像并提取宝贵数据的智能应用。本周的第二篇文章侧重于 Azure Cosmos DB 的优势,重点介绍了其多模型数据库以及处理我们智能应用中 OCR 分析产生的各种数据的能力。
在第三篇文章中,我们将配置 AKS 来管理不断变化的工作负载并平滑地扩展我们的智能应用,确保它能够处理高强度和波动的负载,同时不影响性能或可用性。
掌握 Azure Kubernetes 服务以实现智能应用
Azure Kubernetes 服务 (AKS) 是 Azure 生态系统的核心。它在优化应用程序性能和高效资源利用方面发挥着至关重要的作用。通过精确编排容器化工作负载,我们可以在不同环境中部署、管理和扩展应用程序。
AKS 提供了一系列强大的功能,可以帮助应用程序平滑扩展并在需求旺盛时保持可用,包括以下内容:
- 集群自动缩放器会根据您的工作负载量调整集群中的节点数。这样,它就能高效利用资源并控制成本。
- Azure Load Balancer 是使用 AKS 自动创建的,它就像一个智能流量控制器。它确保将传入的网络流量很好地分布到集群的节点上,从而优化资源利用。
这些功能共同为您的应用程序提供了坚实的基础,使其能够处理不同的工作负载并保持不间断运行。
以下各节将通过实际演示,介绍如何设置、监控和优化 AKS,以提高应用程序的效率和性能。
必备组件
要学习本教程,请确保您具备以下条件:
- 阅读本系列的第一篇和第二篇文章。
- 安装了 Python 3.7 或更高版本。
- VS Code 或用于编写 Python 代码的其他集成开发环境。
- 下载了第二篇文章中的示例 Python 应用程序。在开始之前打开该项目。
- 安装了 pip,即 Python 的包管理器。
- 一个免费的 Azure 帐户。如果您还没有,请注册。
- Azure 命令行接口 (CLI)。
查看完整的项目代码,预览最终项目。
解决方案架构
下图展示了本文的目标解决方案的架构。
配置 AKS 以实现动态应用扩展
集群自动缩放器和 Kubernetes HorizontalPodAutoscaler
(HPA) 是在 AKS 环境中实现动态应用扩展的关键。
集群自动缩放器确保我们的集群根据工作负载需求智能地扩展其资源。它通过动态添加或删除节点来优化成本效益,从而高效地管理资源。
HPA 通过自动扩展集群内的各个 Pod 来补充这一点,监控 CPU 使用率或自定义指标等指标,并调整运行中的 Pod 数量以匹配应用程序需求。
为了理解这两个概念如何无缝协作提供全面的扩展解决方案,现在让我们深入了解集群自动缩放器的配置细节。之后,我们将讨论如何在 AKS 集群中设置 HPA。
在 AKS 中设置集群自动缩放器
在 AKS 中设置集群自动缩放器涉及 Azure CLI 和 kubectl 命令的组合。以下是帮助您完成该过程的分步指南,包括初始设置、配置每个节点池的最小和最大节点数以及监控集群自动缩放器的性能。
要进行跟随,请确保您已登录到 Azure 帐户。要登录,请在终端中运行以下命令:
az login
在本系列的第一部分,我们创建了一个名为 aks-intelligent-app
的 AKS 集群。上图显示 AKS 默认创建一个名为 nodepool1
的单个节点池。我们可以通过单击“设置”部分中的“节点池”菜单来访问 AKS 集群节点并可视化默认的 nodepool1
。
在上图中,“节点数:1/1 就绪”表示我们的 AKS 集群中的 nodepool1
节点池分配了一个虚拟机(节点)。该节点目前运行正常,可以接受和执行工作负载。
在 AKS 集群中,节点池是一组配置和容量相似的虚拟机 (VM)。这些节点池是构成集群计算资源的独立 VM 组。节点池允许工作负载隔离和资源分配优化,因为我们可以为每个池量身定制以处理特定任务或工作负载。这种模块化方法增强了 AKS 集群内的灵活性和资源管理。
使用 kubectl,通过运行以下命令检索有关当前节点的信息:
kubectl get nodes
上面的命令应该会检索到类似以下的输出:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-27122202-vmss000000 Ready agent 59m v1.26.6
假设我们希望我们的应用程序支持多个节点。在这种情况下,我们有两种选择:自定义 nodepool1
或根据需要添加更多节点池。在本指南中,我们将回顾如何更新现有的 nodepool1
节点池以支持多个节点。
在终端中运行以下命令来更新现有节点池:
az aks update --resource-group computer-vision --name aks-intelligent-app --enable-cluster-autoscaler --min-count 2 --max-count 3
此更改可确保节点池始终至少有两个可用节点,并且根据工作负载需求最多可以扩展到三个节点。此方法有助于根据 AKS 集群内的不同需求管理资源分配。
现在,再次运行 kubectl get nodes
命令以检索新的节点数:
kubectl get nodes
您的输出应类似以下内容:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-27122202-vmss000000 Ready agent 2d5h v1.26.6
aks-nodepool1-27122202-vmss000001 Ready agent 2d4h v1.26.6
刷新 Azure 门户中 aks-intelligent-app
AKS 集群的“节点池”页面。
上面的“节点数:2/2 就绪”消息表示您现在已分配两个节点,并且都处于正常运行状态。
要查看有关集群中节点的更多信息,请在“节点池”页面上选择“节点”选项卡。
此处,CPU、内存、磁盘和 Pod 信息提供了集群资源使用情况和工作负载分布的全面视图。
集群自动缩放器如何动态扩展资源
集群自动缩放器在维持智能应用程序在云环境中的最佳性能和成本效益方面起着关键作用。
AKS 中的集群自动缩放器持续监控集群的资源使用情况,包括 CPU 和内存,并将其与 Pod 规范中定义的资源请求和限制进行比较。当自动缩放器检测到需要额外资源来满足工作负载需求时,它会自动预配新节点,从而扩展集群容量。反之,当资源需求减少时,集群自动缩放器会通过移除使用不足的节点来缩减规模,从而优化成本效益。
通过响应工作负载需求波动而动态扩展资源,自动缩放器可确保资源得到有效分配,避免在低活动期间过度预配,并在需求高峰时扩展。这种适应性方法提高了智能应用程序的响应能力,并通过正确调整基础架构规模来减轻不必要的费用。
配置 HorizontalPodAutoscaler
Kubernetes HorizontalPodAutoscaler 是一个强大的工具,可确保最佳的应用程序性能和资源利用。它根据 CPU 使用率、内存使用率或用户定义的自定义指标动态调整 Kubernetes 部署中运行的 Pod 数量。
要配置它,我们首先需要定义所需的资源使用目标。例如,如果使用 CPU,我们将指定每个 Pod 的 CPU 使用率目标百分比。一旦我们设置了目标,HPA 就会持续监控指标并自动调整 Pod 数量以维持所需的利用率。
为了演示 HPA 的功能,让我们编写一个 YAML 文件并将其配置为与我们的智能应用一起工作。在 Deployment
文件夹中创建一个名为 intelligent-app-hpa.yml 的文件,其中包含以下内容:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: intelligent-app-hpa
spec:
maxReplicas: 10
minReplicas: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: intelligent-app
targetCPUUtilizationPercentage: 50
注意:您也可以通过将上面的 spec 包含在 Pod 定义 YAML 文件中来启用 Pod 自动缩放。
上面的 intelligent-app-hpa.yml 文件定义了 Kubernetes 中的 HPA 资源。它配置了 intelligent-app
部署的自动缩放器,根据 CPU 使用率自动调整副本(Pod)数量。HPA 确保副本数量在 3 到 10 之间,目标 CPU 使用率为 50%。
随着 CPU 使用率的变化,HPA 会自动调整副本数量以维持所需的 CPU 使用率。此过程允许 intelligent-app
部署高效地处理不断变化的工作负载,同时保持在指定的资源限制内。
要应用 HPA,请将终端切换到 Deployment
文件夹,然后运行以下 kubectl
命令:
cd Deployment
kubectl apply -f intelligent-app-hpa.yml
此命令将应用 intelligent-app-hpa.yml 文件中描述的配置,在 Kubernetes 集群内创建 HPA 资源。
要查看终端中创建的 HPA 资源,请运行以下命令:
kubectl get hpa
终端将显示有关 Kubernetes 集群中存在的 HPA 资源的信息,提供详细信息,包括目标部署、所需副本、当前副本以及自动缩放的使用指标。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
intelligent-app-hpa Deployment/intelligent-app 1%/50% 3 10 3 36s
正如我们在结果中看到的,HorizontalPodAutoscaler
资源已链接到 intelligent-app
Deployment。1%/50%
指标表示当前 CPU 使用率为 50% 目标使用率的 1%。HPA 维护最少 3 个副本(Pod),最多可扩展到 10 个副本。目前,只有三个副本正在运行。
使用 Azure Load Balancer 和 AKS 确保高可用性
我们可以配置和管理 Azure Load Balancer、可用性区域 (AZ) 和 Pod 中断预算,以确保应用程序的高可用性。在本节中,我们将详细介绍这些概念。
在本系列的第一篇文章中,我们了解到我们可以运行 kubectl get services
命令来列出服务及其相应的详细信息,例如服务名称、集群 IP 地址、外部 IP 和端口。
kubectl get services
命令提供了一个快速全面的 Kubernetes 集群中已部署服务的快照,提供了服务名称、集群 IP、外部 IP、端口和关联端点等关键详细信息。这些信息使管理员和开发人员能够监控、排除故障和管理服务的连接性和可访问性。
在终端中运行此命令:
kubectl get services
您应该会收到类似以下的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
intelligent-app-service LoadBalancer 10.0.77.60 20.121.76.153 80:30936/TCP 47s
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 14m
在此输出中,我们可以看到一个名为 intelligent-app-service
的 Kubernetes 服务,其类型为 LoadBalancer
,可通过 IP 10.0.77.60
从集群访问。它可以通过端口 80 上的 20.121.76.153
访问,并映射到端口 30936。
Azure Load Balancer 会持续监控每个 Pod 或节点的运行状况和响应能力,并主动分发传入请求以在 Pod 之间保持均衡负载。它确保 Pod 之间的流量均匀分布,防止任何单个 Pod 或节点过载,从而促进最佳资源利用。
Load Balancer 将请求智能地路由到健康 Pod 的能力,结合服务针对运行状况探测和后端池设置的配置,有助于提高应用程序的高可用性和响应能力。
这些功能使应用程序能够无缝适应不断变化的工作负载和潜在的节点故障,同时提供可靠的用户体验。
AKS 中的可用性区域
Azure AZ 对于增强 AKS 中应用程序的弹性和可用性至关重要。跨多个 AZ 部署 AKS 集群涉及将集群资源分布在物理隔离的数据中心。这种方法可确保,如果一个区域发生中断(例如,由于该区域的自然灾害),应用程序可以从另一个区域继续运行。
在第一篇文章中,我们创建了一个 AKS 集群。现在,我们可以使用 kubectl
命令和 grep
来检查此 AKS 集群中节点的 AZ。在终端中运行此命令:
kubectl get nodes -o custom-columns="NAME:.metadata.name,AVAILABILITY_ZONE:.metadata.labels.topology\.kubernetes\.io/zone"
您应该会收到类似以下内容的结果:
NAME AVAILABILITY_ZONE
aks-nodepool1-57155478-vmss000001 0
输出显示节点 aks-nodepool1-57155478-vmss000001
位于可用性区域 0
。此信息有助于我们了解 Kubernetes 如何将集群中的节点分布在 AZ 之间,这对于实现基于 Kubernetes 的应用程序的高可用性和容错能力至关重要。
特别值得注意的是,在创建 AKS 集群后,我们无法直接修改它来启用或禁用 AZ。要创建一个跨越 AZ 1、2 和 3 的集群,请按以下方式修改 az aks create
命令:
az aks create --resource-group computer-vision --name aks-intelligent-app --node-count 1 --generate-ssh-keys --zones 1 2 3
注意:我们可以使用 Azure CLI 发现特定区域的 Azure AZ。打开命令行终端并运行以下命令以列出特定 Azure 区域的可用 AZ:
az vm list-skus --location <region-name> --output table
将 <region-name>
替换为您要检查的 Azure 区域的名称。例如,如果您想检查东部美国区域的 AZ,请运行以下命令:
az vm list-skus --location eastus --output table
使用中断预算在自愿中断期间维护服务
在 AKS 中,Pod 中断预算 (PDB) 对于在更新或计划中断期间维护服务可用性至关重要。PDB 设定了同时可以有多少个 Pod 不可用,通过确保任何时候只有受控数量的 Pod 被脱机,从而防止过多的停机时间。此设计允许我们在自愿中断期间维护服务。
以下是创建和管理 PDB 的分步指南,其中我们定义了最小可用或最大不可用资源计数。
要创建 PDB,您需要定义一个 YAML 配置文件,其中指定了预算的所需条件。首先,在 Deployment
文件夹中创建一个名为 pdb-config.yml 的文件,其中包含以下内容:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: intelligent-app
spec:
minAvailable: 3
selector:
matchLabels:
app: intelligent-app
在此,minAvailable
字段指定了在自愿中断(如维护或更新)期间必须保持可用的 Pod 数量(未中断或终止)。将此字段设置为 3
意味着在发生中断时,Kubernetes 将确保在任何时候至少有三个指定应用程序的 Pod 正在运行。
现在,确保您位于 Deployment
文件夹中,并使用 kubectl apply
命令应用 PDB 配置:
kubectl apply -f pdb-config.yml
要验证您已成功创建 PDB,请运行以下命令:
kubectl describe pdb intelligent-app
此命令将产生以下结果:
Name: intelligent-app
Namespace: default
Min available: 3
Selector: app=intelligent-app
Status:
Allowed disruptions: 0
Current: 1
Desired: 3
Total: 1
Events: <none>
现在让我们分析输出:
- 名称和命名空间 — PDB 的名称为
intelligent-app
,属于默认命名空间。 - 最小可用 — PDB 指定始终必须至少有三个 Pod 可用。因此,即使在计划中断期间,也始终会运行至少三个应用程序 Pod。
- 选择器 — PDB 适用于带有标签
app=intelligent-app
的 Pod。 - 状态 —
- 允许的中断 — 值为
0
表示 PDB 不允许对其选择器匹配的 Pod 进行任何中断或驱逐。在此示例中,它确保始终至少有三个健康的 Pod 可用,并且不允许任何中断。 - 当前 — 显示当前匹配 PDB 选择器的健康副本数量。在此情况下,为
1
,表示当前有一个健康的 Pod。 - 所需 — 指示所需的可用的副本数量。它也设置为
3
,表示 PDB 希望维护三个副本。 - 总计 — 匹配 PDB 选择器的副本总数。为
1
,表示有一个副本。
- 允许的中断 — 值为
- 事件 — 事件下的
<none>
条目表示此 PDB 没有近期事件或相关更改。
通过实施这些预算,AKS 确保了一个渐进式且受控的更新过程,最大限度地减少了服务中断,并提供了可靠的用户体验。这是一种在必要更新与保持服务对用户响应和可用性之间取得平衡的战略方法。
配置 AKS 中的 Azure Load Balancer 以实现高可用性
为了确保您的应用程序能够承受故障并保持持续的服务可用性,您必须为 AKS 中的 Azure Load Balancer 配置高可用性。您可以采取许多措施来提高 AKS 集群中 Azure Load Balancer 的可用性。
为进行演示,请打开终端并运行以下命令:
az aks update --resource-group computer-vision --name aks-intelligent-app --load-balancer-managed-outbound-ip-count 2
上面的 Azure CLI 命令更新了 aks-intelligent-app
AKS 集群,将集群负载均衡器的托管出站 IP 计数设置为 2
。此命令增加了与集群负载均衡器关联的托管出站 IP 地址的数量,这在需要多个出站 IP 地址进行负载均衡和网络出口时可能很有用。此过程提高了集群的网络功能,并允许更灵活的出站流量管理。
要配置 AKS 中的 Azure Load Balancer 以实现高可用性,请考虑实施以下附加措施:
- 使用 Azure AZ — 将 AKS 集群部署到多个Azure AZ,以确保冗余和容错。
- 配置运行状况探测 — 为 Azure Load Balancer 定义运行状况探测,以定期检查后端 Pod 或节点的运行状况。
- 负载均衡器规则 — 配置负载均衡规则以高效地分发流量。
- 后端池缩放 — 根据流量模式调整后端池缩放。
- 网络安全规则 — 实施网络安全组 (NSG) 来控制进出负载均衡器的入站和出站流量。
- Azure 监控和诊断 — 设置监控和诊断以深入了解负载均衡器的性能和流量分布。
- 备份和恢复 — 为您的 AKS 集群和负载均衡器配置实施备份和灾难恢复策略。
- 缩放和自动缩放 — 使用AKS HorizontalPodAutoscaler 为您的应用程序自动调整 Pod 数量,以根据资源使用情况进行调整。
您可以在 Microsoft Learn 上进一步探索此主题。
后续步骤
在下一篇博文中,我们将继续探讨如何监控 Azure Kubernetes 服务集群,并深入研究智能应用程序中扩展和设计高可用性的实际用例。