适用于:✔️ AKS Automatic(预览版)
Azure Kubernetes 服务 (AKS) Automatic(预览版)为开发人员、DevOps 工程师和平台工程师提供最简单的托管 Kubernetes 体验。 AKS Automatic 可自动执行 AKS 群集设置和操作,并嵌入最佳做法配置,非常适合新式应用程序和 AI 应用程序。 任何技能级别的用户都可以从 AKS Automatic 对其应用程序的安全性、性能和可靠性中受益。
在此快速入门中,你将了解:
- 创建虚拟网络。
- 创建对虚拟网络具有权限的托管标识。
- 在虚拟网络中部署专用 AKS Automatic 群集。
- 运行一个示例多容器应用程序,其中的一组微服务和 Web 前端模拟零售场景。
在您开始之前
本快速入门假设读者基本了解 Kubernetes 的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念。
可以使用本地 Azure CLI。
如果需要,请安装 Azure CLI 来运行 CLI 参考命令。
本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI配合使用。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
- 本文需要 2.68 或更高版本的 Azure CLI。
- 本文需要 Azure CLI 扩展版本 3.0.0b13 或更高版本。
aks-preview
- 如果有多个 Azure 订阅,请选择相应的订阅 ID,其中应使用 az account set 命令对资源计费。
- 在 Azure 订阅中注册
AutomaticSKUPreview
功能。 - 创建群集的标识还应该拥有资源组的以下权限:
Microsoft.Authorization/policyAssignments/write
Microsoft.Authorization/policyAssignments/read
- 使用自定义虚拟网络的 AKS 自动群集仅支持用户分配的托管标识。
- 使用自定义虚拟网络的 AKS Automatic 群集不支持托管 NAT 网关出站类型。
- AKS Automatic 群集需要在至少支持 3 个可用性区域的 Azure 区域中部署。
- 若要部署 Bicep 文件,需要对所创建的资源拥有写入访问权限,并且需要对
Microsoft.Resources/deployments
资源类型上的所有操作拥有访问权限。 例如,若要创建虚拟机,需要Microsoft.Compute/virtualMachines/write
和Microsoft.Resources/deployments/*
权限。 有关角色和权限的列表,请参阅 Azure 内置角色。
将自定义虚拟网络与 AKS Automatic 配合使用时,必须创建 API 服务器子网并将其委托给 Microsoft.ContainerService/managedClusters
,该子网授予 AKS 服务将 API 服务器 Pod 和内部负载均衡器注入该子网的权限。 无法将该子网用于任何其他工作负载,但可将其用于同一虚拟网络中的多个 AKS 群集。 支持的最小 API 服务器子网大小为 /28。
群集标识需要在虚拟网络上拥有“网络参与者”权限。 缺少对 API 服务器子网的权限可能导致预配失败。 缺少虚拟网络的权限可能会导致节点自动预配缩放失败。
警告
AKS 群集在子网地址空间中保留至少 9 个 IP。 用尽 IP 地址可能会阻止 API 服务器缩放并导致 API 服务器中断。
重要
AKS Automatic 尝试根据订阅中可用的容量动态选择 system
节点池的虚拟机大小。 确保你的订阅在要部署群集的区域中具有以下任意大小的 16 个 vCPU 的配额:Standard_D4pds_v5、Standard_D4lds_v5、Standard_D4ads_v5、Standard_D4ds_v5、Standard_D4d_v5、Standard_D4d_v4、Standard_DS3_v2、Standard_DS12_v2。 可以通过 Azure 门户查看特定 VM 系列配额,并提交配额增加请求。
安装 aks-preview Azure CLI 扩展
重要
AKS 预览功能是可选择启用的自助功能。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
若要安装 aks-preview 扩展,请运行以下命令:
az extension add --name aks-preview
运行以下命令以更新到已发布的最新扩展版本:
az extension update --name aks-preview
注册功能标志
要在预览中使用 AKS Automatic,请使用 az feature register 命令注册以下标志。
az feature register --namespace Microsoft.ContainerService --name AutomaticSKUPreview
使用 az feature show 命令验证注册状态。 需要经过几分钟时间,状态才会显示为“已注册”:
az feature show --namespace Microsoft.ContainerService --name AutomaticSKUPreview
当状态显示“已注册”时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册:
az provider register --namespace Microsoft.ContainerService
定义变量
定义将在后续步骤中使用的以下变量。
RG_NAME=automatic-rg
VNET_NAME=automatic-vnet
CLUSTER_NAME=automatic
IDENTITY_NAME=automatic-uami
LOCATION=eastus
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
创建资源组
Azure 资源组是用于部署和管理 Azure 资源的逻辑组。
使用 az group create 命令创建资源组。
az group create -n ${RG_NAME} -l ${LOCATION}
以下示例输出类似于资源组成功创建:
{
"id": "/subscriptions/<guid>/resourceGroups/automatic-rg",
"location": "chinanorth3",
"managedBy": null,
"name": "automatic-rg",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
创建虚拟网络
使用 az network vnet create
命令创建虚拟网络。 使用 az network vnet subnet create
命令创建 API 服务器子网和群集子网。 API 子网需要委托给 Microsoft.ContainerService/managedClusters
。
az network vnet create --name ${VNET_NAME} --resource-group ${RG_NAME} --location ${LOCATION} --address-prefixes 172.19.0.0/16
az network vnet subnet create --resource-group ${RG_NAME} --vnet-name ${VNET_NAME} --name apiServerSubnet --delegations Microsoft.ContainerService/managedClusters --address-prefixes 172.19.0.0/28
az network vnet subnet create --resource-group ${RG_NAME} --vnet-name ${VNET_NAME} --name clusterSubnet --address-prefixes 172.19.1.0/24
默认情况下,允许虚拟网络中的所有流量。 但是,如果添加了网络安全组规则 (NSG) 来限制不同子网之间的流量,请确保 NSG 安全规则允许以下类型的通信:
目的地 | 来源 | 协议 | 港口 | 使用 |
---|---|---|---|---|
APIServer 子网 CIDR | 群集子网 | TCP | 443 和 4443 | 如需启用节点与 API 服务器之间的通信,则必须支持。 |
APIServer 子网 CIDR | Azure 负载均衡器 | TCP | 9988 | 如需启用 Azure 负载均衡器与 API 服务器之间的通信,则必须支持。 你还可以启用 Azure 负载均衡器与 API 服务器子网 CIDR 之间的所有通信。 |
创建托管标识并为其授予对虚拟网络的权限
使用 az identity create
命令创建托管标识并检索主体 ID。 使用 命令将虚拟网络上的“网络参与者”角色分配给托管标识。az role assignment create
az identity create --resource-group ${RG_NAME} --name ${IDENTITY_NAME} --location ${LOCATION}
IDENTITY_CLIENT_ID=$(az identity show --resource-group ${RG_NAME} --name ${IDENTITY_NAME} --query clientId -o tsv)
az role assignment create --scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}" --role "Network Contributor" --assignee ${IDENTITY_CLIENT_ID}
在自定义虚拟网络中创建专用 AKS Automatic 群集
要创建 AKS Automatic 群集,请使用 az aks create 命令。
az aks create --resource-group ${RG_NAME} --name ${CLUSTER_NAME} --location ${LOCATION} --apiserver-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/apiServerSubnet" --vnet-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/clusterSubnet" --assign-identity "/subscriptions/${SUBSCRIPTION_ID}/resourcegroups/${RG_NAME}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${IDENTITY_NAME}" --sku automatic --no-ssh-key
片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息。
连接至群集
若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 要在本地安装 kubectl
,请运行 az aks install-cli 命令。 AKS Automatic 群集通过用于 Kubernetes 基于角色的访问控制 (RBAC) 的 Microsoft Entra ID 进行配置。
使用 kubectl
命令将 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。
az aks get-credentials --resource-group ${RG_NAME} --name ${CLUSTER_NAME}
使用 kubectl get 命令验证与群集之间的连接。 此命令将返回群集节点的列表。
kubectl get nodes
以下示例输出展示了登录的要求。
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.
登录后,以下示例输出会显示托管系统节点池。 确保节点状态为“就绪”。
NAME STATUS ROLES AGE VERSION
aks-nodepool1-13213685-vmss000000 Ready agent 2m26s v1.28.5
aks-nodepool1-13213685-vmss000001 Ready agent 2m26s v1.28.5
aks-nodepool1-13213685-vmss000002 Ready agent 2m26s v1.28.5
创建资源组
Azure 资源组是用于部署和管理 Azure 资源的逻辑组。 创建资源组时,系统会提示你指定一个位置。 此位置是资源组元数据的存储位置,也是资源在 Azure 中运行的位置(如果你在创建资源期间未指定其他区域)。
使用 az group create 命令创建资源组。
az group create --name <resource-group> --location <location>
以下示例输出类似于资源组成功创建:
{
"id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
"location": "chinanorth3",
"managedBy": null,
"name": "myResourceGroup",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
创建虚拟网络
此 Bicep 文件定义了一个虚拟网络。
@description('The location of the managed cluster resource.')
param location string = resourceGroup().location
@description('The name of the virtual network.')
param vnetName string = 'aksAutomaticVnet'
@description('The address prefix of the virtual network.')
param addressPrefix string = '172.19.0.0/16'
@description('The name of the API server subnet.')
param apiServerSubnetName string = 'apiServerSubnet'
@description('The subnet prefix of the API server subnet.')
param apiServerSubnetPrefix string = '172.19.0.0/28'
@description('The name of the cluster subnet.')
param clusterSubnetName string = 'clusterSubnet'
@description('The subnet prefix of the cluster subnet.')
param clusterSubnetPrefix string = '172.19.1.0/24'
// Virtual network with an API server subnet and a cluster subnet
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-09-01' = {
name: vnetName
location: location
properties: {
addressSpace: {
addressPrefixes: [ addressPrefix ]
}
subnets: [
{
name: apiServerSubnetName
properties: {
addressPrefix: apiServerSubnetPrefix
}
}
{
name: clusterSubnetName
properties: {
addressPrefix: clusterSubnetPrefix
}
}
]
}
}
output apiServerSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, apiServerSubnetName)
output clusterSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, clusterSubnetName)
将 Bicep 文件“virtualNetwork.bicep”保存到本地计算机。
重要
该 Bicep 文件将 vnetName
参数设置为 aksAutomaticVnet,将 参数设置为 172.19.0.0/16,将 addressPrefix
参数设置为 172.19.0.0/28,将 参数设置为 172.19.1.0/24。apiServerSubnetPrefix
apiServerSubnetPrefix
如果你想使用不同的值,请确保将字符串更新为偏好的值。
使用 Azure CLI 部署 Bicep 文件。
az deployment group create --resource-group <resource-group> --template-file virtualNetwork.bicep
默认情况下,允许虚拟网络中的所有流量。 但是,如果添加了网络安全组规则 (NSG) 来限制不同子网之间的流量,请确保 NSG 安全规则允许以下类型的通信:
目的地 | 来源 | 协议 | 港口 | 使用 |
---|---|---|---|---|
APIServer 子网 CIDR | 群集子网 | TCP | 443 和 4443 | 如需启用节点与 API 服务器之间的通信,则必须支持。 |
APIServer 子网 CIDR | Azure 负载均衡器 | TCP | 9988 | 如需启用 Azure 负载均衡器与 API 服务器之间的通信,则必须支持。 你还可以启用 Azure 负载均衡器与 API 服务器子网 CIDR 之间的所有通信。 |
创建托管标识
此 Bicep 文件定义用户分配的托管标识。
param location string = resourceGroup().location
param uamiName string = 'aksAutomaticUAMI'
resource userAssignedManagedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
name: uamiName
location: location
}
output uamiId string = userAssignedManagedIdentity.id
output uamiPrincipalId string = userAssignedManagedIdentity.properties.principalId
output uamiClientId string = userAssignedManagedIdentity.properties.clientId
将 Bicep 文件 uami.bicep 保存到本地计算机。
重要
Bicep 文件将 uamiName
参数设置为 aksAutomaticUAMI。 如果你想使用不同的标识名称,请确保将字符串更新为偏好的名称。
使用 Azure CLI 部署 Bicep 文件。
az deployment group create --resource-group <resource-group> --template-file uami.bicep
分配对虚拟网络的网络参与者角色
此 Bicep 文件定义对虚拟网络的角色分配。
@description('The name of the virtual network.')
param vnetName string = 'aksAutomaticVnet'
@description('The principal ID of the user assigned managed identity.')
param uamiPrincipalId string
// Get a reference to the virtual network
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-09-01' existing ={
name: vnetName
}
// Assign the Network Contributor role to the user assigned managed identity on the virtual network
// '4d97b98b-1d4f-4787-a291-c67834d212e7' is the built-in Network Contributor role definition
// See: https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/networking#network-contributor
resource networkContributorRoleAssignmentToVirtualNetwork 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(uamiPrincipalId, '4d97b98b-1d4f-4787-a291-c67834d212e7', resourceGroup().id, virtualNetwork.name)
scope: virtualNetwork
properties: {
roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')
principalId: uamiPrincipalId
}
}
将 Bicep 文件 roleAssignments.bicep 保存到本地计算机。
重要
Bicep 文件将 vnetName
参数设置为 aksAutomaticVnet。 如果你使用其他虚拟网络名称,请确保将字符串更新为偏好的虚拟网络名称。
使用 Azure CLI 部署 Bicep 文件。 需要提供用户分配的标识的主体 ID。
az deployment group create --resource-group <resource-group> --template-file roleAssignments.bicep \
--parameters uamiPrincipalId=<user assigned identity prinicipal id>
在自定义虚拟网络中创建专用 AKS Automatic 群集
此 Bicep 文件会定义 AKS 自动群集。
@description('The name of the managed cluster resource.')
param clusterName string = 'aksAutomaticCluster'
@description('The location of the managed cluster resource.')
param location string = resourceGroup().location
@description('The resource ID of the API server subnet.')
param apiServerSubnetId string
@description('The resource ID of the cluster subnet.')
param clusterSubnetId string
@description('The resource ID of the user assigned managed identity.')
param uamiId string
/// Create the AKS Automatic cluster using the custom virtual network and user assigned managed identity
resource aks 'Microsoft.ContainerService/managedClusters@2024-03-02-preview' = {
name: clusterName
location: location
sku: {
name: 'Automatic'
}
properties: {
agentPoolProfiles: [
{
name: 'systempool'
mode: 'System'
count: 3
vnetSubnetID: clusterSubnetId
}
]
apiServerAccessProfile: {
subnetId: apiServerSubnetId
}
networkProfile: {
outboundType: 'loadBalancer'
}
}
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${uamiId}': {}
}
}
}
将 Bicep 文件 aks.bicep 保存到本地计算机。
重要
Bicep 文件将 clusterName
参数设置为 aksAutomaticCluster。 如果你想要其他群集名称,请确保将字符串更新为偏好的群集名称。
使用 Azure CLI 部署 Bicep 文件。 需要提供 API 服务器子网资源 ID、群集子网资源 ID 和用户分配的标识主体 ID。
az deployment group create --resource-group <resource-group> --template-file aks.bicep \
--parameters apiServerSubnetId=<API server subnet resource id> \
--parameters clusterSubnetId=<cluster subnet resource id> \
--parameters uamiPrincipalId=<user assigned identity prinicipal id>
连接至群集
若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 要在本地安装 kubectl
,请运行 az aks install-cli 命令。 AKS Automatic 群集通过用于 Kubernetes 基于角色的访问控制 (RBAC) 的 Microsoft Entra ID 进行配置。
重要
使用 Bicep 创建群集时,你需要为用户分配一个内置角色,例如 Azure Kubernetes Service RBAC Reader
、Azure Kubernetes Service RBAC Writer
、Azure Kubernetes Service RBAC Admin
或 Azure Kubernetes Service RBAC Cluster Admin
,范围限定为群集或特定命名空间,例如使用 az role assignment create --role "Azure Kubernetes Service RBAC Cluster Admin" --scope <AKS cluster resource id> --assignee user@contoso.com
。 另请确保用户具有 Azure Kubernetes Service Cluster User
内置角色以便能够运行 az aks get-credentials
,然后使用 az aks get-credentials
命令获取 AKS 群集的 kubeconfig。
使用 kubectl
命令将 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。
az aks get-credentials --resource-group <resource-group> --name <cluster-name>
使用 kubectl get 命令验证与群集之间的连接。 此命令将返回群集节点的列表。
kubectl get nodes
以下示例输出展示了登录的要求。
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.
登录后,以下示例输出会显示托管系统节点池。 确保节点状态为“就绪”。
NAME STATUS ROLES AGE VERSION
aks-nodepool1-13213685-vmss000000 Ready agent 2m26s v1.28.5
aks-nodepool1-13213685-vmss000001 Ready agent 2m26s v1.28.5
aks-nodepool1-13213685-vmss000002 Ready agent 2m26s v1.28.5
部署应用程序
若要部署该应用程序,请使用清单文件创建运行 AKS 应用商店应用程序所需的所有对象。 Kubernetes 清单文件定义群集的所需状态,例如,要运行哪些容器映像。 该清单包括以下 Kubernetes 部署和服务:
- 门店:Web 应用程序,供客户查看产品和下单。
- 产品服务:显示产品信息。
- 订单服务:下单。
- Rabbit MQ:工单队列的消息队列。
注释
不建议在没有持久性存储用于生产的情况下,运行有状态容器(例如 Rabbit MQ)。 为简单起见,此处使用这些容器,但建议使用托管服务,例如 Azure Cosmos DB 或 Azure 服务总线。
创建命名空间
aks-store-demo
以将 Kubernetes 资源部署到其中。kubectl create ns aks-store-demo
使用 kubectl apply 命令将应用程序部署到
aks-store-demo
命名空间中。 定义部署的 YAML 文件位于 GitHub 上。kubectl apply -n aks-store-demo -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-ingress-quickstart.yaml
以下示例输出显示部署和服务:
statefulset.apps/rabbitmq created configmap/rabbitmq-enabled-plugins created service/rabbitmq created deployment.apps/order-service created service/order-service created deployment.apps/product-service created service/product-service created deployment.apps/store-front created service/store-front created ingress/store-front created
测试应用程序
应用程序运行时,Kubernetes 服务将向 Internet 公开应用程序前端。 此过程可能需要几分钟才能完成。
使用 kubectl get pods 命令查看已部署的 Pod 的状态。 在继续操作之前,请确保所有 Pod 的状态为
Running
。 如果这是你要部署的第一个工作负载,节点自动预配可能需要花费几分钟时间来创建节点池,以运行 Pod。kubectl get pods -n aks-store-demo
检查应用商店前端应用程序的公共 IP 地址。 使用带有 参数的
--watch
命令来监视进度。kubectl get ingress store-front -n aks-store-demo --watch
服务的 ADDRESS 输出最初显示为空:
store-front
NAME CLASS HOSTS ADDRESS PORTS AGE store-front webapprouting.kubernetes.azure.com * 80 12m
在 ADDRESS 从空白变为实际公共 IP 地址后,使用 停止
CTRL-C
监视过程。kubectl
以下示例输出显示向服务分配的有效公共 IP 地址:
NAME CLASS HOSTS ADDRESS PORTS AGE store-front webapprouting.kubernetes.azure.com * 4.255.22.196 80 12m
若要查看 Azure Store 应用的实际效果,请打开 Web 浏览器并转到入口的外部 IP 地址。
删除群集
如果不打算完成 AKS 教程,请清理不必要的资源以避免产生 Azure 费用。 运行 az group delete 命令以移除资源组、容器服务及所有相关资源。
az group delete --name <resource-group> --yes --no-wait
注释
AKS 群集是使用用户分配的托管标识创建的。 如果你不再需要该身份,则可以手动将其移除。
后续步骤
在本快速入门中,你使用 AKS Automatic 在自定义虚拟网络中部署了一个 Kubernetes 群集,然后在其中部署了一个简单的多容器应用程序。 此示例应用程序仅用于演示目的,并未展示出 Kubernetes 应用程序的所有最佳做法。
若要详细了解 AKS Automatic,请继续阅读简介。