将 Kubernetes 群集部署到 Azure Stack Hub 上的自定义虚拟网络

可使用 Azure Kubernetes 服务 (AKS) 引擎在自定义虚拟网络上部署 Kubernetes 群集。 本文介绍如何在虚拟网络中查找所需的信息。 你可以在本文中找到计算群集使用的 IP 地址、在 API 模型中设置值以及设置路由表和网络安全组的步骤。

使用 AKS 引擎的 Azure Stack Hub 中的 Kubernetes 群集使用 kubenet 网络插件。 Azure Stack Hub 上的 AKS 引擎还支持 Azure CNI 网络插件。

创建自定义虚拟网络时的约束

  • 自定义 VNET 必须与 Kubernetes 群集的所有其他组件位于同一订阅中。
  • 控制平面节点池和代理节点池必须位于同一虚拟网络中。 你可以将节点部署到同一虚拟网络的不同子网中。
  • Kubernetes 群集子网必须使用自定义虚拟网络 IP 范围空间内的 IP 范围,请参阅获取 IP 地址块
  • 请考虑到节点子网的建议大小取决于所用网络插件的类型。 一般指导原则是,对于支持代理节点池的子网,Azure CNI 所需的 IP 地址数比 kubenet 所需的数目更多。 请参阅下面的 kubenetAzure CNI 示例。
  • 169.254.0.0/16 地址空间不可用于 Kubernetes 群集的自定义 VNET。

创建自定义虚拟网络

Azure Stack Hub 实例中必须有一个自定义虚拟网络。 有关详细信息,请参阅快速入门:使用 Azure 门户创建虚拟网络

在虚拟网络中创建新的子网。 需要获取子网资源 ID 和 IP 地址范围。 部署群集时,将在 API 模型中使用该资源 ID 和范围。

  1. 在 Azure Stack Hub 实例中打开 Azure Stack Hub 用户门户。

  2. 选择“所有资源”,

  3. 在搜索框中输入虚拟网络的名称。

  4. 选择“子网”>“+ 子网”,添加子网 。

  5. 使用 CIDR 表示法添加“名称”和“地址范围” 。 选择“确定” 。

  6. 在“虚拟网络”边栏选项卡中,选择“属性” 。 复制“资源 ID”,然后添加 /subnets/<nameofyoursubnect>。 将使用此值作为群集的 API 模型中 vnetSubnetId 密钥的值。 子网的资源 ID 使用以下格式:
    /subscriptions/SUB_ID/resourceGroups/RG_NAME/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/SUBNET_NAME

    虚拟网络资源 ID

  7. 在“虚拟网络”边栏选项卡中,选择“子网” 。 选择子网名称,例如 control-plane-sn

    请勿将子网关联到网络安全组 (NSG)。

    虚拟网络 CIDR 块

  8. 在“子网”边栏选项卡中,记下每个子网的地址范围(CIDR 块)。

选择地址空间的注意事项

创建自定义虚拟网络时,可以为每个子网指定网络的 IP 地址空间和 IP 地址范围。 选择要在 Kubernetes 群集中使用的地址空间和范围时,请考虑以下因素:

  • 地址空间重叠可能会导致 IP 地址冲突或通信错误。 若要降低 IP 地址重叠的风险,请为新的虚拟网络选择唯一的地址空间。
  • 10/8172.16/12192.168/16 范围中的地址空间通常用于专用网络,并且现有的数据中心基础结构可能会使用它们。 如果 Kubernetes 应用程序使用数据中心中的资源,可通过为自定义虚拟网络选择不同于数据中心地址空间的地址空间来降低冲突风险。
  • 建议为 Kubernetes 群集使用专用子网。
  • 如果使用多个现有虚拟网络,并且你打算使用虚拟网络对等互连,请考虑在每个网络上使用不同的地址空间。 重叠的地址空间可能会削弱你启用对等互连的能力。

获取 IP 地址块

AKS 引擎支持在现有虚拟网络上进行部署。 部署到现有虚拟网络上时,群集会为代理节点、控制平面节点、群集服务和容器 (Pod) 使用连续地址块。 每个地址块可以转换为虚拟网络中的一个子网。 群集部署中的所有地址块都必须是整个虚拟网络地址空间的一部分。 选择虚拟网络地址空间外部的地址块可能会导致连接问题。

设置 Kubernetes 群集时,至少需要三个地址块:

  • 节点地址块:这是用于向群集节点分配地址的地址块。 它可以是用于所有群集节点的单个地址块,也可以是用于控制平面节点池和代理节点池的单独块(子网)。 选择此块的地址范围时,请考虑到群集中的节点计数。 由于 Azure CNI 节点和容器从同一个地址块获取其地址,因此,在使用 Azure CNI 的情况下选择地址范围时,请考虑到要在群集中部署的容器数。
  • 服务地址块:这是部署到 Kubernetes 群集的服务要从中获取其群集地址的地址块。 为此块选择地址范围时,请考虑到你打算在群集中运行的最大服务数。
  • 群集地址块:这是 Pod 要从中获取其群集地址的地址块。 为此块选择地址范围时,请考虑到你打算在群集中运行的最大 Pod 数。 如前所述,对于 Azure CNI,群集地址块和节点地址块是相同的。

除了地址块以外,对于控制平面节点,还需要额外设置两个值。 需了解要为群集保留的 IP 地址数,以及子网 IP 空间中的第一个连续静态 IP。 使用多个控制平面节点时,AKS 引擎需要最多 16 个未使用的 IP 地址。 群集将为每个控制平面节点使用一个 IP 地址(最多五个控制平面节点)。 在最后一个控制平面节点之后,AKS 引擎还需要 10 个 IP 地址,用于为 IP 地址预留所准备的空余空间。 最后,为控制平面节点和空余空间预留使用了总共 16 个地址之后,还要为负载均衡器使用一个另外的 IP 地址。 放置 IP 地址块时,需要为子网分配以下现有的 IP 地址:

  • 前四个 IP 地址和最后一个 IP 地址为预留地址,不能在任何 Azure 子网中使用。
  • 应开启为 16 个 IP 地址配置的缓冲区并保持开启状态。
  • 群集的第一个 IP 地址的值应接近地址空间的末端值,以免发生 IP 冲突。 如果可能,为 firstConsecutiveStaticIP 属性分配一个接近子网中可用 IP 地址空间末端值的 IP 地址。

以包含三个控制平面节点的某个群集为例。 如果使用的子网有 256 个地址,例如 10.100.0.0/24,则需要在 239 之前设置第一个连续的静态 IP 地址。 下表显示了地址和注意事项:

/24 子网的范围 Number 注意
172.100.0.0 - 172.100.0.3 4 预留在 Azure 子网中。
172.100.0.224-172.100.0.238 14 AKS 引擎定义的群集的 IP 地址计数。

3 个控制平面节点的 3 个 IP 地址
空余空间的 10 个 IP 地址
负载均衡器的 1 个 IP 地址
172.100.0.238 - 172.100.0.254 16 16 个 IP 地址缓冲区。
172.100.0.255 1 预留在 Azure 子网中。

在此示例中,firstConsecutiveStaticIP 属性将为 172.100.0.224

对于较大的子网(例如超过 6 万个地址的 /16),可能会发现将静态 IP 地址设置为网络空间的末端值是不切实际的。 在设置群集静态 IP 地址范围时,应选择与 IP 空间中前 24 个地址距离较远的值,以便在声明地址时可以复原群集。

Kubenet 地址块示例

以下示例演示了如何根据上述各项考虑因素,填充一个使用 kubenet 网络插件的群集的虚拟网络中的地址空间,该虚拟网络中包含用于控制平面节点池和代理节点池(每个池有三个节点)的专用子网。

VNET 地址空间:10.100.0.0/16。

地址块(子网) CIDR IP 范围 IP 计数(可用)
控制平面节点块 10.100.0.0/24 10.100.0.0-10.100.0.255 255 - 4(保留)= 251
代理节点块 10.100.1.0/24 10.100.1.0-10.100.1.255 255 - 4(保留)= 251
服务块 10.100.16.0/20 10.100.16.0-10.100.31.255 4,096 - 5(保留)= 4,091
群集块 10.100.128.0/17 10.100.128.0-10.100.255.255 32,768 - 5(保留)= 32,763

在此示例中,firstConsecutiveStaticIP 属性将为 10.100.0.239

Azure CNI 地址块示例

以下示例演示了如何根据上述各项考虑因素,填充一个使用 Azure CNI 网络插件的群集的虚拟网络中的地址空间,该虚拟网络中包含用于控制平面节点池和代理节点池(每个池有三个节点)的专用子网。

VNET 地址空间:172.24.0.0/16。

注意

在你的环境中,如果公共 IP 范围在 CIDR10.0.0.0/8 内,请使用 kubenet 作为网络插件。

地址块(子网) CIDR IP 范围 IP 计数(可用)
控制平面节点块 172.24.0.0/24 172.24.0.0 - 172.24.0.255 255 - 4(保留)= 251
代理节点和群集块 172.24.128.0/17 172.24.128.0 - 172.24.255.255 32,768 - 5(保留)= 32,763
服务块 172.24.16.0/20 172.24.16.0 - 172.24.31.255 4,096 - 5(保留)= 4,091

在此示例中,firstConsecutiveStaticIP 属性将为 172.24.0.239

更新 API 模型

更新用于将群集从 AKS 引擎部署到自定义虚拟网络的 API 模型。

在 masterProfile 中设置以下值:

字段 示例 说明
vnetSubnetId /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/control-plane-sn 指定子网的 Azure 资源管理器路径 ID。 此值映射到上述控制平面节点地址块。
firstConsecutiveStaticIP 10.100.0.239 firstConsecutiveStaticIP 配置属性分配一个 IP 地址,该地址接近所需子网中可用 IP 地址空间的末端值。 firstConsecutiveStaticIP 仅适用于控制平面节点池。

在 agentPoolProfiles 中设置以下值:

字段 示例 说明
vnetSubnetId /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/agents-sn 指定子网的 Azure 资源管理器路径 ID。 此值映射到上述代理节点地址块。

在“orchestratorProfile”中,找到“kubernetesConfig”并设置以下值 :

字段 示例 描述
clusterSubnet 10.100.128.0/17 用于为 pod 网络接口分配 IP 地址的 IP 子网。 此值映射到上述群集地址块。 子网必须位于 VNET 地址空间。 如果启用 Azure CNI,默认值为 10.240.0.0/12。 如果没有 Azure CNI,默认值为 10.244.0.0/16。 使用 /16 而非 /24 子网。 如果使用 /24,此子网将仅分配给一个节点。 不会为其他节点分配 POD 网络,因为你已用尽 IP 空间,因此群集中未准备好子网。
serviceCidr 10.100.16.0/20 用于为群集中部署的服务分配 IP 地址的 IP 子网。 此值映射到上述群集服务块。
dnsServiceIP 10.100.16.10 要分配给群集 DNS 服务的 IP 地址。 该地址必须来自 serviceCidr 子网。 指定 serviceCidr 时必须设置此值。 默认值为 serviceCidr 子网的 .10 地址。

例如,如果使用 kubenet:
网络地址空间为 10.100.0.0/16,其中 control-plane-snagents-sn 的子网分别为 10.100.0.0/2410.100.1.0/24

"masterProfile": {
  ...
  "vnetSubnetId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/control-plane-sn",
  "firstConsecutiveStaticIP": "10.100.0.239",
  ...
},
...
"agentPoolProfiles": [
  {
    ...
    "vnetSubnetId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/agents-sn",
    ...
  },
    ...
"kubernetesConfig": [
  {
    ...
    "clusterSubnet": "10.100.128.0/17",
    "serviceCidr": "10.100.16.0/20",
    "dnsServiceIP" : "10.100.16.10",

    ...
  },

例如,如果使用 Azure CNI:
网络地址空间为 172.24.0.0/16,其中 control-plane-snk8s-sn 的子网分别为 172.24.0.0/24172.24.128.0/17

"masterProfile": {
  ...
  "vnetSubnetId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/control-plane-sn",
  "firstConsecutiveStaticIP": "172.24.0.239",
  ...
},
...
"agentPoolProfiles": [
  {
    ...
    "vnetSubnetId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MDBN-K8S/providers/Microsoft.Network/virtualNetworks/MDBN-K8S/subnets/k8s-sn",
    ...
  },
    ...
"kubernetesConfig": [
  {
    ...
    "clusterSubnet": "172.24.128.0/17",
    "serviceCidr": "172.24.16.0/20",
    "dnsServiceIP" : "172.24.16.10",
    ...
  },

部署群集

将值添加到 API 模型后,可以通过 AKS 引擎中的 deploy 命令从客户端计算机上部署群集。 有关说明,请参阅部署 Kubernetes 群集

设置路由表

如果在 kubernetesConfig API 模型配置对象中使用 kubenet networkPlugin: kubenet。 部署群集后,返回 Azure Stack 用户门户中的虚拟网络。 在子网边栏选项卡中同时设置路由表和网络安全组 (NSG)。 成功将群集部署到自定义虚拟网络后,请从群集资源组中的网络边栏选项卡获取路由表资源的 ID。

  1. 在 Azure Stack Hub 实例中打开 Azure Stack Hub 用户门户。

  2. 选择“所有资源”,

  3. 在搜索框中输入虚拟网络的名称。

  4. 选择“子网”,然后选择包含群集的子网的名称。

    路由表和网络安全组

  5. 选择“路由表”,然后为群集选择路由表。

  6. 确保对 API 模型中指定的每个子网(包括 masterProfile 子网)执行此操作。

注意

用于 Kubernetes Windows 群集的自定义虚拟网络存在一个已知问题

后续步骤