配置 AKS 群集

在创建 AKS 群集的过程中,你可能需要自定义群集配置来满足你的需求。 本文介绍了几个用于自定义 AKS 群集的选项。

OS 配置

AKS 支持 Ubuntu 22.04 作为具有 Kubernetes 1.25 及更高版本的群集的唯一节点操作系统(OS)。 也可以在为 Kubernetes 版本 1.24 及更低版本创建节点池时指定 Ubuntu 18.04。

AKS 支持 Windows Server 2022 作为具有 Kubernetes 1.25 及更高版本的群集中 Windows 节点池的默认操作系统(OS)。 也可以在为 Kubernetes 版本 1.32 及更低版本创建节点池时指定 Windows Server 2019。 Windows Server 2019 将在 Kubernetes 版本 1.32 生命周期结束 (EOL) 后停用,并且在将来的版本中不再受支持。 有关此停用的详细信息,请参阅 AKS 发行说明

容器运行时配置

容器运行时是在节点上执行容器和管理容器映像的软件。 运行时有助于抽掉系统调用或操作系统 (OS) 特定功能,以便在 Linux 或 Windows 上运行容器。 对于 Linux 节点池,containerd 用于 Kubernetes 1.19 及更高版本。 对于 Windows Server 2019 和 2022 节点池,containerd 已正式发布,并且是 Kubernetes 1.23 及更高版本中唯一的运行时选项。 截至 2023 年 5 月,Docker 已停用,并且不再受支持。 有关此停用的详细信息,请参阅 AKS 发行说明

Containerd 是一个符合 OCI(开放式容器计划)要求的核心容器运行时,该运行时提供在节点上执行容器和管理映像所需的最小功能集。 Containerd 在 2017 年 3 月被捐赠给云原生计算基金会 (CNCF)。 AKS 使用当前的 Moby(上游 Docker)版本,它是基于 containerd 构建的。

如果使用了基于 containerd 的节点和节点池,kubelet 会使用 CRI(容器运行时接口)插件直接与 containerd 通信,而不是与 dockershim 通信,这样,数据流中就没有额外的跃点(与 Docker CRI 实现相比)。 因此,你会看到 Pod 启动延迟情况得到改善,资源(CPU 和内存)使用量降低。

通过对 AKS 节点使用 containerd,可以改善 Pod 启动延迟情况,并降低容器运行时的节点资源消耗。 通过此新体系结构的这些改进使 kubelet 能够通过 CRI 插件直接与 containerd 通信。 在 Moby/docker 体系结构中,kubelet 在到达 containerd 之前会与 dockershim 和 docker 引擎通信,因此在数据流中具有额外的跃点。 有关 dockershim 的来源及其弃用的更多详细信息,请参阅 Dockershim 移除常见问题解答

Docker CRI 2

Containerd 适用于 AKS 中的每个 Kubernetes GA 版本和每个高于 v1.19 的较新的 Kubernetes 版本,并且支持所有 Kubernetes 和 AKS 功能。

重要

Linux 节点池基于 Kubernetes v1.19 或更高版本创建的群集默认对其容器运行时使用 containerd。 在早期受支持的 Kubernetes 版本上具有节点池的群集支持使用 Docker 作为其容器运行时。 将节点池 Kubernetes 版本更新为支持 containerd 的版本后,Linux 节点池将更新为 containerd

具有 Windows Server 2019 和 2022 节点池的 containerd 已正式发布,并且是 Kubernetes 1.23 及更高版本中唯一的容器运行时选项。 可以在 1.23 之前的版本上继续使用 Docker 节点池和群集,但自 2023 年 5 月起,Docker 不再受支持。 有关详细信息,请参阅使用 containerd 添加 Windows Server 节点池

强烈建议在将群集与支持 containerd 的 Kubernetes 版本结合用于节点池之前使用 containerd 来测试 AKS 节点池上的工作负载。

containerd 限制/差异

  • 对于 containerd,建议将 crictl 用作替换 CLI(而不是 Docker CLI),以便对 Kubernetes 节点上的 Pod、容器和容器映像进行故障排除。 有关 crictl 的详细信息,请参阅常规用法客户端配置选项

    • Containerd 不提供 Docker CLI 的完整功能。 它仅用于故障排除。
    • crictl 提供了一个对 Kubernetes 更友好的容器视图,其中包含了 Pod 等概念。
  • Containerd 使用标准化 cri 日志记录格式(不同于你当前从 Docker 的 JSON 驱动程序获取的内容)设置日志记录。 日志记录解决方案需要支持 cri 日志记录格式(例如,用于容器的 Azure Monitor

  • 你不能再访问 docker 引擎 /var/run/docker.sock 或使用 Docker-in-Docker (DinD)。

    • 如果目前从 Docker 引擎提取应用程序日志或监视数据,请改用容器见解。 AKS 不支持在可能导致不稳定的代理节点上运行任何带外命令。
    • 不建议使用前述方法生成映像并直接使用 Docker 引擎。 Kubernetes 并不能完全感知这些已使用的资源,并且这些方法会导致许多问题,如此处此处所述。
  • 生成映像 - 可以继续像往常一样使用当前的 Docker 生成工作流,除非是在 AKS 群集中生成映像。 在这种情况下,请考虑切换到建议的方法,以便使用 ACR 任务或更安全的群集中选项(如 Docker Buildx)来生成映像。

第 2 代虚拟机

Azure 支持第 2 代 (Gen2) 虚拟机 (VM)。 第 2 代 VM 支持第 1 代 VM (Gen1) 所不支持的某些关键特性。 这些特性包括更大的内存、Intel Software Guard Extensions (Intel SGX) 和虚拟化持久性内存 (vPMEM)。

第 2 代 VM 使用新的基于 UEFI 的启动体系结构,而不是使用第 1 代 VM 所用的基于 BIOS 的体系结构。 只有特定的 SKU 和大小支持第 2 代 VM。 查看受支持的大小列表,查看你的 SKU 是否支持或需要第 2 代。

此外,并非所有 VM 映像都支持 Gen2 VM。 在 AKS 上,Gen2 VM 使用 AKS Ubuntu 22.04 或 18.04 映像AKS Windows Server 2022 映像。 这些映像支持所有 Gen2 SKU 和大小。

Linux 支持第 2 代 VM。 只有 WS2022 支持 Windows 上的第 2 代 VM。

Windows 上的第 2 代虚拟机(预览版)

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

  • 只有 WS2022 支持 Windows 上的第 2 代 VM。
  • 第 2 代 VM 默认适用于版本高于或等于 Kubernetes 1.25 的 Windows 群集。
    • 如果你的 Kubernetes 版本高于 1.25,则只需设置 vm_size 即可获取第 2 代节点池。 如果在 os_sku 中定义 WS2019 第 1 代,则仍可以使用第 1 代。
    • 如果 Kubernetes 版本低于 1.25,则可以将 os_sku 设置为 WS2022 并将 vm_size 设置为第 2 代,以获取第 2 代节点池。

安装 aks-preview Azure CLI 扩展

  • 使用 az extension addaz extension update 命令安装或更新 aks-preview Azure CLI 扩展。

    # Install the aks-preview extension
    az extension add --name aks-preview
    
    # Update to the latest version of the aks-preview extension
    az extension update --name aks-preview
    

注册 AKSWindows2022Gen2Preview 功能标志

  1. 使用 az feature register 命令注册 AKSWindows2022Gen2Preview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "AKSWindows2022Gen2Preview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证状态。

    az feature show --namespace "Microsoft.ContainerService" --name "AKSWindows2022Gen2Preview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace "Microsoft.ContainerService"
    

添加具有第 2 代 VM 的 Windows 节点池

  • 使用 az aks nodepool add 命令在 Windows 上添加具有第 2 代 VM 的节点池。

    # Sample command
    az aks nodepool add --resource-group myResourceGroup --cluster-name myAKSCluster --name gen2np 
    --kubernetes-version 1.23.5 --node-vm-size Standard_D32_v4 --os-type Windows --os-sku Windows2022
    
    # Default command
    az aks nodepool add --resource-group myResourceGroup --cluster-name myAKSCluster --name gen2np --os-type Windows --kubernetes-version 1.23.5
    
  • 使用 az aks nodepool show 命令确定目前是在第 1 代还是第 2 代,并检查 nodeImageVersion 是否包含 gen2

    az aks nodepool show
    
  • 使用 az vm list 命令检查可用的第 2 代 VM 大小。

    az vm list -skus -l $region
    

有关详细信息,请参阅对 Azure 上的第 2 代 VM 的支持

默认 OS 磁盘大小调整

在创建新群集或向现有群集添加新节点池时,OS 磁盘大小默认由 vCPU 数确定。 vCPU 数基于 VM SKU,默认值如下表所示:

VM SKU 核心 (vCPU) 默认 OS 磁盘层 预配的 IOPS 预配吞吐量 (Mbps)
1 - 7 P10/128G 500 100
8 - 15 P15/256G 1100 125
16 - 63 P20/512G 2300 150
64+ P30/1024G 5000 200

重要

仅当不支持临时 OS 磁盘且未指定默认 OS 磁盘大小时,才在新的群集或节点池上使用默认 OS 磁盘大小调整。 默认 OS 磁盘大小可能会影响群集的性能或成本,无法在创建群集或节点池后更改 OS 磁盘大小。 此默认磁盘大小会影响 2022 年 7 月或之后创建的群集或节点池。

在新群集上使用临时 OS

配置群集,以便在创建群集时使用临时 OS 磁盘。 使用 --node-osdisk-type 参数将临时 OS 设置为新群集的 OS 磁盘类型。

az aks create --name myAKSCluster --resource-group myResourceGroup -s Standard_DS3_v2 --node-osdisk-type Ephemeral

若要使用通过网络附加的 OS 磁盘来创建常规群集,可以指定 --node-osdisk-type=Managed 参数。 还可以选择添加其他临时 OS 节点池,我们将在下一部分中介绍这些池。

在现有群集上使用临时 OS

配置新节点池,以使用临时 OS 磁盘。 使用 --node-osdisk-type 参数将 OS 磁盘类型设置为该节点池的 OS 磁盘类型。

az aks nodepool add --name ephemeral --cluster-name myAKSCluster --resource-group myResourceGroup -s Standard_DS3_v2 --node-osdisk-type Ephemeral

重要

如果使用临时 OS,可以部署不超过 VM 缓存大小的 VM 和实例映像。 在使用 AKS 的情况下,默认节点 OS 磁盘配置使用 128 GB,这意味着所需 VM 大小的缓存大于 128 GB。 默认 Standard_DS2_v2 的缓存大小为 86 GB,这是不够大的。 Standard_DS3_v2 的缓存大小为 172 GiB,这是足够大的。 还可以通过使用 --node-osdisk-size 来减小 OS 磁盘的默认大小。 AKS 映像的最小大小为 30 GB。

若要使用通过网络附加的 OS 磁盘来创建节点池,可以指定 --node-osdisk-type Managed

AKS 的 Azure Linux 容器主机

可以通过 Azure CLI 或 ARM 模板部署 Azure Linux 容器主机。

先决条件

  1. 需要安装和配置 Azure CLI 版本 2.44.1 或更高版本。 运行 az --version 以查找当前安装的版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  2. 如果尚未安装 kubectl,请使用 az aks install-cli 或按照上游说明通过 Azure CLI 安装它。

使用 Azure CLI 部署 Azure Linux AKS 群集

使用以下示例命令创建 Azure Linux 群集。

az group create --name AzureLinuxTest --location chinaeast2

az aks create --name testAzureLinuxCluster --resource-group AzureLinuxTest --os-sku AzureLinux --generate-ssh-keys

az aks get-credentials --resource-group AzureLinuxTest --name testAzureLinuxCluster

kubectl get pods --all-namespaces

使用 ARM 模板部署 Azure Linux AKS 群集

要将 Azure Linux 添加到现有 ARM 模板,需要进行以下更改:

  • "osSKU": "AzureLinux""mode": "System" 添加到 agentPoolProfiles 属性。
  • 将 apiVersion 设置为 2021-03-01 或更高版本:"apiVersion": "2021-03-01"

以下部署使用 ARM 模板 azurelinuxaksarm.json

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "parameters": {
    "clusterName": {
      "type": "string",
      "defaultValue": "azurelinuxakscluster",
      "metadata": {
        "description": "The name of the Managed Cluster resource."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location of the Managed Cluster resource."
      }
    },
    "dnsPrefix": {
      "type": "string",
      "defaultValue": "azurelinux",
      "metadata": {
        "description": "Optional DNS prefix to use with hosted Kubernetes API server FQDN."
      }
    },
    "osDiskSizeGB": {
      "type": "int",
      "defaultValue": 0,
      "minValue": 0,
      "maxValue": 1023,
      "metadata": {
        "description": "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 will apply the default disk size for that agentVMSize."
      }
    },
    "agentCount": {
      "type": "int",
      "defaultValue": 3,
      "minValue": 1,
      "maxValue": 50,
      "metadata": {
        "description": "The number of nodes for the cluster."
      }
    },
    "agentVMSize": {
      "type": "string",
      "defaultValue": "Standard_DS2_v2",
      "metadata": {
        "description": "The size of the Virtual Machine."
      }
    },
    "linuxAdminUsername": {
      "type": "string",
      "metadata": {
        "description": "User name for the Linux Virtual Machines."
      }
    },
    "sshRSAPublicKey": {
      "type": "string",
      "metadata": {
        "description": "Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example 'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm'"
      }
    },
    "osType": {
      "type": "string",
      "defaultValue": "Linux",
      "allowedValues": [
        "Linux"
      ],
      "metadata": {
        "description": "The type of operating system."
      }
    },
    "osSKU": {
      "type": "string",
      "defaultValue": "azurelinux",
      "allowedValues": [
        "AzureLinux",
        "Ubuntu",
      ],
      "metadata": {
        "description": "The Linux SKU to use."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.ContainerService/managedClusters",
      "apiVersion": "2021-03-01",
      "name": "[parameters('clusterName')]",
      "location": "[parameters('location')]",
      "properties": {
        "dnsPrefix": "[parameters('dnsPrefix')]",
        "agentPoolProfiles": [
          {
            "name": "agentpool",
            "mode": "System",
            "osDiskSizeGB": "[parameters('osDiskSizeGB')]",
            "count": "[parameters('agentCount')]",
            "vmSize": "[parameters('agentVMSize')]",
            "osType": "[parameters('osType')]",
            "osSKU": "[parameters('osSKU')]",
            "storageProfile": "ManagedDisks"
          }
        ],
        "linuxProfile": {
          "adminUsername": "[parameters('linuxAdminUsername')]",
          "ssh": {
            "publicKeys": [
              {
                "keyData": "[parameters('sshRSAPublicKey')]"
              }
            ]
          }
        }
      },
      "identity": {
          "type": "SystemAssigned"
      }
    }
  ],
  "outputs": {
    "controlPlaneFQDN": {
      "type": "string",
      "value": "[reference(parameters('clusterName')).fqdn]"
    }
  }
}

在系统上创建此文件,并包括 azurelinuxaksarm.json 文件中定义的设置。

az group create --name AzureLinuxTest --location chinaeast2

az deployment group create --resource-group AzureLinuxTest --template-file azurelinuxaksarm.json --parameters linuxAdminUsername=azureuser sshRSAPublicKey=`<contents of your id_rsa.pub>`

az aks get-credentials --resource-group AzureLinuxTest --name testAzureLinuxCluster

kubectl get pods --all-namespaces

使用 Terraform 部署 Azure Linux AKS 群集

要使用 Terraform 部署 Azure Linux 群集,首先需要将 azurerm 提供程序设置为 2.76 或更高版本。

required_providers {
  azurerm = {
    source = "hashicorp/azurerm"
    version = "~> 2.76"
  }
}

更新 azurerm 提供程序后,可以在 default_node_pool 中指定 AzureLinux os_sku

default_node_pool {
  name = "default"
  node_count = 2
  vm_size = "Standard_D2_v2"
  os_sku = "AzureLinux"
}

同样,可以在 azurerm_kubernetes_cluster_node_pool 中指定 AzureLinux os_sku

自定义资源组名称

在 Azure 中部署 Azure Kubernetes 服务群集时,它也会为工作器节点创建第二个资源组。 默认情况下,AKS 会将此节点资源组命名为 MC_resourcegroupname_clustername_location,但你可以指定自定义名称。

若要指定自定义资源组名称,请安装 aks-preview Azure CLI 扩展版本 0.3.2 或更高版本。 使用 Azure CLI 时,请添加 --node-resource-group 参数和 az aks create 命令,以为资源组指定自定义名称。 要使用 Azure 资源管理器模板部署 AKS 群集,可以使用 nodeResourceGroup 属性定义资源组名称。

az aks create --name myAKSCluster --resource-group myResourceGroup --node-resource-group myNodeResourceGroup

订阅中的 Azure 资源提供程序会自动创建辅助资源组。 只能在群集创建期间指定自定义资源组名称。

请注意,对于节点资源组,不能执行以下操作:

  • 不能为节点资源组指定现有资源组。
  • 为节点资源组指定不同的订阅。
  • 不能在创建群集后更改节点资源组名称。
  • 不能为节点资源组内的受管理资源指定名称。
  • 不能修改或删除节点资源组内受管理资源中由 Azure 创建的标记。

后续步骤