适用于: ✔️车队经理 ✔️中心群集的车队经理
了解如何使用 Terraform 创建 Azure Kubernetes Fleet Manager。
在您开始之前
如果您还没有 Azure 试用订阅,请在开始之前创建一个试用订阅。
创建舰队管理器
可以创建一个机群管理器,然后添加 AKS 和已启用 Arc 的群集作为成员群集。 如果 Fleet Manager 具有中心群集,则已启用更多功能,例如 Kubernetes 对象传播 和 托管机群命名空间。 有关详细信息,请参阅 机群管理器类型的概念性概述,其中提供了不同机群管理器配置的比较。
注释
创建机群管理器后,可以将不带中心群集的 Fleet Manager 资源升级到具有中心群集的资源。 对于具有中心群集的机群管理器资源,选择专用或公共资源后,无法更改它。
若要在没有中心群集的情况下创建 Fleet Manager,请使用以下步骤。
创建用于测试示例 Terraform 代码的目录,并将其设为当前目录。
创建名为 providers.tf 的文件并插入下列代码:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>4.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {}
}
- 创建名为
main.tf 的文件并插入下列代码:
resource "random_pet" "rg_name" {
prefix = var.resource_group_name_prefix
}
resource "azurerm_resource_group" "fleet_rg" {
name = random_pet.rg_name.id
location = var.resource_group_location
}
resource "random_string" "fleet_name" {
length = 63
lower = true
numeric = false
special = false
upper = false
}
resource "azurerm_kubernetes_fleet_manager" "fleet" {
location = azurerm_resource_group.fleet_rg.location
name = coalesce(var.fleet_name, random_string.fleet_name.result)
resource_group_name = azurerm_resource_group.fleet_rg.name
}
- 创建名为
variables.tf 的文件并插入下列代码:
variable "resource_group_location" {
type = string
default = "chinanorth3"
description = "Location of the resource group"
}
variable "resource_group_name_prefix" {
type = string
default = "rg"
description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
}
variable "fleet_name" {
type = string
description = "Name of the fleet resource. If left blank, this value is randomly generated."
default = ""
}
- 创建名为
outputs.tf 的文件并插入下列代码:
output "resource_group_name" {
value = azurerm_resource_group.fleet_rg.name
}
output "fleet_name" {
value = azurerm_kubernetes_fleet_manager.fleet.name
}
若要在群集升级之外,将 Fleet Manager 用于 Kubernetes 对象传播或托管 Fleet 命名空间,您需要使用中心群集来创建 Fleet Manager。
Fleet Manager 中心群集支持公共模式和专用模式进行网络访问。 有关详细信息,请参阅 “选择 Azure Kubernetes Fleet Manager”选项。
创建用于测试示例 Terraform 代码的目录,并将其设为当前目录。
创建名为 providers.tf 的文件并插入下列代码:
terraform {
required_providers {
azapi = {
source = "azure/azapi"
version = "~> 2.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.1"
}
}
}
provider "azurerm" {
features {}
}
provider "azapi" {
}
创建名为 variables.tf “插入以下代码”的文件。
variable "location" {
description = "The Azure region where resources will be created"
type = string
default = "Australia East"
}
variable "resource_group_name" {
description = "The name of the resource group"
type = string
default = null
}
variable "fleet_name" {
description = "The name of the Fleet"
type = string
default = null
}
variable "hub_cluster_vm_size" {
description = "VM size for the Fleet hub cluster"
type = string
default = "Standard_D2s_v3"
}
创建名为 main.tf 的文件并插入下列代码:
# Generate random suffix for unique resource names
resource "random_string" "suffix" {
length = 4
special = false
upper = false
}
# Local values for resource naming
locals {
resource_group_name = coalesce(var.resource_group_name, "rg-fleet-example-${random_string.suffix.result}")
fleet_name = coalesce(var.fleet_name, "fleet-example-${random_string.suffix.result}")
}
# Resource Group
resource "azurerm_resource_group" "fleet_rg" {
name = local.resource_group_name
location = var.location
}
公共中心群集
创建名为 fleet.tf 的文件并插入下列代码:
resource "azapi_resource" "fleet_public" {
type = "Microsoft.ContainerService/fleets@2025-03-01"
name = "${local.fleet_name}-pub"
location = azurerm_resource_group.fleet_rg.location
parent_id = azurerm_resource_group.fleet_rg.id
body = {
properties = {
hubProfile = {
agentProfile = {
vmSize = var.hub_cluster_vm_size
}
apiServerAccessProfile = {
enablePrivateCluster = false
enableVnetIntegration = false
}
dnsPrefix = "${local.fleet_name}-pub"
}
}
}
identity {
type = "SystemAssigned"
}
depends_on = [
azurerm_resource_group.fleet_rg
]
}
专用中心群集
使用专用中心群集创建 Fleet Manager 时,请考虑到以下其他注意事项:
- 机群管理器要求您指定用于放置Fleet Manager中心集群节点虚拟机(VM)的子网。 这可以通过在舰队管理器的
subnetId 的 agentProfile 中设置 hubProfile 来完成。
-
vnet vnetName 的地址前缀不得与 Azure Kubernetes 服务的 (AKS) 默认服务范围
10.0.0.0/16重叠。
- 专用访问模式不允许配置域名。
- 专用访问模式需要在代理子网上为舰队管理器的第一方服务主体分配
Network Contributor 角色(舰队管理器的第一方服务主体 ID 在不同的 Entra 租户之间有所不同)。 使用命令创建专用机群管理器时az fleet create此角色分配,因为 CLI 会自动创建角色分配。
提取舰队管理器的服务主体对象 ID:
az ad sp list \
--display-name "Azure Kubernetes Service - Fleet RP" \
--query "[].{id:id}" \
--output tsv
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
创建一个名为 identity.tf 并插入以下代码的文件,更新占位符 principal_id 以匹配之前服务主体查询的输出:
##
# REQUIRED: Assign Network Contributor Role to "Azure Kubernetes Service - Fleet RP" to enable hub cluster updates
##
resource "azurerm_role_assignment" "fleet_identity_01_network_contributor" {
scope = azurerm_subnet.hub-cluster-subnet.id
role_definition_name = "Network Contributor"
principal_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
principal_type = "ServicePrincipal"
depends_on = [azurerm_subnet.hub-cluster-subnet]
}
##
# REQUIRED: Create User Assigned Managed Identity for Fleet Manager
##
resource "azurerm_user_assigned_identity" "fleet_user_assigned_identity" {
location = azurerm_resource_group.fleet_rg.location
name = "${local.fleet_name}-uai"
resource_group_name = azurerm_resource_group.fleet_rg.name
}
# REQUIRED: Assign Managed Identity the Network Contributor Role scoped to Hub Cluster API Server Subnet
resource "azurerm_role_assignment" "fleet_user_assign_id_api_subnet_network_contributor" {
scope = azurerm_subnet.fleet-hub-apiserver-subnet.id
role_definition_name = "Network Contributor"
principal_id = azurerm_user_assigned_identity.fleet_user_assigned_identity.principal_id
principal_type = "ServicePrincipal"
depends_on = [azurerm_subnet.fleet-hub-apiserver-subnet, azurerm_user_assigned_identity.fleet_user_assigned_identity]
}
# REQUIRED: Assign Managed Identity the Network Contributor Role scoped to Hub Cluster Subnet
resource "azurerm_role_assignment" "fleet_user_assign_id_hub_subnet_network_contributor" {
scope = azurerm_subnet.hub-cluster-subnet.id
role_definition_name = "Network Contributor"
principal_id = azurerm_user_assigned_identity.fleet_user_assigned_identity.principal_id
principal_type = "ServicePrincipal"
depends_on = [azurerm_subnet.hub-cluster-subnet, azurerm_user_assigned_identity.fleet_user_assigned_identity]
}
创建名为 vnet.tf 的文件并插入下列代码。 如果想要使用现有的虚拟网络,可以将 vnet.tf 文件的内容替换为仅包含资源引用,确保正确设置了子网和委派。
resource "azurerm_virtual_network" "hub-vnet" {
name = "${local.fleet_name}-vnet"
location = azurerm_resource_group.fleet_rg.location
resource_group_name = azurerm_resource_group.fleet_rg.name
address_space = ["10.224.0.0/12"]
}
resource "azurerm_subnet" "hub-cluster-subnet" {
name = "fleet-hub-cluster-subnet"
resource_group_name = azurerm_resource_group.fleet_rg.name
virtual_network_name = azurerm_virtual_network.hub-vnet.name
address_prefixes = ["10.224.0.0/15"]
private_endpoint_network_policies = "Disabled"
private_link_service_network_policies_enabled = true
}
resource "azurerm_subnet" "fleet-hub-apiserver-subnet" {
name = "fleet-hub-apiserver-subnet"
resource_group_name = azurerm_resource_group.fleet_rg.name
virtual_network_name = azurerm_virtual_network.hub-vnet.name
address_prefixes = ["10.226.0.0/15"]
delegation {
name = "aksApiServerSubnetDelegation"
service_delegation {
name = "Microsoft.ContainerService/managedClusters"
}
}
}
创建名为 fleet.tf 的文件并插入下列代码:
# Fleet Resource
resource "azapi_resource" "fleet" {
type = "Microsoft.ContainerService/fleets@2025-03-01"
name = local.fleet_name
location = azurerm_resource_group.fleet_rg.location
parent_id = azurerm_resource_group.fleet_rg.id
body = {
properties = {
hubProfile = {
agentProfile = {
subnetId = azurerm_subnet.hub-cluster-subnet.id
vmSize = var.hub_cluster_vm_size
}
apiServerAccessProfile = {
enablePrivateCluster = true
enableVnetIntegration = true
subnetId = azurerm_subnet.fleet-hub-apiserver-subnet.id
}
dnsPrefix = local.fleet_name
}
}
}
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.fleet_user_assigned_identity.id]
}
depends_on = [
azurerm_resource_group.fleet_rg,
azurerm_role_assignment.fleet_identity_01_network_contributor,
azurerm_user_assigned_identity.fleet_user_assigned_identity,
azurerm_role_assignment.fleet_user_assign_id_api_subnet_network_contributor,
azurerm_role_assignment.fleet_user_assign_id_hub_subnet_network_contributor
]
}
运行 terraform init,将 Terraform 部署进行初始化。 此命令下载 Azure 提供程序,以便管理您的 Azure 资源。
terraform init -upgrade
要点:
- 参数
-upgrade 可将必要的提供程序插件升级到符合配置版本约束的最新版本。
运行 terraform plan 以创建执行计划。
terraform plan -out main.tfplan
要点:
-
terraform plan 命令创建执行计划,但不执行它。 相反,它会确定需要执行哪些操作,以创建配置文件中指定的配置。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。
- 使用可选
-out 参数可以为计划指定输出文件。 使用 -out 参数可以确保所查看的计划与所应用的计划完全一致。
- 若要详细了解如何使执行计划和安全性持久化,请参阅安全警告一节。
运行 terraform apply 以将执行计划应用到您的云基础架构。
terraform apply main.tfplan
要点:
- 示例
terraform apply 命令假设你先前运行了 terraform plan -out main.tfplan。
- 如果为
-out 参数指定了不同的文件名,请在对 terraform apply 的调用中使用该相同文件名。
- 如果未使用
-out 参数,请调用不带任何参数的 terraform apply。
验证结果
使用 Azure CLI 或 Azure PowerShell 验证结果。
获取 Azure 资源组名称。
resource_group_name=$(terraform output -raw resource_group_name)
获取舰队管理器名称。
batch_name=$(terraform output -raw fleet_name)
运行 az fleet show 以查看 Azure Kubernetes Fleet Manager。
az fleet show --resource-group $resource_group_name --name $fleet_name
获取 Azure 资源组名称。
$resource_group_name=$(terraform output -raw resource_group_name)
获取舰队管理器名称。
$batch_name=$(terraform output -raw fleet_name)
运行 Get-AzFleet 以查看 Azure Kubernetes Fleet Manager。
Get-AzFleet -ResourceGroupName $resource_group_name -Name $fleet_name
清理资源
不再需要通过 Terraform 创建的资源时,请执行以下步骤:
运行 terraform plan 并指定 destroy 标志。
terraform plan -destroy -out main.destroy.tfplan
要点:
-
terraform plan 命令创建执行计划,但不执行它。 相反,它会确定需要执行哪些操作,以创建配置文件中指定的配置。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。
- 使用可选
-out 参数可以为计划指定输出文件。 使用 -out 参数可以确保所查看的计划与所应用的计划完全一致。
- 若要详细了解如何使执行计划和安全性持久化,请参阅安全警告一节。
运行 terraform apply 来应用执行计划。
terraform apply main.destroy.tfplan
后续步骤