次の方法で共有

使用 Azure Kubernetes 服务 (AKS) 自行提供 CNI 插件

默认情况下,Kubernetes 不提供网络接口系统。 但是,网络插件提供此功能。 Azure Kubernetes 服务 (AKS) 提供了多个受支持的容器网络接口 (CNI) 插件。 有关支持的插件的信息,请参阅 Azure Kubernetes 服务中应用程序的网络概念

支持的插件满足 Kubernetes 中的大部分网络需求。 但是,高级 AKS 用户可能需要在本地 Kubernetes 环境中使用的相同 CNI 插件。 或者,这些用户可能想要使用其他 CNI 插件中可用的高级功能。

本文介绍如何在未预安装 CNI 插件的情况下部署 AKS 群集。 在此处,可以安装可在 Azure 中运行的任何 CNI 插件。

Support

Microsoft 支持无法协助解决在您自行部署使用自带 CNI 插件的集群中出现的 CNI 相关问题。 例如,CNI 相关问题将包括大多数东/西(Pod 到 Pod)流量,以及 kubectl proxy 和类似的命令。 如果需要与 CNI 相关的支持,请使用支持的 AKS 网络插件或寻求 CNI 插件供应商的支持。

Microsoft仍支持与 CNI 无关的问题。

IP 地址规划注意事项

将自带 CNI (BYO CNI) 插件与 AKS 配合使用时,IP 地址规划职责在 AKS 和客户管理的 CNI 之间拆分。 与 AKS 托管的 CNI 插件不同,使用 BYO CNI 时,AKS 不会分配或管理 Pod IP 地址。

注释

Azure Kubernetes 服务 (AKS) 群集的 IP 地址规划文章重点介绍 AKS 托管的网络插件。 在 BYO CNI 方案中,仅与节点子网大小调整、升级和缩放行为相关的指南以及 Kubernetes 服务地址范围适用。 Pod IP 地址分配、路由和缩放行为由所选 CNI 插件确定。

虚拟网络和子网配置

AKS 仍然需要虚拟网络和子网来托管群集节点。 子网大小调整应考虑到:

  • 每个节点池的最大节点数
  • 升级和缩放操作所需的额外节点,例如在升级时的激增节点需求
  • 从虚拟网络中的子网分配 IP 地址的 Azure 资源,例如内部负载均衡器

AKS 升级和缩放操作仍基于节点。 在这些作期间,AKS 可能会暂时预配其他节点,因此子网必须足够大,以适应最大节点计数。

除非通过 CNI 插件显式实现,否则使用 BYO CNI 时,Pod IP 地址不会从 AKS 子网中分配。

Kubernetes 服务地址范围

所有 AKS 群集(包括使用 BYO CNI 的群集)都需要 Kubernetes 服务地址范围(serviceCIDR)和 DNS 服务 IP 地址(dnsServiceIP)。 以下约束适用:

  • 服务地址范围不得与虚拟网络或任何连接的网络重叠。
  • 服务 CIDR 必须小于 /12。
  • DNS 服务 IP 必须位于服务 CIDR 范围内,并且不能是该区域中的第一个 IP 地址。

这些要求独立于 CNI 插件。

Pod 网络和 IP 管理

使用 BYO CNI 时,Pod IP 地址管理(IPAM)、路由和缩放行为由 CNI 插件确定。

AKS 不支持:

  • 分配 Pod IP 地址
  • 为每个节点预分配 Pod CIDR 范围
  • 强制实施 Pod IP 重用或发布行为

与覆盖或平面网络模型、每个节点 Pod CIDR 大小调整或包含 Pod 计数的子网大小调整公式相关的指南不适用于 BYO CNI 方案。

每个节点的最大 Pod 数

AKS 在 kubelet 级别强制实施每个节点(maxPods)可配置的最大 Pod 数。 使用 BYO CNI 时,此设置会限制 Pod 计划密度,但不确定 IP 容量。 你负责确保所选 CNI 插件能够支持配置的 Pod 密度和群集规模。

先决条件

  • 对于 Azure 资源管理器或 Bicep,请使用至少为 2022-01-02-preview 或 2022-06-01 的模板版本。
  • 对于 Azure CLI,请使用至少版本 2.39.0。
  • AKS 群集的虚拟网络必须允许出站 Internet 连接。
  • AKS 群集不能使用169.254.0.0/16172.30.0.0/16172.31.0.0/16192.0.2.0/24作为 Kubernetes 服务、Pod 或群集虚拟网络的地址范围。
  • AKS 群集使用的群集标识必须至少对虚拟网络中的子网具有 网络参与者 权限。 如果要定义 自定义角色 而不是使用内置网络参与者角色,则需要以下权限:
    • Microsoft.Network/virtualNetworks/subnets/join/action
    • Microsoft.Network/virtualNetworks/subnets/read
  • 分配给 AKS 节点池的子网不能是委托子网
  • AKS 不会将网络安全组(NSG)应用到其子网或修改与该子网关联的任何 NSG。 如果提供自己的子网并添加与该子网关联的 NSG(网络安全组),则必须确保 NSG 中的安全规则允许节点的无类别域间路由(CIDR)范围内的流量。 有关详细信息,请参阅网络安全组
  • AKS 不会在托管虚拟网络中创建路由表。
  • 必须指定 Pod CIDR(Pod 的 IP 地址范围)。 即使 Pod IP 分配由自定义 CNI 管理,AKS 控制平面仍使用此范围将内部流量路由到 Pod。 如果未提供 Pod CIDR,则控制平面到 Pod 的通信可能会失败或路由错误。 必须选择一个 Pod CIDR,该 POD CIDR 不会与环境中的任何其他网络冲突,并避免 Azure 保留范围,例如、169.254.0.0/16172.30.0.0/16172.31.0.0/16192.0.2.0/24。 例如,您可以使用特定于您的群集的唯一范围 10.XX.0.0/16。 这可确保控制平面(control plane)可以直接路由到您的节点上的 Pod 的 IP 地址,并且如果集成到其他网络或集群,则不会出现 IP 地址重叠。

在未预安装 CNI 插件的情况下创建 AKS 群集

  1. 使用 az group create 命令为 AKS 群集创建 Azure 资源组。

    az group create --location chinanorth3 --name myResourceGroup
    
  2. 使用 az aks create 命令创建 AKS 群集。 传递参数值为 --network-pluginnone 参数。

    az aks create \
        --location chinanorth3 \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --network-plugin none \
        --pod-cidr "10.10.0.0/16" \
        --generate-ssh-keys
    

部署 CNI 插件

AKS 预配完成后,群集处于联机状态。 但所有节点都处于 NotReady 状态,如以下示例所示:

  $ kubectl get nodes
  NAME                                STATUS     ROLES   AGE    VERSION
  aks-nodepool1-23902496-vmss000000   NotReady   agent   6m9s   v1.21.9

  $ kubectl get node -o custom-columns='NAME:.metadata.name,STATUS:.status.conditions[?(@.type=="Ready")].message'
  NAME                                STATUS
  aks-nodepool1-23902496-vmss000000   container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

此时,群集已准备好安装 CNI 插件。