最大化效率和性能:AKS 中节点池的强大功能

什么是节点池

在 Azure Kubernetes 服务 (AKS) 中,相同配置的节点会被分组到节点池中。这些节点池包含运行应用程序的底层虚拟机。创建 AKS 集群时,您需要定义初始节点数及其大小 (SKU)。随着应用程序需求的变化,您可能需要更改节点池的设置。例如,您可能需要扩展节点池中的节点数或升级节点池的 Kubernetes 版本。

系统节点池和用户节点池是 AKS 集群的两种不同节点池模式。系统节点池主要用于托管关键系统 Pod,例如 CoreDNS 和 metrics-server。用户节点池主要用于托管应用程序 Pod。但是,如果您希望 AKS 集群中只有一个池,则可以将应用程序 Pod 调度到系统节点池中。每个 AKS 集群必须至少包含一个系统节点池,且至少包含两个节点。

为了支持具有不同计算或存储需求的应用程序,您可以创建用户节点池。系统节点池主要用于托管关键系统 Pod,例如 CoreDNS 和 konnectivity。用户节点池主要用于托管应用程序 Pod。例如,使用更多用户节点池为计算密集型应用程序提供 GPU,或访问高性能 SSD 存储。

节点池的分类和限制

对于系统节点池,AKS 会自动为其节点分配 kubernetes.azure.com/mode: system 标签。这会导致 AKS 优先在包含此标签的节点池上调度系统 Pod。此标签不会阻止您在系统节点池上调度应用程序 Pod。但是,我们建议您将关键系统 Pod 与应用程序 Pod 隔离,以防止配置错误或恶意应用程序 Pod 意外删除系统 Pod。

您可以通过创建专用系统节点池来强制执行此行为。使用 CriticalAddonsOnly=true:NoSchedule 污点来阻止在系统节点池上调度应用程序 Pod。

系统节点池具有以下限制:

  • 系统节点池必须至少支持 30 个 Pod,如 Pod 的最小值和最大值公式所述。
  • 系统池的操作系统类型必须是 Linux。
  • 用户节点池的操作系统类型可以是 Linux 或 Windows。
  • 系统池必须至少包含两个节点,而用户节点池可以包含零个或多个节点。
  • 系统节点池要求虚拟机 SKU 至少包含 4 个 vCPU 和 4GB 内存。
  • 系统节点池不支持 B 系列虚拟机。
  • 建议至少使用三个 8 个 vCPU 的节点或两个至少 16 个 vCPU 的节点(例如 Standard_DS4_v2),尤其对于大型集群(多个 CoreDNS Pod 副本、3-4 个以上附加组件等)。
  • Spot 节点池需要用户节点池。
  • 添加另一个系统节点池或更改哪个节点池是系统节点池不会自动移动系统 Pod。即使您将节点池更改为用户节点池,系统 Pod 仍可继续在同一个节点池上运行。如果您删除或缩减运行先前属于系统节点池的系统 Pod 的节点池,这些系统 Pod 将按照优先调度的方式重新部署到新的系统节点池。

您可以对节点池执行以下操作:

  • 创建专用的系统节点池(优先调度系统 Pod,而不是模式为"system"的节点池)
  • 将系统节点池更改为用户节点池,前提是您有另一个系统节点池可以在 AKS 集群中替代它。
  • 将用户节点池更改为系统节点池。
  • 删除用户节点池。
  • 您可以删除系统节点池,前提是您有另一个系统节点池可以在 AKS 集群中替代它。
  • 一个 AKS 集群可以有多个系统节点池,并且至少需要一个系统节点池。
  • 如果您想更改现有节点池中的各种不可变设置,可以创建新的节点池来替换它们。例如,添加一个具有新 maxPods 设置的新节点池并删除旧节点池。
  • 使用节点亲和性可以根据节点标签来要求或优先安排哪些节点可以进行调度。您可以将键设置为 kubernetes.azure.com,将操作员设置为 In,并将用户或系统的值设置为您的 YAML,然后使用 kubectl apply -f yourYAML.yaml 应用此定义。

节点池的常用案例

创建包含系统节点池的新 AKS 集群

创建新的 AKS 群集时,初始节点池默认为系统类型模式。 使用 az aks nodepool add 创建新节点池时,除非显式指定 mode 参数,否则这些节点池为用户节点池。

使用 az aks create 命令创建 AKS 群集。以下示例创建一个名为 myAKSCluster 的群集,其中包含一个包含两个节点的专用系统池。对于生产工作负荷,请确保使用至少包含三个节点的系统节点池。此操作可能需要几分钟才能完成。

复制代码
az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 2 --generate-ssh-keys

向现有 AKS 集群添加专用系统节点池

您可以向现有 AKS 集群添加一个或多个系统节点池。建议将应用程序 Pod 调度到用户节点池中,并将系统节点池专用于关键系统 Pod。这可以防止恶意应用程序 Pod 意外删除系统 Pod。您可以使用系统节点池的 CriticalAddonsOnly=true:NoSchedule 污点来强制执行此行为。

以下命令将添加一个模式类型为 system 的专用节点池,默认节点数为 3 个。

复制代码
az aks nodepool add --resource-group myResourceGroup --cluster-name myAKSCluster --name systempool --node-count 3 --node-taints CriticalAddonsOnly=true:NoSchedule --mode System

向现有AKS 群集添加 Spot 节点池

将 Spot 节点池添加到现有集群时,该集群必须是启用了多个节点池的集群。创建启用了多个节点池的 AKS 集群时,默认情况下会创建一个优先级为"常规"的节点池。要添加 Spot 节点池,必须将优先级的值指定为"Spot"。

复制代码
export SPOT_NODEPOOL="spotnodepool"
export AKS_CLUSTER="myakscluster"
export RESOURCE_GROUP="myaksgroup"

az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER --name $SPOT_NODEPOOL --priority Spot --eviction-policy Delete --spot-max-price -1 --enable-cluster-autoscaler --min-count 1 --max-count 3 --no-wait

在新集群上启用Cluster Autoscaler

集群通常需要一种自动扩展的方式,以适应不断变化的应用程序需求,例如在工作日与晚上或周末之间。AKS 集群可以通过以下方式扩展:

  • 集群自动扩展器会定期检查由于资源限制而无法在节点上调度的 Pod。然后,集群会自动增加节点数量。使用集群自动扩展器时,手动扩展功能将被禁用。

  • 水平 Pod 自动扩展器使用 Kubernetes 集群中的 Metrics Server 来监控 Pod 的资源需求。如果应用程序需要更多资源,则会自动增加 Pod 数量以满足需求。

  • 垂直 Pod 自动扩展器会根据过去的使用情况自动设置每个工作负载的资源请求和容器限制,以确保 Pod 被调度到具有所需 CPU 和内存资源的节点上。

    az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 1 --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --enable-cluster-autoscaler --min-count 1 --max-count 3 --generate-ssh-keys

在节点池上启用 Artifact Streaming,减少映像拉取时间

在不断发展的云原生应用领域中,缩短部署时间对于维持高效的工作流程至关重要。Azure Kubernetes 服务 (AKS) 推出了 Artifact Streaming 功能,旨在显著缩短镜像拉取时间,从而提升 AKS 部署的性能。

什么是 Artifact Streaming?

Artifact Streaming 允许 AKS 直接从 Azure 容器注册表 (ACR) 流式传输容器镜像。AKS 不会一次性拉取整个镜像,而是只拉取 Pod 初始启动所需的必要层,从而缩短整体镜像拉取时间并加快部署速度。

主要优势

  • 更快的部署:Artifact Streaming 可将 Pod 就绪时间缩短 15% 以上,尤其适用于小于 30GB 的镜像。
  • 并发 Pod 启动:Pod 可以并发启动,而不是串行启动,从而提高部署效率。
  • 优化资源利用:通过减少拉取大型镜像所需的时间,帮助避免拥堵。

先决条件

在启用 Artifact Streaming 之前,请确保您已具备:

  • 一个集成了 ACR 的现有 AKS 集群。
  • Kubernetes 1.25 或更高版本。
  • Ubuntu 22.04、Ubuntu 20.04 或 Azure Linux 节点池(不支持 Windows 节点池)。

具体的步骤

  1. 安装 aks-preview CLI 扩展

首先,安装并更新 aks-preview CLI 扩展,以确保您拥有最新版本:

复制代码
az extension add --name aks-preview
az extension update --name aks-preview
  1. 注册 ArtifactStreamingPreview 功能

为您的订阅注册 ArtifactStreamingPreview 功能:

复制代码
az feature register --namespace Microsoft.ContainerService --name ArtifactStreamingPreview
  1. 在 ACR 上启用 Artifact Streaming

创建资源组和 ACR 实例,然后在您的 ACR 上启用 Artifact Streaming:

复制代码
az group create --name myStreamingTest --location westus
az acr create --resource-group myStreamingTest --name mystreamingtest --sku Premium
az configure --defaults acr="mystreamingtest"
az acr import --source docker.io/jupyter/all-spark-notebook:latest --repository jupyter/all-spark-notebook:latest
az acr artifact-streaming create --image jupyter/all-spark-notebook:latest
az acr manifest list-referrers --name jupyter/all-spark-notebook:latest
  1. 在 AKS 上启用 Artifact Streaming

对于新节点池:

创建一个启用 Artifact Streaming 的新节点池:

复制代码
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name myNodePool \
--enable-artifact-streaming

对于现有节点池:

更新现有节点池以启用 Artifact Streaming:

复制代码
az aks nodepool update \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name myNodePool \
--enable-artifact-streaming
  1. 验证 Artifact Streaming

检查 Artifact Streaming 是否已启用:

复制代码
az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name myNodePool --query artifactStreamingProfile

确保"Enabled"字段设置为 true。

AKS 集群节点池大小调整

何时需要调整节点池大小

以下是调整 AKS 集群节点池大小的一些常见原因:

  • 性能优化:增加节点池中节点的大小可以提高 AKS 集群中运行应用程序的性能。如果您注意到资源限制或计算资源不足导致的性能问题,则尤其需要这样做。
  • 成本优化:通过减少虚拟机大小或节点数量来缩减节点池有助于优化成本,尤其是在集群持续利用率不足或资源需求减少的情况下。
  • 应用程序扩展:随着应用程序工作负载的增长,您可能需要通过添加更大的虚拟机或其他节点来扩展 AKS 集群,以满足不断增长的需求并保持性能水平。
  • 资源需求:如果应用程序的资源需求发生变化,则可能需要更改节点池大小。
  • 工作负载变化:如果您的应用程序工作负载波动,您可能需要考虑使用 Kubernetes 水平 Pod 自动扩缩器 (HPA) 或 Azure Kubernetes 服务 (AKS) 集群自动扩缩器等工具自动调整节点池大小。这些工具会根据工作负载需求自动调整节点数量,从而确保资源分配优化。

调整 AKS 集群 NodePool 大小的步骤

步骤 1:使用所需的 SKU 创建新的节点池

为了将现有节点池(假设名为"nodepool1")的大小从 SKU Standard_DS2_v2 调整为 Standard_DS3_v2,我们需要使用 Standard_DS3_v2 SKU 创建一个新的节点池(假设名为"mynodepool")。

复制代码
az aks nodepool add \ 
    --resource-group myResourceGroup \ 
    --cluster-name myAKSCluster \ 
    --name mynodepool \ 
    --node-count 3 \ 
    --node-vm-size Standard_DS3_v2 \ 
    --mode System \ 
    --no-wait

注意:每个 AKS 集群至少需要有一个系统节点池,且每个节点池至少包含一个节点。在给定场景中,"---mode"参数设置为"System",因为假设集群只有一个节点池,需要用系统节点池来替换它。请注意,节点池的模式可以根据需要随时修改。

步骤 2:封锁现有节点池

封锁是指将特定节点指定为不可调度的过程,从而有效地阻止任何其他 Pod 被调度到这些节点上。

首先,使用命令"kubectl get nodes"获取要封锁的节点的名称。输出将类似于以下格式:

复制代码
NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-31721111-vmss000000   Ready    agent   1d08h   v1.31.7
aks-nodepool1-31721111-vmss000001   Ready    agent   1d08h   v1.31.7
aks-nodepool1-31721111-vmss000002   Ready    agent   1d08h   v1.31.7

随后,使用"kubectl cordon <node-names>"命令指定所需的节点,并以空格分隔的列表形式提供它们的名称。

复制代码
kubectl cordon aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002

Output

node/aks-nodepool1-31721111-vmss000000 cordoned
node/aks-nodepool1-31721111-vmss000001 cordoned
node/aks-nodepool1-31721111-vmss000002 cordoned

节点池现已隔离,其他 Pod 将不会被重新调度到这些节点池上。

步骤 3:清空现有节点池

清空节点会导致这些节点上运行的 Pod 被驱逐,并在其他可调度节点(本例中为 mynodepool)上重新创建。要清空节点,请使用命令"kubectl drain <node-names> --- ignore-daemonsets --- delete-emptydir-data",并使用以空格分隔的节点名称列表。

注意

需要使用 --delete-emptydir-data 参数来驱逐 AKS 创建的 coredns 和 metrics-server Pod。如果不使用此参数,则会出现错误。

复制代码
kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data

排空操作完成后,除守护进程集控制的 Pod 外,所有 Pod 都将在新的节点池上运行。

步骤 4:监控和验证
  1. 监控节点池调整操作的状态。您可以使用 Azure 门户和 Azure CLI 检查进度。
  2. 验证 AKS 集群中的节点是否已调整为目标虚拟机大小。
  3. 确保在节点调整操作后,AKS 集群中运行的应用程序和工作负载正常运行。
  4. 监控应用程序的性能和资源利用率,以验证它们是否以最佳状态运行。

总结

为了优化 Kubernetes 中的节点池,可以考虑将Artifact Streaming与 Azure 容器注册表 (ACR) 结合使用,以加快镜像拉取速度并缩短部署时间。为经济高效的非关键工作负载实施spot节点池,同时部署自动缩放功能以根据需求调整节点数量。通过为不同的工作负载选择合适的虚拟机大小来自定义节点池配置,并设置资源配额和限制,以确保公平的资源分配。利用节点亲和性和污点/容忍度来控制 Pod 调度,并通过定期监控和更新来保持一致的性能。这些策略共同增强了 Kubernetes 环境中的可扩展性、成本效益和应用程序性能。

相关推荐
阿里云云原生4 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉4 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情6 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海11 小时前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色11 小时前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠12 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟12 小时前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。14 小时前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠14 小时前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙14 小时前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生