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

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

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

创建自定义虚拟网络时的注意事项

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

创建自定义虚拟网络

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

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

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

  2. 选择“所有资源”,

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

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

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

  6. 在“虚拟网络”边栏选项卡中,选择“属性” 。 复制“资源 ID”,然后添加 。 使用此值作为群集 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 地址。 最后,负载平衡器在控制平面节点和净空预留之后使用另一个 IP 地址,总共 16 个。 放置 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

对于更大的子网,例如/16,其地址超过60000个,您可能会发现将静态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,则此子网仅分配给一个节点。 当 IP 空间耗尽时,另一个节点不会分配 POD 网络,因此它们尚未在群集中准备就绪。
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-sn10.100.0.0/24 的子网分别为 agents-sn10.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-sn172.24.0.0/24,且 k8s-sn172.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 群集

设置路由表

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

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

  2. 选择“所有资源”,

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

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

    路由表和网络安全组

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

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

注意

Kubernetes Windows 集群的自定义虚拟网络有一个 已知问题.

后续步骤