练习 - 通过 Azure CNI 部署 Azure Kubernetes 服务群集

已完成

注意

本练习为选做练习。 若要完成本练习,需要在开始之前创建 Azure 订阅。 如果没有 Azure 帐户,或者现在不想创建帐户,则可以通读说明,以便了解所提供的信息。

在本练习中,你将部署虚拟网络、子网和标识,然后使用 Azure 容器网络接口 (CNI) 插件部署 Azure Kubernetes 服务 (AKS) 群集。

你向公司的 IT 部门提供了收集到的有关应用程序要求、虚拟机 (VM) 调整大小和网络调整大小的信息。 IT 部门提供了一些可用于群集的网络地址范围。

下表列出了由 IT 部门提供的要求和 IP 地址:

说明 IP 地址
AKS 子网 群集中节点和 Pod 的 IP 地址。 需要 248 个可用 IP 地址。 10.150.20.0/24
Kubernetes 服务子网 群集内用于 Kubernetes 服务的 IP 地址。 不得与其他虚拟网络或本地网络冲突。 10.240.0.0/24
域名系统 (DNS) 服务 IP 地址 必须位于 Kubernetes 服务子网中,但不能是可用范围内的第一个 IP 地址。 10.240.0.10
  • 对于“AKS 子网”,你确定需要 248 个可用 IP 地址。 IT 部门给网络分配了 10.150.20.0/24,该网络在 Azure 的每个子网中保留了五个地址之后,提供了 251 个可用 IP 地址。
  • “Kubernetes 服务子网”是一组 IP 地址,这些地址未在任何其他 Azure 虚拟网络中使用,并且不与任何本地网络范围冲突。 此地址范围仅在群集内使用。 IT 部门指示你应使用 10.240.0.0/24。
  • DNS 服务 IP 地址是 Kubernetes 服务子网地址范围内的单个 IP 地址,但不能是该范围内的第一个 IP 地址。 你决定使用 10.240.0.10 作为 DNS IP 地址。

创建虚拟网络和子网

对于本练习,你将创建虚拟网络和子网。 在实际环境中,IT 部门可能有一个团队负责管理网络,而他们可能会为你创建这些资源。

  1. 启动 Azure Cloud Shell

  2. 如果尚未登录到 Azure,请先使用 az login 命令登录到 Azure 帐户。

    az login
    
  3. 选择靠近你的 Azure 区域,例如 eastus。 将值存储在环境变量中,以便在练习的其余部分中使用它。

    AKSLocation=eastus
    
  4. 使用 az group create 命令创建资源组“AKSLearn”,用以保存本练习中的资源。

    az group create --location $AKSLocation --name AKSLearn
    
  5. 使用 az network vnet create 命令创建虚拟网络“AKSVirtualNetwork”。

    az network vnet create \
        --name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --address-prefixes 10.150.0.0/16  \
        --location $AKSLocation
    
  6. 使用 az network vnet subnet create 命令创建子网“AKSSubnet”,并指定 IT 部门提供的地址范围。

    az network vnet subnet create \
        --resource-group AKSLearn \
        --vnet-name AKSVirtualNetwork \
        --name AKSSubnet \
        --address-prefixes 10.150.20.0/24
    

创建 Azure 托管标识

需要为 AKS 创建 Azure 托管标识,用于访问 Azure 订阅中的资源。 以下两个命令将创建 Azure 托管标识,然后将其唯一 ID 值存储在环境变量中,以供以后使用。

  1. 使用 az identity create 命令创建 Azure 托管标识“AKSIdentity”。

    az identity create \
        --name AKSIdentity \
        --resource-group AKSLearn
    
  2. 使用 az identity show 命令获取托管标识的 ID,并将其存储在环境变量“identityId”中,以在后面的命令中使用它。

    identityId=$(az identity show \
        --name AKSIdentity \
        --resource-group AKSLearn \
        --query id \
        --output tsv)
    

创建 AKS 群集

  1. 使用 az network vnet subnet list 命令获取子网的资源 ID 值,并将其存储在环境变量“subnetId”中,以在后面的命令中使用它。

    subnetId=$(az network vnet subnet list \
        --vnet-name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --query "[?name=='AKSSubnet'].id" \
        --output tsv)
    
  2. 使用 az aks create 命令创建 AKS 群集“AKSCluster”。

    az aks create \
        --name AKSCluster \
        --resource-group AKSLearn \
        --location $AKSLocation \
        --network-plugin azure \
        --vnet-subnet-id $subnetId \
        --service-cidr 10.240.0.0/24 \
        --dns-service-ip 10.240.0.10 \
        --generate-ssh-keys \
        --enable-managed-identity \
        --assign-identity $identityId \
        --node-vm-size  Standard_F8s_v2 \
        --node-count 3
    

    下表描述了 az aks create 命令中使用的参数:

    参数 说明
    --name 正在创建的群集的名称。
    --resource-group 应在其中创建群集的资源组。
    --location 应在其中创建群集的 Azure 区域。
    --network-plugin 指定要使用的网络插件。
    --vnet-subnet-id 指定要使用的子网的资源 ID。
    --service-cidr 指定要使用的 Kubernetes 服务地址范围。
    --dns-service-ip 指定要使用的 DNS IP 地址。
    --generate-ssh-keys 创建一组用于保护节点的 SSH 密钥。
    --enable-managed-identity 启用通过使用 Azure 托管标识访问 Azure 订阅中的资源。
    --assign-identity 指定要使用的 Azure 托管标识的 ID 值。
    --node-vm-size 指定要使用的虚拟机大小。
    --node-count 指定要创建的节点数。
  3. 群集成功部署后,使用 az aks nodepool list 命令检查节点池的详细信息。

    az aks nodepool list \
        --cluster-name AKSCluster \
        --resource-group AKSLearn \
        --output table
    

    输出应类似于以下示例输出:

    Name       OsType    VmSize           Count    MaxPods    ProvisioningState    Mode
    ---------  --------  ---------------  -------  ---------  -------------------  ------
    nodepool1  Linux     Standard_F8s_v2  3        30         Succeeded            System
    

    在输出中,你可看到三个 Standard_F8s_v2 类型节点、MaxPods 值为 30 以及节点池模式为“System”。

确认群集的 IP 地址使用情况

  • 使用 az network vnet subnet list 命令检查群集使用了多少 IP 地址。

    az network vnet subnet list \
        --vnet-name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --query "[].ipConfigurations.length(@)" \
        --output table
    

    此命令使用 JMESPath 查询字符串来确定子网中定义的 ipConfigurations 数。 则最大输出应为 93。 你首先部署了三个节点,因此每个节点都有一个 IP 地址。 对于最大的 Pod,使用了默认值 30,因此每个节点都有 30 个预先分配的 IP 地址供 Pod 使用。 到目前为止分配的 IP 地址总数是 3 x nodes + (30 pods * 3 nodes) = 93。 但是,某些地址是保留的,因此输出可能更少。

向群集添加额外的节点

让我们纵向扩展群集并再添加一个节点,以查看 IP 地址使用量如何受到影响。

  1. 纵向扩展群集并使用 az aks scale 命令再添加一个节点。

    az aks scale \
        --name AKSCluster \
        --resource-group AKSLearn \
        --node-count=4
    
  2. 命令成功完成后,使用 az aks nodepool list 命令确认节点池的新详细信息。

    az aks nodepool list \
        --cluster-name AKSCluster \
        --resource-group AKSLearn \
        --output table
    

    你的输出应类似于以下示例输出,显示现在有四个节点。

    Name       OsType    VmSize           Count    MaxPods    ProvisioningState    Mode
    ---------  --------  ---------------  -------  ---------  -------------------  ------
    nodepool1  Linux     Standard_F8s_v2  4        30         Succeeded            System
    
  3. 使用 az network vnet subnet list 命令检查群集现在正在使用多少 IP 地址。

    az network vnet subnet list \
        --vnet-name AKSVirtualNetwork \
        --resource-group AKSLearn \
        --query "[].ipConfigurations.length(@)" \
        --output table
    

    这一次,最大输出应为“124”,比上次多 31。 这是新节点的另一个 IP 地址,加上为在该节点上运行的 Pod 预先分配的另外 30 个 IP 地址。 但是,某些地址是保留的,因此输出可能更少。