ovn 设计上 vxlan 和 geneve 在单个子网上都存在 lsp(包括 virtual port 的) 上限限制。
vxlan 可用 lsp 上限是 2048 geneve 是 32767
当然 vxlan 还有其他限制:
- 最大子网数 4096
- 子网内 lsp 2048
- 无法基于 ingress port 的 唯一标识符做 ACL
- 不支持 OVN IC
由于 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 同一子网 没问题
当 pod 超过 13k 时,一次 ns 内 list 查询超过一分半 最终测试到 每个 node 500 个 pod, 一共 15k 单个 geneve 子网,一次 list 查询 仍是一分半
跨节点的两个 pod 互 ping 测试情况
参考: egress ingress 唯一标识符的作用应该是在流表转发时的作用: www.jianshu.com/p/1ce3ffdc3…