你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:✔️ AKS Automatic(预览版)
Azure Kubernetes 服务 (AKS) Automatic(预览版)为开发人员、DevOps 工程师和平台工程师提供最简单的托管 Kubernetes 体验。 AKS Automatic 可自动执行 AKS 群集设置和操作,并嵌入最佳做法配置,非常适合新式应用程序和 AI 应用程序。 任何技能级别的用户都可以从 AKS Automatic 对其应用程序的安全性、性能和可靠性中受益。 本快速入门假设读者基本了解 Kubernetes 的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念。
在此快速入门中,你将了解:
- 创建虚拟网络。
- 创建对虚拟网络具有权限的托管标识。
- 在虚拟网络中部署专用 AKS Automatic 群集。
- 运行示例多容器应用程序,其中的一组微服务和 Web 前端模拟零售应用场景。
如果没有 Azure 帐户,请创建一个免费帐户。
先决条件
先决条件 | 注释 |
---|---|
Azure CLI | 2.68.0 或更高版本已安装。 若要查找版本,请运行 az --version 。 如果需要进行安装或升级,请参阅安装 Azure CLI。 |
Azure CLI aks-preview 扩展 |
13.0.0b3 或更高版本。 若要查找版本,请运行 az --version 。 如果需要安装或升级,请参阅 “管理 Azure CLI 扩展”。 |
功能标志 | AutomaticSKUPreview 必须在 订阅上注册 才能使用 AKS Automatic。 |
所需权限(s) | 在 API 服务器子网上具有 Network Contributor 内置角色分配的群集标识。 |
在虚拟网络上具有 Network Contributor 内置角色分配的群集标识,用于支持节点自动预配。 |
|
使用资源组的 Microsoft.Authorization/policyAssignments/write 和 Microsoft.Authorization/policyAssignments/read 权限创建集群的用户标识。 有关详细信息,请参阅 Azure Policy 权限。 |
|
使用 Azure Kubernetes Service Cluster User Role 和 Azure Kubernetes Service RBAC Writer 访问群集的用户标识 |
|
网络要求 | 大小至少为 */28 的专用 API 服务器子网委托给的 Microsoft.ContainerService/managedClusters 的虚拟网络 |
如果存在附加到子网的网络安全组 (NSG),请确保规则允许以下流量,这些流量存在于节点与 API 服务器之间、Azure 负载均衡器与 API 服务器之间以及 Pod 到 Pod 的通信之间。 | |
如果有 Azure 防火墙或其他出站限制方法或设备,请确保允许 所需的出站网络规则和 FQDN 。 |
局限性
- 使用自定义虚拟网络的 AKS 自动群集仅支持用户分配的托管标识。
- 使用自定义虚拟网络的 AKS Automatic 群集不支持托管 NAT 网关出站类型。
- AKS 自动群集需要在支持至少 三个可用性区域 和 API Server VNet 集成的 Azure 区域中部署。
重要
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": "eastus",
"managedBy": null,
"name": "automatic-rg",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
创建虚拟网络
使用 az network vnet create
命令创建虚拟网络。 使用 az network vnet subnet create
命令创建 API 服务器子网和群集子网。
将自定义虚拟网络与 AKS Automatic 配合使用时,必须创建 API 服务器子网并将其委托给 Microsoft.ContainerService/managedClusters
,该子网授予 AKS 服务将 API 服务器 Pod 和内部负载均衡器注入该子网的权限。 无法将该子网用于任何其他工作负载,但可将其用于同一虚拟网络中的多个 AKS 群集。 支持的最小 API 服务器子网大小为 /28。
警告
AKS 群集在子网地址空间中保留至少 9 个 IP。 用尽 IP 地址可能会阻止 API 服务器缩放并导致 API 服务器中断。
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 之间的所有通信。 |
节点 CIDR | 节点 CIDR | 所有协议 | 所有端口 | 启用节点之间的通信时必需。 |
节点 CIDR | Pod CIDR | 所有协议 | 所有端口 | 路由服务流量时必需。 |
Pod CIDR | Pod CIDR | 所有协议 | 所有端口 | Pod 到 Pod 和 Pod 到服务的流量(包括 DNS)所必需。 |
创建托管标识并为其授予对虚拟网络的权限
使用 az identity create
命令创建托管标识并检索主体 ID。 使用 命令将虚拟网络上的“网络参与者”角色分配给托管标识az role assignment create
。
az identity create \
--resource-group ${RG_NAME} \
--name ${IDENTITY_NAME} \
--___location ${LOCATION}
IDENTITY_PRINCIPAL_ID=$(az identity show --resource-group ${RG_NAME} --name ${IDENTITY_NAME} --query principalId -o tsv)
az role assignment create \
--scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}" \
--role "Network Contributor" \
--assignee ${IDENTITY_PRINCIPAL_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。 如果使用 Azure Cloud Shell,则已安装 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": "eastus",
"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 Automatic 群集。
@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。 如果使用 Azure Cloud Shell,则已安装 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 创建完整解决方案的指南,请参阅 AKS 解决方案指南。
若要详细了解 AKS Automatic,请继续阅读简介。