你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Kubernetes 节点和节点池管理

Azure Kubernetes 服务 (AKS)
Azure 虚拟机

Kubernetes 体系结构基于两层:控制平面节点池中的一个或多个节点。 本文描述并比较了 Amazon Elastic Kubernetes 服务 (Amazon EKS) 和 Azure Kubernetes 服务 (AKS) 如何管理代理或工作器节点。

注意

本文是系列文章之一,可帮助熟悉 Amazon EKS 的专业人员了解 Azure Kubernetes 服务 (AKS)

在 Amazon EKS 和 AKS 中,云平台提供和管理控制平面层,而客户管理节点层。 下图显示了 AKS Kubernetes 体系结构中控制平面和节点之间的关系。

显示 AKS 体系结构中的控制平面和节点的图表。

Amazon EKS 托管节点组

Amazon EKS 托管节点组为 Amazon EKS 集群自动配置和管理 Amazon Elastic Compute Cloud (EC2) (EC2) 工作器节点。 Amazon Web Services (AWS) 用户可以使用 eksctl 命令行实用程序为其 EKS 集群创建、更新或终止节点。 节点更新和终止会自动封锁和排出节点,以确保应用程序保持可用。

每个托管节点都作为 Amazon EKS 操作和控制的 Amazon EC2 自动缩放组的一部分进行预置。 当 Pod 失败或被重新调度到其他节点时,Kubernetes 群集自动缩放器会自动调整群集中的工作节点数量。 每个节点组都可以配置为跨区域内的多个可用性区域运行。

有关 Amazon EKS 托管节点的更多信息,请参阅创建托管节点组更新托管节点组

你还可以在 AWS Fargate 上运行 Kubernetes Pod。 Fargate 为容器提供按需、大小合适的计算容量。 有关如何将 Fargate 与 Amazon EKS 一起使用的更多信息,请参阅 AWS Fargate

卡彭特

Karpenter 是一个开源项目,旨在增强 Kubernetes 群集中的节点生命周期管理。 它根据 Pod 的特定计划需求自动预配和取消预配节点,从而实现高效的缩放和成本优化。 其主要功能包括:

  • 监视 Kubernetes 计划程序由于资源约束而无法计划的 Pod。
  • 评估不可计划 Pod 的计划要求(资源请求、节点选择器、相关性、容忍等)。
  • 预配满足这些 Pod 要求的新节点。
  • 不再需要节点时删除节点。

使用 Karpenter,可以定义 NodePools,其中包含节点预配的约束,例如污点、标签、要求(实例类型、区域等),以及对预配资源总量的限制。 部署工作负荷时,可以在 Pod 规范中指定各种计划约束,例如资源请求/限制、节点选择器、节点/Pod 相关性、容忍度和拓扑分布约束。 然后,Karpenter 会根据这些规范预配正确的大小节点。

在推出 Karpenter 之前,Amazon EKS 用户主要依赖于 Amazon EC2 自动缩放组Kubernetes 群集自动缩放程序(CAS) 来动态调整其群集的计算容量。 无需创建数十个节点组即可实现使用 Karpenter 获得的灵活性和多样性。 与 Kubernetes 群集自动缩放程序不同,Karpenter 与 Kubernetes 版本不一样紧密耦合,也不需要在 AWS 和 Kubernetes API 之间跳转。

Karpenter 在单个系统中整合实例业务流程责任,这更简单、更稳定且群集感知。 Karpenter 旨在通过提供简化的方法来克服群集自动缩放程序提出的一些挑战:

  • 根据工作负荷要求预配节点。
  • 使用灵活的 NodePool 选项按实例类型创建不同的节点配置。 Karpenter 可以让你使用单个灵活的 NodePool 管理不同的工作负荷容量,而不是管理许多特定的自定义节点组。
  • 通过快速启动节点和计划 Pod,大规模实现改进的 Pod 计划。

有关使用 Karpenter 的信息和文档,请访问 karpenter.sh 网站。

Karpenter 使缩放管理更接近 Kubernetes 本机 API,而不是 自动缩放组(ASG)和 托管节点组(MNG)。 ASG 和 MNG 是基于 AWS 级别指标(例如 EC2 CPU 负载)触发缩放的 AWS 原生抽象。 群集自动缩放程序 将 Kubernetes 抽象桥接到 AWS 抽象中,但由于此原因而失去了一些灵活性,例如计划特定可用性区域。

Karpenter 删除了一层 AWS 抽象,以便将一些灵活性直接引入 Kubernetes。 Karpenter 最适合用于遇到高、尖顶需求或具有不同计算要求的工作负荷的群集。 MNG 和 ASG 适用于运行工作负荷的群集,这些工作负荷往往更静态且一致。 可以根据要求使用动态和静态托管节点的组合。

Kata 容器

Kata 容器 是一个开源项目,它提供一个安全的容器运行时,它将容器的轻量性质与虚拟机的安全优势相结合。 它通过使用不同的来宾操作系统启动每个容器来应对更强大的工作负荷隔离和安全性的需求,这不同于在工作负载之间共享同一 Linux 内核的传统容器。 Kata 容器在符合 OCI 的虚拟机中运行容器,在同一主机上的容器之间提供严格的隔离。 Kata 容器 提供以下功能:

  • 增强型工作负荷隔离:每个容器在其自己的轻型 VM 中运行,确保硬件级别的隔离。
  • 改进了安全性:使用 VM 技术可提供额外的安全层,从而减少容器中断的风险。
  • 与行业标准的兼容性:Kata 容器与行业标准工具(如 OCI 容器格式和 Kubernetes CRI 接口)集成。
  • 支持多个体系结构和虚拟机监控程序:Kata 容器支持 AMD64 和 ARM 体系结构,并可用于虚拟机监控程序(如 Cloud-Hypervisor 和鞭炮)。
  • 轻松部署和管理:Kata 容器利用 Kubernetes 业务流程系统抽象化协调工作负荷的复杂性。

AWS 客户可以通过配置 Amazon Elastic Kubernetes 服务(EKS) 群集来设置和运行 AWS 上的 片容器,以使用 Firecracker(Amazon 开发的开源虚拟化技术)来创建和管理安全的多租户容器和基于功能的服务。 鞭炮使客户能够在轻型虚拟机(称为 microVM)中部署工作负载,从而在传统虚拟机上提供增强的安全性和工作负载隔离,同时提高容器的速度和资源效率。 在 AWS EKS 上启用 Kata 容器需要一系列手动步骤,使用 Kata 容器增强 Kubernetes 工作负载隔离和安全性。

专用主机

使用 Amazon Elastic Kubernetes 服务 (EKS) 部署和运行容器时,可以在 Amazon EC2 专用主机上运行它们。 但是,请务必注意,此功能仅适用于自管理节点组。 这意味着客户需要手动创建 启动模板自动缩放组,并将其注册到 EKS 群集。 这些资源的创建过程与常规 EC2 自动缩放的过程相同。

有关使用 AWS EKS 在 EC2 专用主机上运行容器的更多详细信息,请参阅以下文档:

AKS 节点和节点池

创建 AKS 群集会自动创建和配置控制平面,该控制平面提供核心 Kubernetes 服务和应用程序工作负载编排。 Azure 平台免费提供 AKS 控制平面作为托管 Azure 资源。 控制平面及其资源仅存在于创建群集的区域。

节点,也称为代理节点工作器节点,承载工作负载和应用程序。 在 AKS 中,客户完全管理附加到 AKS 群集的代理节点并为其付费。

要运行应用程序和支持服务,AKS 群集需要至少一个节点:一个 Azure 虚拟机 (VM) 来运行 Kubernetes 节点组件和容器运行时。 每个 AKS 群集必须至少包含一个系统节点池,该池至少包含一个节点。

AKS 会将具有相同配置的节点分组到运行 AKS 工作负载的 VM 的节点池中。 系统节点池主要用于托管关键系统 Pod(例如 CoreDNS)。 用户节点池主要用于承载工作负载 Pod。 如果你希望 AKS 群集中只有一个节点池,例如在开发环境中,你可以在系统节点池中计划应用程序 pod。

显示单个 Kubernetes 节点的图表。

你还可以创建多个用户节点池来隔离不同节点上的不同工作负载,以避免邻居干扰问题,或者支持具有不同计算或存储需求的应用程序。

系统或用户节点池的每个代理节点都是作为 Azure 虚拟机规模集的一部分预配并由 AKS 群集管理的 VM。 有关更多信息,请参阅节点和节点池

你可以在创建 AKS 群集或将新节点和节点池添加到现有 AKS 群集时定义工作程序节点的初始数量和大小。 如果未指定 VM 大小,则默认大小为 Standard_D2s_v3(适用于 Windows 节点池)和 Standard_DS2_v2(适用于 Linux 节点池)。

重要

要为节点内调用和与平台服务的通信提供更好的延迟,请选择支持加速网络的 VM 系列。

节点池创建

你可以使用 Azure 门户、Azure CLIAKS REST API 或基础架构即代码 (IaC) 工具(如 BicepAzure 资源管理器模板Terraform)将节点池添加到新的或现有的 AKS 群集。 有关如何将节点池添加到现有 AKS 群集的详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 中为群集创建和管理多个节点池

创建新节点池时,会在节点资源组中创建关联的虚拟机规模集,这是一个包含 AKS 群集的所有基础结构资源的 Azure 资源组。 这些资源包括 Kubernetes 节点、虚拟网络资源、托管标识和存储。

默认情况下,节点资源组使用类似于 MC_<resourcegroupname>_<clustername>_<location> 的名称。 AKS 会在删除群集时自动删除节点资源组,因此你应该仅将此资源组用于共享群集生命周期的资源。

添加节点池

以下代码示例使用 Azure CLI az aks nodepool add 命令将具有三个节点的名为 mynodepool 的节点池添加到 myAKSCluster 资源组中名为 myResourceGroup 的现有 AKS 群集。

az aks nodepool add \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --node-vm-size Standard_D8ds_v4 \
      --name mynodepool \
      --node-count 3

现成节点池

现成节点池是现成虚拟机规模集支持的节点池。 将现成虚拟机用于具有 AKS群集的节点可以利用未使用的 Azure 容量,从而显着节省成本。 可用的未用容量因很多因素而异,包括节点大小、区域、时间等。

部署现成节点池时,如果有可用的容量,Azure 将分配现成节点。 但现成节点没有服务级别协议 (SLA)。 支持现成节点池的现成规模集部署在单个容错域中,不提供高可用性保证。 当 Azure 需要恢复容量时,Azure 基础架构会逐出现成节点,并且你最多会在逐出前 30 秒收到通知。 请注意,现成节点池不能是群集的默认节点池。 现成节点池只能用于辅助池。

现成节点非常适用于可处理中断、提前终止或逐出的工作负载。 例如,批处理作业、开发和测试环境以及大型计算工作负载是在现成节点池上调度的理想选择。 有关更多详细信息,请参阅现成实例的限制

以下 az aks nodepool add 命令将一个点节点池添加到启用了自动缩放的现有群集。

  az aks nodepool add \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name myspotnodepool \
      --node-vm-size Standard_D8ds_v4 \
      --priority Spot \
      --eviction-policy Delete \
      --spot-max-price -1 \
      --enable-cluster-autoscaler \
      --min-count 1 \
      --max-count 3 \
      --no-wait

有关现成节点池的详细信息,请参阅向 Azure Kubernetes 服务 (AKS)群集添加现成节点池

临时 OS 磁盘

默认情况下,Azure 会自动将虚拟机操作系统 (OS) 磁盘复制到 Azure 存储,以避免在 VM 需要重定位到另一台主机时丢失数据。 但由于容器并非旨在持久保存本地状态,因此将 OS 磁盘保存在存储中对 AKS 的价值有限。 有一些缺点,例如节点预配较慢,读/写延迟较高。

相比之下,临时 OS 磁盘仅存储在主机上,就像临时磁盘一样,提供更低的读/写延迟和更快的节点扩展和群集升级。 与临时磁盘一样,临时 OS 磁盘包含在 VM 价格中,因此不会产生额外的存储成本。

重要

如果你不显式请求用于 OS 的托管磁盘,则在可能的情况下,AKS 会针对给定的节点池配置默认使用临时 OS。

要使用临时 OS,OS 磁盘必须适合 VM 缓存。 Azure VM 文档在 IO 吞吐量旁边的括号中将 VM 缓存大小显示以吉比字节 (GiB) 为单位的缓存大小

例如,具有默认 100 GB OS 磁盘大小的 AKS 默认 Standard_DS2_v2 VM 大小支持临时 OS,但缓存大小只有 86 GB。 如果你未明确指定,则此配置默认为托管磁盘。 如果明确要求此大小的临时 OS,则会收到验证错误。

如果你请求具有 60 GB OS 磁盘的相同 Standard_DS2_v2 VM,则默认情况下会获得临时 OS。 请求的 60 GB OS 大小小于最大 86 GB 缓存大小。

具有 100 GB OS 磁盘的 Standard_D8s_v3 支持临时 OS 并具有 200 GB 缓存空间。 如果用户未指定 OS 磁盘类型,则节点池默认获取临时 OS。

以下 az aks nodepool add 命令显示如何将新节点池添加到具有临时 OS 磁盘的现有群集。 --node-osdisk-type 参数将 OS 磁盘类型设置为 Ephemeral--node-osdisk-size 参数定义 OS 磁盘大小。

  az aks nodepool add \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name mynewnodepool \
      --node-vm-size Standard_D8ds_v4 \
      --node-osdisk-type Ephemeral \
      --node-osdisk-size 48

有关临时 OS 磁盘的更多信息,请参阅临时 OS

Azure Kubernetes 服务中的虚拟机节点池 (AKS)

EKS 中的每个 托管节点组都由由 Amazon EKS 管理的 Amazon EC2 自动缩放组提供支持。 此集成允许 EKS 自动处理节点组中 EC2 实例的预配和缩放。 虽然自动缩放组可配置为支持多个 EC2 实例类型,但它们不提供指定为每个实例类型创建或缩放的节点数的功能。 相反,EKS 会根据用户定义的所需配置和策略来管理节点组的缩放。 这可确保节点组的简化和自动化管理过程,同时提供选择符合工作负荷要求的 EC2 实例类型的灵活性。 但是,AWS 客户可以使用 或 AWS 管理控制台启动 eksctl

使用 虚拟机节点池,Azure Kubernetes 服务(AKS)管理每个代理节点的预配和引导。 对于虚拟机规模集节点池,AKS 管理虚拟机规模集的模型,并使用它来实现节点池中所有代理节点的一致性。 相反,虚拟机节点池允许使用最适合单个工作负荷的虚拟机来协调群集,并指定为每个虚拟机大小创建或缩放的节点数。

节点池由一组虚拟机组成,其中指定了不同的大小(SKU),以支持不同类型的工作负荷。 这些虚拟机大小(称为 SKU)分为针对特定用途进行优化的不同系列。 有关 VM SKU 的详细信息,请参阅 VM SKU 概述

若要启用多个虚拟机大小的缩放,虚拟机节点池类型使用 ScaleProfile 来配置节点池缩放方式,特别是所需的虚拟机大小和计数列表。 ManualScaleProfile 是一个缩放配置文件,用于指定所需的虚拟机大小和计数。 ManualScaleProfile中只允许一个虚拟机大小。 需要为节点池中的每个虚拟机大小创建单独的 ManualScaleProfile

创建新的虚拟机节点池时,ManualScaleProfile中至少需要一个 ScaleProfile。 可以为单个虚拟机节点池创建多个手动缩放配置文件。

虚拟机节点池的优点包括:

  • 灵活性:可以更新节点规范以满足工作负荷和需求。
  • 微调的控制:单节点级控件允许指定和混合不同规范的节点以提高一致性。
  • 效率:可以减少群集的节点占用,从而简化操作要求。

虚拟机节点池为动态工作负荷和高可用性要求提供更好的体验。 它们允许在一个节点池中设置同一系列的多个虚拟机,工作负荷会自动安排在配置的可用资源上。

下表将虚拟机节点池与标准 规模集 节点池进行比较。

节点池类型 能力
虚拟机节点池 可以在节点池中添加、删除或更新节点。 虚拟机类型可以是同一系列类型的任何虚拟机(例如 D 系列、A 系列等)。
基于虚拟机规模集的节点池 可以在节点池中添加或删除大小相同的节点和类型。 如果将新的虚拟机大小添加到群集,则需要创建新的节点池。

虚拟机节点池具有以下限制:

  • 不支持 群集自动缩放程序
  • InfiniBand 不可用。
  • 不支持 Windows 节点池。
  • 此功能在 Azure 门户中不可用。 使用 Azure CLI 或 REST API 执行 CRUD 操作或管理池。
  • 不支持 节点池快照
  • 在节点池中选择的所有 VM 大小都必须来自同一个虚拟机系列。 例如,不能将 N 系列虚拟机类型与同一节点池中的 D 系列虚拟机类型混合使用。
  • 虚拟机节点池允许每个节点池最多五个不同的虚拟机大小。

虚拟节点

可以使用虚拟节点在 AKS 群集中快速扩展应用程序工作负载。 虚拟节点为你提供快速的 Pod 配置,并且你只需为执行时间支付每秒费用。 无需等待群集自动扩缩器部署新的工作节点来运行更多的 Pod 副本。 只有 Linux Pod 和节点支持虚拟节点。 AKS 的虚拟节点加载项基于开源虚拟 Kubelet 项目。

虚拟节点功能取决于 Azure 容器实例。 有关虚拟节点的详细信息,请参阅创建和配置 Azure Kubernetes 服务 (AKS) 群集以使用虚拟节点

污点、标签和标记

创建节点池时,可以将 Kubernetes 污点标签以及 Azure 标记添加到该节点池。 添加排斥、标签或标记时,该节点池中的所有节点会获取该排斥、标签或标记。

要创建带有污点的节点池,可以使用带有 az aks nodepool add 参数的 --node-taints 命令。 要标记节点池中的节点,可以使用 --labels 参数并指定标签列表,如以下代码所示:

  az aks nodepool add \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name mynodepool \
      --node-vm-size Standard_NC6 \
      --node-taints sku=gpu:NoSchedule \
      --labels dept=IT costcenter=9999

有关详细信息,请参阅为节点池指定排斥、标签或标记

保留的系统标签

Amazon EKS 向托管节点组(如用于指定容量类型的 eks.amazonaws.com/capacityType)中的所有节点添加自动 Kubernetes 标签。 AKS 还会自动将系统标签添加到代理节点。

以下前缀保留供 AKS 使用,不能用于任何节点:

  • kubernetes.azure.com/
  • kubernetes.io/

有关其他预留前缀,请参阅 Kubernetes 的已知标签、注释和排斥

下表列出了保留供 AKS 使用且不能用于任何节点的标签。 在表中,虚拟节点使用情况列指定虚拟节点上是否支持标签。

虚拟节点使用情况列中:

  • 不适用表示该属性不适用于虚拟节点,因为它需要修改主机。
  • 相同意味着虚拟节点池的预期值与标准节点池的预期值相同。
  • 虚拟取代了 VM SKU 值,因为虚拟节点 pod 不公开任何底层 VM。
  • 虚拟节点版本是指虚拟 Kubelet-ACI 连接器的当前版本。
  • 虚拟节点子网名称是将虚拟节点 Pod 部署到 Azure 容器实例的子网。
  • 虚拟节点虚拟网络是包含虚拟节点子网的虚拟网络。
Label Value 示例,选项 虚拟节点用途
kubernetes.azure.com/agentpool <agent pool name> nodepool1 相同
kubernetes.io/arch amd64 runtime.GOARCH 空值
kubernetes.io/os <OS Type> LinuxWindows Linux
node.kubernetes.io/instance-type <VM size> Standard_NC6 Virtual
topology.kubernetes.io/region <Azure region> westus2 相同
topology.kubernetes.io/zone <Azure zone> 0 相同
kubernetes.azure.com/cluster <MC_RgName> MC_aks_myAKSCluster_westus2 相同
kubernetes.azure.com/mode <mode> UserSystem User
kubernetes.azure.com/role agent Agent 相同
kubernetes.azure.com/scalesetpriority <scale set priority> SpotRegular 空值
kubernetes.io/hostname <hostname> aks-nodepool-00000000-vmss000000 相同
kubernetes.azure.com/storageprofile <OS disk storage profile> Managed 空值
kubernetes.azure.com/storagetier <OS disk storage tier> Premium_LRS 空值
kubernetes.azure.com/instance-sku <SKU family> Standard_N Virtual
kubernetes.azure.com/node-image-version <VHD version> AKSUbuntu-1804-2020.03.05 虚拟节点版本
kubernetes.azure.com/subnet <nodepool subnet name> subnetName 虚拟节点子网名称
kubernetes.azure.com/vnet <nodepool virtual network name> vnetName 虚拟节点虚拟网络
kubernetes.azure.com/ppg <nodepool ppg name> ppgName 空值
kubernetes.azure.com/encrypted-set <nodepool encrypted-set name> encrypted-set-name 空值
kubernetes.azure.com/accelerator <accelerator> Nvidia 空值
kubernetes.azure.com/fips_enabled <fips enabled> True 空值
kubernetes.azure.com/os-sku <os/sku> 请参阅创建或更新 OS SKU Linux SKU

Windows 节点池

AKS 支持通过 Azure 容器网络接口 (CNI) 网络插件来创建和使用 Windows Server 容器节点池。 要规划所需的子网范围和网络注意事项,请参阅配置 Azure CNI 网络

以下 az aks nodepool add 命令添加运行 Windows Server 容器的节点池。

  az aks nodepool add \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name mywindowsnodepool \
      --node-vm-size Standard_D8ds_v4 \
      --os-type Windows \
      --node-count 1

上述命令使用 AKS 群集虚拟网络中的默认子网。 有关如何使用 Windows 节点池生成 AKS 群集的详细信息,请参阅 在 AKS 中创建 Windows Server 容器

节点池注意事项

创建和管理节点池和多个节点池时,以下注意事项和限制适用:

  • 配额、VM 大小限制和区域可用性适用于 AKS 节点池。
  • 系统池必须至少包含一个节点。 如果你在 AKS 群集中有另一个可取代它的系统节点池,则可以删除系统节点池。 用户节点池可以包含零个或多个节点。
  • 创建节点池后,无法更改其 VM 大小。
  • 对于多个节点池,AKS 群集必须使用标准 SKU 负载平衡器。 基本 SKU 负载平衡器不支持多个节点池。
  • 所有群集节点池必须位于同一虚拟网络中,并且分配给任何节点池的所有子网必须位于同一虚拟网络中。
  • 如果你在群集创建时创建多个节点池,则所有节点池的 Kubernetes 版本必须与控制平面版本匹配。 在群集已经通过按节点池操作预配后,你便可以更新版本。

节点池缩放

随着应用程序工作负载的变化,可能需要更改节点池中的节点数。 可以使用 az aks nodepool scale 命令手动增加或减少节点数。 以下示例将 mynodepool 中的节点数缩减为 5:

az aks nodepool scale \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name mynodepool \
    --node-count 5

使用群集自动缩放器自动缩放节点池

AKS 支持使用群集自动缩放器自动缩放节点池。 你在每个节点池上启用此功能,并定义最小和最大节点数。

以下 az aks nodepool add 命令将名为 mynodepool 的新节点池添加到现有群集。 --enable-cluster-autoscaler 参数在新节点池上启用群集自动缩放器,而 --min-count--max-count 参数分别指定池中的最小和最大节点数。

  az aks nodepool add \
  --resource-group myResourceGroup \
  --cluster-name myAKSCluster \
  --name mynewnodepool \
  --node-vm-size Standard_D8ds_v4 \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 5

以下 az aks nodepool update 命令将 mynewnodepool 节点池的最小节点数从 1 个更新为 3 个。

  az aks nodepool update \
  --resource-group myResourceGroup \
  --cluster-name myAKSCluster \
  --name mynewnodepool \
  --update-cluster-autoscaler \
  --min-count 1 \
  --max-count 3

可以使用 az aks nodepool update 并传递 --disable-cluster-autoscaler 参数来禁用群集自动缩放器。

  az aks nodepool update \
  --resource-group myResourceGroup \
  --cluster-name myAKSCluster \
  --name mynodepool \
  --disable-cluster-autoscaler

要在现有群集上重新启用群集自动缩放器,请使用 az aks nodepool update 并指定 --enable-cluster-autoscaler--min-count--max-count 参数。

有关如何将群集自动缩放器用于单个节点池的详细信息,请参阅自动缩放群集以满足 Azure Kubernetes 服务 (AKS) 上的应用程序需求

Pod 沙盒

AKS 客户可以通过完全托管的方式轻松地在 AKS 上设置和运行 Kata 容器。 这是通过使用 Pod 沙盒实现的,该功能在容器应用程序与容器主机的共享内核和计算资源之间创建隔离边界。

AKS 包括一种称为 Pod 沙盒 的机制,该机制在容器应用程序与容器主机的共享内核和计算资源(例如 CPU、内存和网络)之间提供隔离边界。 Pod 沙盒补充了其他安全措施或数据保护控制,以帮助租户工作负载保护敏感信息,并满足法规、行业或治理合规性要求,例如支付卡行业数据安全标准(PCI DSS)、国际标准化组织(ISO)27001 和健康保险可移植性和责任法案(HIPAA)。

通过在单独的群集或节点池上部署应用程序,可以强烈隔离不同团队或客户的租户工作负荷。 使用多个群集和节点池可能适用于许多组织和 SaaS 解决方案的隔离要求,但在某些情况下,具有共享 VM 节点池的单个群集效率更高。 例如,在同一节点上运行不受信任且受信任的 Pod 或在同一节点上共置 DaemonSet 和特权容器,以便更快地进行本地通信和功能分组时,可以使用单个群集。 Pod 沙盒 可帮助在相同的群集节点上强隔离租户应用程序,而无需在单独的群集或节点池中运行这些工作负荷。 其他方法要求重新编译代码或导致其他兼容性问题,但 AKS 中的 Pod 沙盒可以在增强的安全 VM 边界内运行未修改的任何容器。

AKS 上的 Pod 沙盒基于在 AKS 堆栈的 Azure Linux 容器主机上运行的 Kata 容器,以提供硬件强制隔离。 AKS 上的 Kata 容器基于安全强化的 Azure 虚拟机监控程序构建。 它通过利用父 VM 节点中的资源的嵌套轻型 Kata VM 实现每个 Pod 的隔离。 在此模型中,每个 Kata Pod 在嵌套的 Kata 来宾 VM 中获取其自己的内核。 使用此模型可将许多 Kata 容器放置在单个来宾 VM 中,同时继续在父 VM 中运行容器。 此模型在共享 AKS 群集中提供强隔离边界。

有关详细信息,请参阅:

Azure 专用主机

Azure 专用主机 是一项服务,该服务提供专用于单个 Azure 订阅的物理服务器,并在物理服务器级别提供硬件隔离。 可以在区域、可用性区域和容错域中预配这些专用主机,并且可以将 VM 直接置于预配的主机中。

将 Azure 专用主机与 AKS 配合使用有几个好处,包括:

  • 硬件隔离可确保没有其他 VM 放置在专用主机上,这为租户工作负荷提供额外的隔离层。 专用主机部署在同一数据中心,共享与其他非隔离主机相同的网络和底层存储基础结构。
  • Azure 专用主机提供对 Azure 平台启动的维护事件的控制。 可以选择维护时段来减少对服务的影响,并帮助确保租户工作负荷的可用性和隐私。

Azure 专用主机可以帮助 SaaS 提供商确保租户应用程序满足保护敏感信息的法规、行业和治理合规性要求。 有关详细信息,请参阅 将 Azure 专用主机添加到 AKS 群集

卡彭特

Karpenter 是为 Kubernetes 构建的开源节点生命周期管理项目。 将 Karpenter 添加到 Kubernetes 群集可以提高在该群集上运行工作负荷的效率和成本。 Karpenter 监视 Kubernetes 计划程序标记为不可安排的 Pod。 它还动态预配和管理可满足 Pod 要求的节点。

Karpenter 提供对托管群集中的节点预配和工作负荷放置的精细控制。 此控制通过优化资源分配、确保每个租户的应用程序之间的隔离以及降低运营成本来提高多租户。 在 AKS 上构建多租户解决方案时,Karpenter 提供了有用的功能来帮助管理不同的应用程序要求以支持不同的租户。 例如,可能需要一些租户的应用程序在 GPU 优化节点池上运行,而另一些应用程序在内存优化节点池上运行。 如果应用程序需要较低的存储延迟,则可以使用 Karpenter 来指示 Pod 需要在特定可用性区域中运行的节点,以便可以并置存储和应用程序层。

AKS 通过 Karpenter 在 AKS 群集上启用节点自动预配。 大多数用户应使用节点自动预配模式来启用 Karpenter 作为托管加载项。 有关详细信息,请参阅 节点自动预配。 如果需要更高级的自定义,可以选择自承载 Karpenter。 有关详细信息,请参阅 AKS Karpenter 提供程序

机密 VM

机密计算是一项安全措施,旨在通过软件或硬件辅助隔离和加密来保护数据。 这项技术为传统方法增加了额外的安全层,保护静态数据和传输中的数据。

AWS 平台通过 Nitro Enclaves支持机密计算,这些实例在 EC2 实例以及 Amazon Elastic Kubernetes 服务(EKS)上提供。 有关详细信息,请参阅此 文章 Amazon 文档。 此外,Amazon EC2 实例还支持 AMD SEV-SNP。 此 GitHub 存储库 提供了用于为 EKS 生成和部署 Amazon Machine Image (AMI) 的项目,AMD SEV-SNP 支持。

另一方面,Azure 为客户提供机密 VM,以满足 AKS 群集中的严格隔离、隐私和安全要求。 这些机密 VM 使用基于硬件的 受信任的执行环境。 具体而言,Azure 机密 VM 使用 AMD Secure Encrypted Virtualization - Secure Nested Paging (SEV-SNP) 技术,从而拒绝虚拟机监控程序和其他主机管理代码访问 VM 内存和状态。 这增加了额外的防御和保护,防止操作员访问。 有关更多详细信息,请参阅有关在 AKS 群集中使用机密 VM 的文档 以及 Azure 中机密 VM 的概述。

联邦信息流程标准(FIPS)

FIPS 140-3 是美国政府标准,定义了信息技术产品和系统中加密模块的最低安全要求。 通过为 AKS 节点池启用 FIPS 符合性,可以增强租户工作负荷的隔离、隐私和安全性。 FIPS 符合性可确保使用经过验证的加密模块进行加密、哈希处理和其他与安全相关的操作。 使用启用了 FIPS 的 AKS 节点池,可以通过采用可靠的加密算法和机制来满足法规和行业符合性要求。 Azure 提供了有关如何为 AKS 节点池启用 FIPS 的文档,使你能够增强多租户 AKS 环境的安全态势。 有关详细信息,请参阅 为 AKS 节点池启用 FIPS

基于主机的加密

在 EKS 中,体系结构可能已利用以下功能来增强数据安全性:

AKS 上的基于主机的加密 进一步加强租户工作负荷隔离、隐私和安全性。 启用基于主机的加密时,AKS 会加密基础主机计算机上的静态数据,这有助于确保敏感租户信息不受未经授权的访问的保护。 启用端到端加密时,临时磁盘和临时 OS 磁盘使用平台管理的密钥静态加密。

在 AKS 中,OS 和数据磁盘默认使用服务器端加密和平台管理的密钥。 这些磁盘的缓存使用平台管理的密钥进行静态加密。 可以使用信封加密(也称为 包装)来指定自己的 密钥加密密钥 来加密 数据保护密钥。 OS 和数据磁盘的缓存也通过指定的 BYOK 进行加密。

基于主机的加密为多租户环境增加了一层安全性。 OS 和数据磁盘缓存中的每个租户数据都使用客户管理的或平台管理的密钥(具体取决于所选磁盘加密类型)进行静态加密。 有关详细信息,请参阅:

更新和升级

Azure 会定期更新其 VM 承载平台,以提高可靠性、性能和安全性。 此类更新包括修补宿主环境中的软件组件、升级网络组件或将硬件解除授权等。 有关 Azure 如何更新 VM 的详细信息,请参阅 Azure 中的虚拟机维护

VM 托管基础结构更新通常不会影响托管 VM,例如现有 AKS 群集的代理节点。 对于影响托管 VM 的更新,Azure 将在更新主机时暂停 VM 或将 VM 实时迁移到已更新的主机,以最大限度减少需要重新启动的情况。

如果更新需要重新启动,Azure 会提供通知和时间窗口,以便你可以在更新适合你时启动更新。 主机的自我维护窗口通常为 35 天,除非更新紧急。

可以使用计划内维护更新 VM,并可通过 Azure CLIPowerShellAzure 门户来管理计划内维护通知。 计划内维护会检测你是否在使用群集自动升级并在维护时段内自动安排升级。 有关计划内维护的详细信息,请参阅 az aks maintenanceconfiguration 命令和使用计划内维护来安排 Azure Kubernetes 服务 (AKS) 群集的维护时段

Kubernetes 升级

AKS 群集生命周期的一部分定期升级到最新的 Kubernetes 版本。 应用升级以获得最新的安全版本和功能非常重要。 要升级现有节点池 VM 的 Kubernetes 版本,你必须封锁和排空节点,并将它们替换为基于更新的 Kubernetes 磁盘映像的新节点。

默认情况下,AKS 会将升级配置为使用一个额外节点进行激增。 max-surge 设置的默认值 1 通过在封锁或耗尽现有应用程序之前创建一个额外的节点来替换旧版本的节点来最大限度地减少工作负载中断。 你可以自定义每个节点池的 max-surge 值,以便在升级速度和升级中断之间进行权衡。 增大 max-surge 值可以更快地完成升级过程,但 max-surge 的值增大可能会导致升级过程中断。

例如,max-surge 值为 100% 时,可以让升级过程尽可能快(通过将节点计数加倍),但也会导致节点池中的所有节点同时被耗尽。 你可能希望使用此高值进行测试,但对于生产节点池,将 max-surge 设置为 33% 会更好。

AKS 接受 max-surge 的整数值和百分比值。 整数值(例如 5)指示要激增五个额外的节点。 max-surge 的百分比值最小可以是 1%,最大可以是 100%,向上取整到最接近的节点数。 值为 50% 指示激增值为池中当前节点计数的一半。

在升级过程中,max-surge 值最小可以为 1,最大为节点池中的节点数。 你可以设置更大的值,但用于 max-surge 的最大节点数不会高于池中的节点数。

重要

对于升级操作,节点激增需要足够的订阅配额来满足请求的 max-surge 计数。 例如,一个群集有五个节点池,每个节点池有四个节点,总共有 20 个节点。 如果每个节点池的 max-surge 值为 50%,则你需要 10 个节点或 2 个节点乘以 5 个池的额外计算和 IP 配额才能完成升级。

如果使用 Azure 容器网络接口 (CNI),还要确保子网中有足够的 IP 来满足 AKS 的 CNI 要求

升级节点池

要查看可用的升级,请使用 az aks get-upgrades

az aks get-upgrades --resource-group <myResourceGroup> --name <myAKSCluster>

要查看节点池的状态,请使用 az aks nodepool list

  az aks nodepool list -g <myResourceGroup> --cluster-name <myAKSCluster>

以下命令使用 az aks nodepool upgrade 升级单个节点池。

  az aks nodepool upgrade \
      --resource-group <myResourceGroup> \
      --cluster-name <myAKSCluster> \
      --name <mynodepool> \
      --kubernetes-version <KUBERNETES_VERSION>

有关如何为群集控制平面和节点池升级 Kubernetes 版本的更多信息,请参阅:

升级注意事项

请注意在 AKS 群集中升级 Kubernetes 版本的这些最佳做法和注意事项。

  • 最好将 AKS 群集中的所有节点池升级到相同的 Kubernetes 版本。 az aks upgrade 的默认行为是升级所有节点池和控制平面。

  • 手动升级,或在你的群集上设置自动升级通道。 如果你使用计划内维护来修补 VM,自动升级也会在你指定的维护时段内启动。 有关详细信息,请参阅升级 Azure Kubernetes 服务 (AKS) 群集

  • 带有 az aks upgrade 标志的 --control-plane-only 命令仅升级群集控制平面,不会更改群集中的任何关联节点池。 要升级单个节点池,请在 az aks nodepool upgrade 命令中指定目标节点池和 Kubernetes 版本。

  • AKS 群集升级会触发节点的隔离和排空。 如果可用计算配额较低,则升级可能会失败。 有关增加配额的更多信息,请参阅增加区域 vCPU 配额

  • 根据需要配置 max-surge 参数,使用整数或百分比值。 对于生产节点池,请将 max-surge 设置为 33%。 更多信息,请参阅自定义节点激增升级

  • 升级使用 CNI 网络的 AKS 群集时,请确保子网有足够的可用私有 IP 地址用于 max-surge 设置创建的额外节点。 有关详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 中配置 Azure CNI 网络

  • 如果你的群集节点池跨越一个区域内的多个可用性区域,则升级过程可能会暂时导致不平衡的区域配置。 有关更多信息,请参阅跨多个可用性区域的节点池的特殊注意事项

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

其他参与者:

要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。

后续步骤