使用 az aks command invoke 重启 AKS 中的 Deployment

2026-07-15#Azure#AKS

当重启 Kubernetes 部署时,通常会使用 kubectl rollout restart deployment <deployment-name> -n <namespace> 命令。然而,在某些情况下,可能无法直接访问 AKS 集群的 Kubernetes API,此时可以使用 Azure CLI 的 az aks command invoke 命令来执行该操作。

前置权限 🔗

需要具备在目标 AKS 集群上执行 Run Command 的 Azure RBAC 权限。实践中,仅有 Kubernetes RBAC 的 Kubernetes Admin 往往不足以执行 az aks command invoke,建议至少具备该 AKS 资源范围的 Contributor 权限。

重启 Deployment 🔗

az aks command invoke --name <cluster-name> --resource-group <resource-group> --subscription "<subscription-id-or-name>" --command "kubectl rollout restart deployment <deployment-name> -n <namespace>" --output json

注意,该命令的退出码为 az 命令的退出码,并不是 kubectl 命令的退出码。即使 kubectl 命令执行失败,az aks command invoke 的退出码仍然可能是 0。好在这个命令返回的 JSON 格式的结果里,包含了 exitCode 字段,表示 kubectl 命令的退出码。可以通过解析该字段来判断 kubectl 命令是否执行成功。

比如当 Deployment 不存在时,返回的 JSON 结果如下:

{
  "exitCode": 1,
  "finishedAt": "2026-07-13T12:57:22+00:00",
  "id": "b1c77d81f142404d825db5f8a490f05a",
  "logs": "Error from server (NotFound): deployments.apps \"abc\" not found\n",
  "provisioningState": "Succeeded",
  "reason": null,
  "startedAt": "2026-07-13T12:57:17+00:00"
}

另外,kubectl rollout restart 执行后会立即返回,并不会等待重启完成。如果想知道重启结果,还需要使用 kubectl rollout status 命令查看 Deployment 状态。可以执行如下命令等待重启完成:

az aks command invoke --name <cluster-name> --resource-group <resource-group> --subscription "<subscription-id-or-name>" --command "kubectl rollout status deployment <deployment-name> -n <namespace>" --output json

返回示例如下:

{
  "exitCode": 0,
  "finishedAt": "2026-07-13T12:59:59+00:00",
  "id": "826c6fba27ae45eeb28956d6f32a6e20",
  "logs": "....",
  "provisioningState": "Succeeded",
  "reason": null,
  "startedAt": "2026-07-13T12:59:54+00:00"
}