kube-ovn vxlan geneve 子网容量 压测

772 阅读1分钟

ovn 设计上 vxlan 和 geneve 在单个子网上都存在 lsp(包括 virtual port 的) 上限限制。

vxlan 可用 lsp 上限是 2048 geneve 是 32767

当然 vxlan 还有其他限制:

  • 最大子网数 4096
  • 子网内 lsp 2048
  • 无法基于 ingress port 的 唯一标识符做 ACL
  • 不支持 OVN IC

image.png

由于 geneve 和 vxlan 性能差距并不大,所以采用 geneve 是更好的选择

pod 容量测试

由于 vxlan 到达上限时, sb chassis 就会出现无法 bind (物理流表未下发)的情况,所以 2048 之后的 pod 创建是不通网关的。

所以构造一个镜像循环 ping 网关即可


FROM registry.eki:38080/eki-plus/vpc-nat-gateway:v1.12.0
CMD ["sh", "-c", "while ping -w 1 -i 60 10.16.0.1; do echo $?; done"]


集群创建模版


cat 01-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: bb
  
  
  
  ----
  
  apiVersion: kubeovn.io/v1
kind: Vpc
metadata:
  name: bb
spec:
  namespaces:
  - bb
  
  ----
  cat 03-subnet.yaml
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: bbnet
spec:
  cidrBlock: 10.16.0.0/16
  default: true
  disableGatewayCheck: false
  disableInterConnection: true
  enableEcmp: false
  gatewayNode: ""
  gatewayType: distributed
  natOutgoing: false
  private: false
  protocol: IPv4
  provider: ovn
  vpc: bb
  namespaces:
  - bb

----

cat many-pod.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: pinggw
  name: pinggw
  namespace: bb
spec:
  replicas: 6000
  selector:
    matchLabels:
      app: pinggw
  serviceName: pinggw
  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: pinggw
    spec:
      containers:
      - image: docker.io/library/pinggw:latest
        imagePullPolicy: IfNotPresent
        name: pinggw

2. 测试结果

geneve 30 个节点,15k pod 同一子网 没问题

image.png

当 pod 超过 13k 时,一次 ns 内 list 查询超过一分半 最终测试到 每个 node 500 个 pod, 一共 15k 单个 geneve 子网,一次 list 查询 仍是一分半

image.png

跨节点的两个 pod 互 ping 测试情况

8CAA442D3B91809F3628C3D57F8A1AFB.jpg

参考: egress ingress 唯一标识符的作用应该是在流表转发时的作用: www.jianshu.com/p/1ce3ffdc3…