配置子网

IP 分配规则

NOTE

如果项目或命名空间分配了多个子网,则会从其中一个子网中随机选择一个 IP 地址。

  • 项目分配:

    • 如果项目未绑定到子网,则该项目下所有命名空间中的 Pods 只能使用默认子网中的 IP 地址。如果默认子网中的 IP 地址不足,Pods 将无法启动。
    • 如果项目已绑定到子网,则该项目下所有命名空间中的 Pods 只能使用该特定子网中的 IP 地址。
  • 命名空间分配:

    • 如果命名空间未绑定到子网,则该命名空间中的 Pods 只能使用默认子网中的 IP 地址。如果默认子网中的 IP 地址不足,Pods 将无法启动。
    • 如果命名空间已绑定到子网,则该命名空间中的 Pods 只能使用该特定子网中的 IP 地址。

Calico 网络

在 Calico 网络中创建子网,以实现对集群内资源更细粒度的网络隔离。

限制和约束

在 IPv6 集群环境中,Calico 网络中创建的子网默认使用 VXLAN 封装。VXLAN 封装所需的端口与 IPIP 封装不同。需要确保 UDP 端口 4789 已开放。

使用 Calico 网络的子网自定义资源(CR)示例

# test-calico-subnet.yaml
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: test-calico
spec:
  cidrBlock: 10.1.1.1/24
  default: false
  ipipMode: Always
  natOutgoing: true
  private: false
  protocol: Dual
  v4blockSize: 30
  1. default 为 true 时,使用 VXLAN 封装。
  2. 请参见 Encapsulation Mode 参数和 Encapsulation Protocol 参数。
  3. 请参见 Outbound Traffic NAT 参数。

通过 Web 控制台在 Calico 网络中创建子网

  1. 进入 管理员

  2. 在左侧导航栏中,点击 网络管理 > 子网

  3. 点击 创建子网

  4. 按照以下说明配置相关参数。

    参数描述
    CIDR将子网分配给项目或命名空间后,该命名空间中的容器组将随机使用此 CIDR 范围内的 IP 地址进行通信。
    注意:关于 CIDR 与 BlockSize 的对应关系,请参见 参考内容
    Encapsulation Protocol选择封装协议。双栈模式下不支持 IPIP
    • IPIP:使用 IPIP 协议实现分段间通信。
    • VXLAN (Alpha):使用 VXLAN 协议实现分段间通信。
    • No Encapsulation:通过路由转发直接连接。
    Encapsulation Mode当封装协议为 IPIPVXLAN 时,必须设置封装模式,默认值为 Always
    • Always:始终启用 IPIP / VXLAN 隧道。
    • Cross Subnet:仅当主机位于不同子网时启用 IPIP / VXLAN 隧道;当主机位于同一子网时,通过路由转发直连。
    Outbound Traffic NAT选择是否启用出站流量 NAT(Network Address Translation),默认已启用。
    它主要用于设置子网容器组访问外部网络时对外暴露的访问地址。
    启用出站流量 NAT 时,将使用主机 IP 作为当前子网容器组的访问地址;未启用时,子网中的容器组 IP 将直接暴露给外部网络。
  5. 点击 确认

  6. 在子网详情页中,选择 操作 > 分配项目 / 分配命名空间

  7. 完成配置后,点击 分配

通过 CLI 在 Calico 网络中创建子网

kubectl apply -f test-calico-subnet.yaml

参考内容

CIDR 与 blockSize 的动态匹配关系如下表所示。

CIDRblockSize 大小主机数量单个 IP 池大小
prefix<=16261024+64
16<prefix<=1927256~102432
prefix=202825616
prefix=21292568
prefix=22302564
prefix=23301284
prefix=2430644
prefix=2530324
prefix=2631322
prefix=2731162
prefix=283182
prefix=293142
prefix=303122
prefix=313112
NOTE

不支持前缀大于 31 的子网配置。

Kube-OVN 网络

在 Kube-OVN Overlay 网络中创建子网,以实现对集群内资源更细粒度的网络隔离。

NOTE

平台内置了用于节点与 Pods 通信的 join 子网;请避免 join 与新建子网之间的网络段冲突。

使用 Kube-OVN Overlay 网络的子网自定义资源(CR)示例

# test-overlay-subnet.yaml
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: test-overlay-subnet
spec:
  default: false
  protocol: Dual
  cidrBlock: 10.1.0.0/23
  natOutgoing: true
  excludeIps:
    - 10.1.1.2
  gatewayType: distributed
  gatewayNode: ''
  private: false
  enableEcmp: false
  1. 请参见 Outbound Traffic NAT 参数。
  2. 请参见 Reserved IP 参数。
  3. 请参见 Gateway Type 参数。可用值为 distributedcentralized
  4. 请参见 Gateway Nodes 参数。
  5. 请参见 ECMP 参数。前提是您已联系管理员启用该 feature gate。

通过 Web 控制台在 Kube-OVN Overlay 网络中创建子网

  1. 进入 管理员

  2. 在左侧导航栏中,点击 网络管理 > 子网

  3. 点击 创建子网

  4. 按照以下说明配置相关参数。

    参数描述
    Network Segment将子网分配给项目或命名空间后,该网段内的 IP 将随机分配给 Pods 使用。
    Reserved IP设置的保留 IP 不会被自动分配。例如,可将其用作计算组件的 固定 IP
    Gateway Type选择子网的网关类型以控制出站流量。
    - Distributed:集群中的每台主机都可作为当前主机上 Pods 的出站节点,实现分布式出口。
    - Centralized:集群中的所有 Pods 使用一个或多个特定主机作为出站节点,便于外部审计和防火墙控制。设置多个集中式 gateway nodes 可实现高可用。
    ECMP (Alpha)在选择 Centralized 网关时,可以使用 ECMP 功能。默认情况下,网关以主从模式运行,仅主网关处理流量。启用 ECMP(Equal-Cost Multipath Routing)后,出站流量将通过多条等价路径路由到所有可用的网关节点,从而提升网关总吞吐量。

    注意:请提前启用与 ECMP 相关的功能。
    Gateway Nodes使用 Centralized 网关时,选择一个或多个特定主机作为网关节点。
    Outbound Traffic NAT选择是否启用出站流量 NAT(Network Address Translation),默认已启用。
    它主要用于设置 Pods 在子网中访问互联网时对外暴露的访问地址。
    启用出站流量 NAT 时,将使用主机 IP 作为当前子网中 Pods 的访问地址;未启用时,子网内 Pods 的 IP 将直接暴露给外部网络。在这种情况下,建议使用集中式网关。
  5. 点击 确认

  6. 在子网详情页中,选择 操作 > 分配项目 / 命名空间

  7. 完成配置后,点击 分配

通过 CLI 在 Kube-OVN Overlay 网络中创建子网

kubectl apply -f test-overlay-subnet.yaml

Underlay 网络

在 Kube-OVN Underlay 网络中创建子网,不仅可以对资源进行更细粒度的网络隔离,还能提供更好的性能体验。

INFO

Kube-OVN Underlay 中的容器网络需要物理网络支持。请参考最佳实践 准备 Kube-OVN Underlay 物理网络,以确保网络连通性。

使用说明

在 Kube-OVN Underlay 网络中创建子网的一般流程为:添加桥接网络 > 添加 VLAN > 创建子网。

  1. 默认网卡名称。
  2. 按节点配置网卡。

通过 Web 控制台添加桥接网络(可选)

# test-provider-network.yaml
kind: ProviderNetwork
apiVersion: kubeovn.io/v1
metadata:
  name: test-provider-network
spec:
  defaultInterface: eth1
  customInterfaces:
    - interface: eth2
      nodes:
        - node1
  excludeNodes:
    - node2
  1. 默认网卡名称。
  2. 按节点配置网卡。

桥接网络是指一个 bridge,网卡绑定到该 bridge 后,可以转发容器网络流量,实现与物理网络的互通。

操作步骤:

  1. 进入 管理员

  2. 在左侧导航栏中,点击 网络管理 > 桥接网络

  3. 点击 添加桥接网络

  4. 根据以下说明配置相关参数。

    注意

    • 目标 Pod 指调度到当前节点上的所有 Pods,或命名空间绑定到特定子网且调度到当前节点上的 Pods。这取决于桥接网络下子网的范围。

    • Underlay 子网中的节点必须具备多个网卡,且桥接网络使用的网卡必须专用于 Underlay,不能承载其他流量,例如 SSH。比如,桥接网络有三台节点,计划将 eth0、eth0、eth1 专用于 Underlay,那么默认网卡可设置为 eth0,第三台节点的网卡可设置为 eth1。

    参数描述
    默认网卡名称默认情况下,目标 Pod 将使用该网卡作为桥接网卡与物理网络互通。
    按节点配置网卡配置节点上的目标 Pods 将桥接到指定网卡,而不是默认网卡。
    排除节点当节点被排除后,调度到这些节点上的所有 Pods 都不会桥接到这些节点上的任何网卡。

    注意:排除节点上的 Pods 将无法与物理网络或跨节点容器网络通信,应谨慎避免将相关 Pods 调度到这些节点上。
  5. 点击 添加

通过 CLI 添加桥接网络

kubectl apply -f test-provider-network.yaml

通过 Web 控制台添加 VLAN(可选)

# test-vlan.yaml
kind: Vlan
apiVersion: kubeovn.io/v1
metadata:
  name: test-vlan
spec:
  id: 0
  provider: test-provider-network
  1. VLAN ID。
  2. 桥接网络引用。

平台预配置了 ovn-vlan 虚拟局域网,它将连接到 provider 桥接网络。您也可以配置新的 VLAN 连接到其他桥接网络,从而实现 VLAN 之间的网络隔离。

操作步骤:

  1. 进入 管理员

  2. 在左侧导航栏中,点击 网络管理 > VLAN

  3. 点击 添加 VLAN

  4. 根据以下说明配置相关参数。

    参数描述
    VLAN ID该 VLAN 的唯一标识符,用于区分不同的虚拟局域网。
    Bridge Network该 VLAN 将连接到此桥接网络,以便与物理网络互通。
  5. 点击 添加

通过 CLI 添加 VLAN

kubectl apply -f test-vlan.yaml

使用 Kube-OVN Underlay 网络的子网自定义资源(CR)示例

# test-underlay-network.yaml
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: test-underlay-network
spec:
  default: false
  protocol: Dual
  cidrBlock: 11.1.0.0/23
  gateway: 11.1.0.1
  excludeIps:
    - 11.1.0.3
  private: false
  allowSubnets: []
  vlan: test-vlan
  enableEcmp: false
  1. VLAN 引用。

通过 Web 控制台在 Kube-OVN Underlay 网络中创建子网

NOTE

平台还预配置了一个用于 Overlay 传输模式下节点与 Pods 通信的 join 子网。该子网不会在 Underlay 传输模式下使用,因此务必避免 join 与其他子网之间的 IP 段冲突。

操作步骤:

  1. 进入 管理员

  2. 在左侧导航栏中,点击 网络管理 > 子网

  3. 点击 创建子网

  4. 根据以下说明配置相关参数。

    参数描述
    VLAN该子网所属的 VLAN。
    Subnet将子网分配给项目或命名空间后,物理子网内的 IP 将随机分配给 Pods 使用。
    Gateway上述子网内的物理网关。
    Reserved IP指定的保留 IP 不会被自动分配。例如,可将其用作计算组件的 固定 IP
  5. 点击 确认

  6. 在子网详情页中,选择 操作 > 分配项目 / 命名空间

  7. 完成配置后,点击 分配

通过 CLI 在 Kube-OVN Underlay 网络中创建子网

kubectl apply -f test-underlay-network.yaml

相关操作

当集群中同时存在 Underlay 和 Overlay 子网时,可根据需要配置 Underlay 与 Overlay 子网之间自动互通

子网管理

通过 Web 控制台更新网关

包括更改出站流量方式、网关节点和 NAT 配置。

  1. 进入 管理员

  2. 在左侧侧边栏中,点击 网络管理 > 子网

  3. 点击该子网名称。

  4. 选择 操作 > 更新网关

  5. 更新参数配置;详细信息请参见 参数说明

  6. 点击 确定

通过 CLI 更新网关

kubectl patch subnet test-overlay-subnet --type=json -p='[
  {"op": "replace", "path": "/spec/gatewayType", "value": "centralized"},
  {"op": "replace", "path": "/spec/gatewayNode", "value": "192.168.66.210"},
  {"op": "replace", "path": "/spec/natOutgoing", "value": true},
  {"op": "replace", "path": "/spec/enableEcmp", "value": true}
]'

通过 Web 控制台更新保留 IP

网关 IP 不能从保留 IP 中移除,而其他保留 IP 可自由编辑、删除或新增。

  1. 进入 管理员

  2. 在左侧侧边栏中,点击 网络管理 > 子网

  3. 点击该子网名称。

  4. 选择 操作 > 更新保留 IP

  5. 完成更新后,点击 更新

通过 CLI 更新保留 IP

kubectl patch subnet test-overlay-subnet --type=json -p='[
  {
    "op": "replace",
    "path": "/spec/excludeIps",
    "value": ["10.1.0.1", "10.1.1.2", "10.1.1.4"]
  }
]'

通过 Web 控制台分配项目

将子网分配给特定项目,有助于团队更好地管理和隔离不同项目的网络流量,确保每个项目都有足够的网络资源。

  1. 进入 管理员

  2. 在左侧侧边栏中,点击 网络管理 > 子网

  3. 点击该子网名称。

  4. 选择 操作 > 分配项目

  5. 添加或移除项目后,点击 分配

通过 CLI 分配项目

kubectl patch subnet test-overlay-subnet --type=json -p='[
  {
    "op": "replace",
    "path": "/spec/namespaceSelectors",
    "value": [
      {
        "matchLabels": {
          "cpaas.io/project": "cong"
        }
      }
    ]
  }
]'

通过 Web 控制台分配命名空间

将子网分配给特定命名空间,可实现更细粒度的网络隔离。

注意:分配过程中会重建网关,出站数据包将被丢弃!请确保当前没有业务应用正在访问外部集群。

  1. 进入 管理员

  2. 在左侧侧边栏中,点击 网络管理 > 子网

  3. 点击该子网名称。

  4. 选择 操作 > 分配命名空间

  5. 添加或移除命名空间后,点击 分配

通过 CLI 分配命名空间

kubectl patch subnet test-overlay-subnet --type=json -p='[
  {
    "op": "replace",
    "path": "/spec/namespaces",
    "value": ["cert-manager"]
  }
]'

通过 Web 控制台扩展子网

当子网的保留 IP 范围接近使用上限或即将耗尽时,可以在不影响现有服务正常运行的情况下,基于原始子网范围进行扩展。

  1. 进入 管理员

  2. 在左侧侧边栏中,点击 网络管理 > 子网

  3. 点击该子网名称。

  4. 选择 操作 > 扩展子网

  5. 完成配置后,点击 更新

通过 CLI 扩展子网

kubectl patch subnet test-overlay-subnet --type=json -p='[
  {
    "op": "replace",
    "path": "/spec/cidrBlock",
    "value": "10.1.0.0/22"
  }
]'
NOTE

扩展默认 Pod 子网

如果集群中的 Pod IP 地址不足,可以按相同方式扩展默认 Pod 子网(ovn-default)。现有 Pods 会保留原有地址,新 Pods 将从扩展后的地址范围中获取地址。

子网只能在保持相同网络基地址的前提下扩展(即网络前缀变短);不能修改基地址,也不能缩小范围。如果默认 Pod 子网无法原地扩展,例如更大的范围与当前基地址不对齐,则应新增一个子网,并将其绑定到需要更多地址的命名空间。

Service CIDR 在集群创建后无法更改。请在安装前规划好 Service 网络规模。

管理 Calico 网络

支持分配项目和命名空间;详情请参见 项目分配命名空间分配

通过 Web 控制台删除子网

NOTE
  • 删除子网后,如果仍有容器组在使用该子网内的 IP,容器组可继续运行且 IP 地址保持不变,但将无法进行网络通信。可以重建容器组以使用默认子网中的 IP,或为容器组所在的命名空间重新分配新的子网后再使用。

  • 默认子网不能删除。

  1. 进入 管理员

  2. 在左侧导航栏中,点击 网络管理 > 子网

  3. 点击 ⋮ > 删除,并继续完成删除操作。

通过 CLI 删除子网

kubectl delete subnet test-overlay-subnet