培训
模块
优化 Azure Kubernetes 服务 (AKS) 上的计算成本 - Training
了解可在 Azure 上采用哪些策略来通过使用 Azure Kubernetes 服务 (AKS) 优化云原生应用程序开发过程。
你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
将工作负载部署到 AKS 时,需要根据所需的 VM 大小决定节点池配置。 随着工作负载变得更加复杂,并且需要不同的 CPU、内存和功能才能运行,为大量资源请求设计 VM 配置的开销变得困难。
节点自动预配 (NAP)(预览版)根据待处理的 Pod 资源需求决定最佳 VM 配置,以最高效且最具成本效益的方式运行这些工作负载。
NAP 基于开源 Karpenter 项目,且 AKS 提供程序也为开源。 NAP 自动部署,并在 AKS 群集上配置和管理 Karpenter。
重要
AKS 的节点自动预配 (NAP) 当前提供预览版。 有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款。
aks-preview
Azure CLI 扩展。 最低版本 0.5.170。使用 az extension add
命令安装 aks-preview
CLI 扩展。
az extension add --name aks-preview
使用 az extension update
命令更新扩展,确保已安装最新版本。
az extension update --name aks-preview
使用 az feature register
命令注册 NodeAutoProvisioningPreview
功能标志。
az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
状态显示为“已注册”需要几分钟时间。
使用 az feature show
命令验证注册状态。
az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
当状态反映为已注册时,使用 az provider register
命令刷新 Microsoft.ContainerService 资源提供程序的注册。
az provider register --namespace Microsoft.ContainerService
备注
可以使用系统分配的或用户分配的托管标识。
使用 az aks create
命令在新群集上启用节点自动预配,并将 --node-provisioning-mode
设置为 Auto
。 还需要将 --network-plugin
设置为 azure
、--network-plugin-mode
设置为 overlay
,并将 --network-dataplane
设置为 cilium
。
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--node-provisioning-mode Auto \
--network-plugin azure \
--network-plugin-mode overlay \
--network-dataplane cilium \
--generate-ssh-keys
使用 az aks update
命令在现有群集上启用节点自动预配,并将 --node-provisioning-mode
设置为 Auto
。 还需要将 --network-plugin
设置为 azure
、--network-plugin-mode
设置为 overlay
,并将 --network-dataplane
设置为 cilium
。
az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium
节点自动预配使用一系列 VM SKU 作为起点,以决定哪个最适合处于挂起状态的工作负载。 通过控制初始池中所需的 SKU,可指定特定的 SKU 系列或 VM 类型,以及预配程序使用的最大资源量。
例如,如果你有作为预留实例的特定 VM SKU,则可能只希望将这些 VM 用作起始池。
你在群集中可以有多个节点池定义,但 AKS 部署你可修改的默认节点池定义:
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
name: default
spec:
disruption:
consolidationPolicy: WhenUnderutilized
expireAfter: Never
template:
spec:
nodeClassRef:
name: default
# Requirements that constrain the parameters of provisioned nodes.
# These requirements are combined with pod.spec.affinity.nodeAffinity rules.
# Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
requirements:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
- key: karpenter.sh/capacity-type
operator: In
values:
- on-demand
- key: karpenter.azure.com/sku-family
operator: In
values:
- D
选择器 | 说明 | 示例 |
---|---|---|
karpenter.azure.com/sku-family | VM SKU 系列 | D、F、L 等 |
karpenter.azure.com/sku-name | 显式 SKU 名称 | Standard_A1_v2 |
karpenter.azure.com/sku-version | SKU 版本(不含“v”,可使用 1) | 1、2 |
karpenter.sh/capacity-type | VM 分配类型(现成/按需) | 现成或按需 |
karpenter.azure.com/sku-cpu | VM 中的 CPU 数 | 16 |
karpenter.azure.com/sku-memory | VM 中的内存 (MiB) | 131072 |
karpenter.azure.com/sku-gpu-name | GPU 名称 | A100 |
karpenter.azure.com/sku-gpu-manufacturer | GPU 制造商 | nvidia |
karpenter.azure.com/sku-gpu-count | 每个 VM 的 GPU 计数 | 2 |
karpenter.azure.com/sku-networking-accelerated | VM 是否具有加速网络 | [true, false] |
karpenter.azure.com/sku-storage-premium-capable | VM 是否支持高级 IO 存储 | [true, false] |
karpenter.azure.com/sku-storage-ephemeralos-maxsize | 临时 OS 磁盘的大小限制 (Gb) | 92 |
topology.kubernetes.io/zone | 可用性区域 | [uksouth-1,uksouth-2,uksouth-3] |
kubernetes.io/os | 操作系统(预览期间仅 Linux) | Linux |
kubernetes.io/arch | CPU 体系结构(AMD64 或 ARM64) | [amd64, arm64] |
若要列出 VM SKU 功能和允许的值,请使用 Azure CLI 中的 vm list-skus
命令。
az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table
默认情况下,NAP 尝试在可用的 Azure 配额内计划工作负载。 还可以通过在节点池规范中指定限制,从而指定节点池使用的资源上限。
# Resource limits constrain the total size of the cluster.
# Limits prevent Karpenter from creating new instances once the limit is exceeded.
limits:
cpu: "1000"
memory: 1000Gi
定义多个节点池后,可以设置应安排工作负载的首选位置。 定义节点池定义的相对权重。
# Priority given to the node pool when the scheduler considers which to select. Higher weights indicate higher priority when comparing node pools.
# Specifying no weight is equivalent to specifying a weight of 0.
weight: 10
使用 NAP 的 AKS 默认管理 Kubernetes 版本升级和 VM OS 磁盘更新。
Kubernetes 对 NAP 节点池的升级遵循控制平面 Kubernetes 版本。 如果你执行群集升级,则 NAP 节点会自动更新,以遵循相同的版本控制。
默认情况下,当新映像可用时,NAP 节点池虚拟机自动更新。 如果希望将节点池固定在特定节点映像版本,可对节点类设置 imageVersion:
kubectl edit aksnodeclass default
在节点类定义中,将 imageVersion 设置为 AKS 发行说明中列出的已发布版本之一。 还可以通过引用 AKS 发布跟踪器来查看区域中映像的可用性
imageVersion 是节点映像上的日期部分,因为仅支持 Ubuntu 22.04,例如“AKSUbuntu-2204-202311.07.0”将为“202311.07.0”
apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
annotations:
kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
nodes
meta.helm.sh/release-name: aks-managed-karpenter-overlay
meta.helm.sh/release-namespace: kube-system
creationTimestamp: "2023-11-16T23:59:06Z"
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
name: default
resourceVersion: "1792"
uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
imageFamily: Ubuntu2204
imageVersion: 202311.07.0
osDiskSizeGB: 128
删除 imageVersion 规范会将要更新的节点池恢复为最新的节点映像版本。
当节点上的工作负载缩减时,NAP 使用节点池规范上的中断规则来确定何时以及如何删除这些节点,并可能重新计划工作负载以提高效率。
可使用 kubectl delete node
手动删除节点,但 NAP 还可控制它应何时优化节点。
disruption:
# Describes which types of Nodes NAP should consider for consolidation
consolidationPolicy: WhenUnderutilized | WhenEmpty
# 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost
# `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
# The amount of time NAP should wait after discovering a consolidation decision
# This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
# You can choose to disable consolidation entirely by setting the string value 'Never'
consolidateAfter: 30s
节点自动预配生成群集事件,这些事件可用于监视要做出的部署和计划决策。 可通过 Kubernetes 事件流查看事件。
kubectl get events -A --field-selector source=karpenter -w
培训
模块
优化 Azure Kubernetes 服务 (AKS) 上的计算成本 - Training
了解可在 Azure 上采用哪些策略来通过使用 Azure Kubernetes 服务 (AKS) 优化云原生应用程序开发过程。