停止和启动 Azure Kubernetes 服务 (AKS) 群集

可能不需要持续运行 Azure Kubernetes 服务 (AKS) 工作负载。 例如,可能有只在营业时间使用的开发群集。 这表示有时群集可能处于空闲状态,只运行系统组件。 可以通过将所有 User 节点池缩放为 0 来减少群集内存占用量,但当该群集运行时,仍需要 System来运行系统组件。

为了在这段时间内更好地优化成本,可以关闭或停止群集。 此操作将停止控制平面和代理节点,从而节省所有计算成本,同时保持除独立 pod 之外的所有对象。 存储群集状态,以备再次启动时可从中断的位置重新开始。

注意

停止群集会解除分配控制平面并释放容量。 在遇到容量限制的区域,客户可能无法启动已停止的群集。 我们不建议因此停止任务关键型工作负载。

注意

AKS 启动操作将从 ETCD 还原所有对象,但具有相同名称和存在时长的独立 Pod 除外。 这意味着 Pod 的存在时长将继续从其初始创建时间开始计算。 无论群集是否处于停止状态,此计算时长都会随着时间的推移而不断增加。

开始之前

本文假设你有现有 AKS 群集。 如果需要 AKS 群集,可以使用 Azure CLIAzure PowerShellAzure 门户 创建一个。

关于群集停止/启动功能

当使用群集停止/启动功能时,以下条件适用:

  • 只有虚拟机规模集支持的群集才支持此功能。
  • 不能停止使用 节点自动预配 (NAP) 功能的群集。
  • 已停止的 AKS 群集的群集状态将最多保留 12 个月。 如果群集停止时间超过 12 个月,则无法恢复状态。 有关详细信息,请参阅 AKS 支持策略
  • 在已停止的 AKS 群集上只能执行启动或删除操作。 要执行其他操作,如缩放或升级,需要首先启动群集。
  • 如果预配了链接到专用群集的 PrivateEndpoints,则在启动已停止的 AKS 群集时需要删除并重新创建它们。
  • 由于停止进程会清空所有节点,因此,任何独立 Pod(例如,不由 Deployment、StatefulSet、DaemonSet、Job 等管理的 Pod)将被删除。
  • 启动群集备份时,预期会出现以下行为:
    • API 服务器的 IP 地址可能会更改。
    • 如果使用的是群集自动缩放程序,则在启动群集时,当前节点计数可能不在所设置的最小范围值和最大范围值之间。 群集以运行其工作负载所需的节点数(不受自动缩放程序设置影响)开始。 当群集执行缩放操作时,最小值和最大值将影响当前节点计数,并且群集最终将进入并保持在所需范围内,直到停止群集为止。

停止 AKS 群集

  1. 使用 az aks stop 命令可以停止正在运行的 AKS 群集,包括节点和控制平面。 以下示例停止名为 myAKSCluster 的群集:

    az aks stop --name myAKSCluster --resource-group myResourceGroup
    
  2. 验证群集是否已停止使用 az aks show 命令,并确认 powerState 显示为 Stopped

    az aks show --name myAKSCluster --resource-group myResourceGroup
    

    输出应该类似于以下简洁示例输出:

    {
    [...]
      "nodeResourceGroup": "MC_myResourceGroup_myAKSCluster_chinaeast2",
      "powerState":{
        "code":"Stopped"
      },
      "privateFqdn": null,
      "provisioningState": "Succeeded",
      "resourceGroup": "myResourceGroup",
    [...]
    }
    

    如果 provisioningState 显示 Stopping,则群集尚未完全停止。

重要

如果使用的是 Pod 中断预算,停止操作可能需要更长的时间,因为清空过程将花费更多的时间才能完成。

启动 AKS 群集

注意

在 AKS 上使用启动/停止功能后,必须等待 15-30 分钟才能重启 AKS 群集。 此等待期是必需的,因为相关服务需要几分钟时间才能完全停止。 尝试在此过程中重启群集可能会中断关闭过程,并可能导致群集或其工作负载出现问题。

  1. 使用 az aks start 命令以启动已停止的 AKS 群集。 群集将以先前的控制平面状态和代理节点数重新启动。 以下示例启动名为 myAKSCluster 的群集:

    az aks start --name myAKSCluster --resource-group myResourceGroup
    
  2. 验证群集是否已开始使用 az aks show 命令,并确认 powerState 显示 Running

    az aks show --name myAKSCluster --resource-group myResourceGroup
    

    输出应该类似于以下简洁示例输出:

    {
    [...]
      "nodeResourceGroup": "MC_myResourceGroup_myAKSCluster_chinaeast2",
      "powerState":{
        "code":"Running"
     },
     "privateFqdn": null,
     "provisioningState": "Succeeded",
     "resourceGroup": "myResourceGroup",
    [...]
    }
    

    如果 provisioningState 显示 Starting,则群集尚未完全启动。

后续步骤