使用 Bicep 创建 Kubernetes 群集

本文介绍如何使用 Bicep 在 Azure 本地中创建 Kubernetes 群集。 工作流如下:

  1. 创建 SSH 密钥对
  2. 使用 Bicep 在 Azure 本地版本 23H2 中创建 Kubernetes 群集。 默认情况下,群集已连接 Azure Arc。
  3. 验证部署并连接到群集。

开始之前

在开始之前,请确保具备以下先决条件:

  1. 从本地基础结构管理员处获取以下详细信息:

    • Azure 订阅 ID:使用 Azure Local 进行部署和注册的 Azure 订阅 ID。
    • 自定义位置名称或 ID:自定义位置的 Azure 资源管理器 ID。 自定义位置是在 Azure 本地群集部署期间配置的。 基础结构管理员应提供自定义位置资源管理器 ID。 若要创建 Kubernetes 群集,需要此参数。 如果基础结构管理员提供自定义位置名称和资源组名称,还可以使用 az customlocation show --name "<custom location name>" --resource-group <azure resource group> --query "id" -o tsv 获取资源管理器 ID。
    • 逻辑网络名称或 ID:执行以下步骤创建的 Azure 本地逻辑网络的 Azure 资源管理器 ID。 管理员应提供逻辑网络的 ID。 若要创建 Kubernetes 群集,需要此参数。 如果知道在其中创建了逻辑网络的资源组,还可以使用 az stack-hci-vm network lnet show --name "<lnet name>" --resource-group <azure resource group> --query "id" -o tsv Azure 资源管理器 ID。
  2. 确保开发计算机上具有 最新版本的 Azure CLI 。 还可以使用 az upgrade...升级 Azure CLI 版本。

  3. 在开发计算机上下载并安装 kubectl 。 借助 Kubernetes 命令行工具 kubectl,可以针对 Kubernetes 群集运行命令。 可以使用 kubectl 部署应用程序、检查和管理群集资源以及查看日志。

创建 SSH 密钥对

若要创建 SSH 密钥对(与 Azure AKS 相同),请使用以下过程:

  1. 在浏览器中打开 Cloud Shell 会话

  2. 使用 az sshkey create Azure CLI 命令或 ssh-keygen 命令创建 SSH 密钥对:

    # Create an SSH key pair using Azure CLI
    az sshkey create --name "mySSHKey" --resource-group "myResourceGroup"
    

    或者,使用 ssh-keygen

    ssh-keygen -t rsa -b 4096
    

有关创建 SSH 密钥的详细信息,请参阅在 Azure 中创建和管理用于身份验证的 SSH 密钥

更新并查看 Bicep 脚本

本部分显示 Bicep 参数和模板文件。 这些文件也可在 Azure 快速入门模板中使用

Bicep 参数文件:aksarc.bicepparam

using 'main.bicep'
param aksClusterName = 'aksarc-bicep-new'
param aksControlPlaneIP = 'x.x.x.x'
param sshPublicKey = 'ssh_public_key'
param hciLogicalNetworkName = 'lnet_name'
param hciCustomLocationName = 'cl_name'
param aksNodePoolOSType = 'Linux'
param aksNodePoolNodeCount = 1

Bicep 模板文件:main.bicep

@description('The name of AKS Arc cluster resource')
param aksClusterName string
param location string = 'eastus'

// Default to 1 node CP
@description('The name of AKS Arc cluster control plane IP, provide this parameter during deployment')
param aksControlPlaneIP string
param aksControlPlaneNodeSize string = 'Standard_A4_v2'
param aksControlPlaneNodeCount int = 1

// Default to 1 node NP
param aksNodePoolName string = 'nodepool1'
param aksNodePoolNodeSize string = 'Standard_A4_v2'
param aksNodePoolNodeCount int = 1
@allowed(['Linux', 'Windows'])
param aksNodePoolOSType string = 'Linux'

@description('SSH public key used for cluster creation, provide this parameter during deployment')
param sshPublicKey string

// Build LNet ID from LNet name
@description('The name of LNet resource, provide this parameter during deployment')
param hciLogicalNetworkName string
resource logicalNetwork 'Microsoft.AzureStackHCI/logicalNetworks@2023-09-01-preview' existing = {
  name: hciLogicalNetworkName
}

// Build custom location ID from custom location name
@description('The name of custom location resource, provide this parameter during deployment')
param hciCustomLocationName string
var customLocationId = resourceId('Microsoft.ExtendedLocation/customLocations', hciCustomLocationName) 

// Create the connected cluster. This is the Arc representation of the AKS cluster, used to create a Managed Identity for the provisioned cluster.
resource connectedCluster 'Microsoft.Kubernetes/ConnectedClusters@2024-01-01' = {
  location: location
  name: aksClusterName
  identity: {
    type: 'SystemAssigned'
  }
  kind: 'ProvisionedCluster'
  properties: {
    agentPublicKeyCertificate: ''
    aadProfile: {
      enableAzureRBAC: false
    }
  }
}

// Create the provisioned cluster instance. This is the actual AKS cluster and provisioned on your Azure Local cluster via the Arc Resource Bridge.
resource provisionedClusterInstance 'Microsoft.HybridContainerService/provisionedClusterInstances@2024-01-01' = {
  name: 'default'
  scope: connectedCluster
  extendedLocation: {
    type: 'CustomLocation'
    name: customLocationId
  }
  properties: {
    linuxProfile: {
      ssh: {
        publicKeys: [
          {
            keyData: sshPublicKey
          }
        ]
      }
    }
    controlPlane: {
      count: aksControlPlaneNodeCount
      controlPlaneEndpoint: {
        hostIP: aksControlPlaneIP
      }
      vmSize: aksControlPlaneNodeSize
    }
    networkProfile: {
      loadBalancerProfile: {
        count: 0
      }
      networkPolicy: 'calico'
    }
    agentPoolProfiles: [
      {
        name: aksNodePoolName
        count: aksNodePoolNodeCount
        vmSize: aksNodePoolNodeSize
        osType: aksNodePoolOSType
      }
    ]
    cloudProviderProfile: {
      infraNetworkProfile: {
        vnetSubnetIds: [
          logicalNetwork.id
        ]
      }
    }
    storageProfile: {
      nfsCsiDriver: {
        enabled: true
      }
      smbCsiDriver: {
        enabled: true
      }
    }
  }
}

Microsoft.HybridContainerService/provisionedClusterInstances 资源在 Bicep 文件中定义。 若要浏览更多属性, 请参阅 API 参考

部署 Bicep 文件

  1. 将该 Bicep 文件另存为本地计算机上的 main.bicep。

  2. 更新 aksarc.bicepparam定义的参数,并将其保存到本地计算机。

  3. 使用 Azure CLI 部署 Bicep 文件:

    az deployment group create --name BicepDeployment --resource-group myResourceGroupName --template-file main.bicep –-parameters aksarc.bicepparam
    

验证 Bicep 部署并连接到群集

现在,可以通过从开发计算机运行 az connectedk8s proxy 命令连接到 Kubernetes 群集。 还可以使用 kubectl 查看节点和 Pod 状态。 按照连接到 Kubernetes 群集中所述的步骤操作。

后续步骤

使用 Azure CLI 创建 Kubernetes 群集