附属 CNI 模式¶
本文档介绍如何将 Kube-OVN 作为附属 CNI 与其他主 CNI 插件(如 Cilium、Calico 或 Flannel)一起使用。
概述¶
在非主 CNI 模式下,Kube-OVN 作为辅助 CNI 插件,为 Pod 提供额外的网络接口,而另一个 CNI 处理主网络接口(eth0)。这样可以:
- 在现有 CNI 基础上使用 Kube-OVN 的高级网络功能(VPC、子网、安全组)
- 实现网络分段和多租户
- 为 Pod 提供多个网络接口以实现不同用途
- 利用 Kube-OVN 的 VPC NAT 网关功能为次要网络提供外部连接
前置要求¶
必需组件¶
- 主 CNI:任何与 Kubernetes 兼容的 CNI(Cilium、Calico、Flannel 等)
- Multus CNI:多网络支持所必需
- Kube-OVN:配置为非主模式
安装顺序¶
- 安装并配置主 CNI
- 安装 Multus CNI
- 以非主模式安装 Kube-OVN
安装¶
使用 Helm Chart v2¶
# values.yaml
cni:
nonPrimaryCNI: true
使用 Helm 安装:
helm install kube-ovn ./charts/kube-ovn-v2 \
--namespace kube-system \
--set cni.nonPrimaryCNI=true
使用 Helm Chart v1¶
# values.yaml
cni_conf:
NON_PRIMARY_CNI: true
使用 Helm 安装:
helm install kube-ovn ./charts/kube-ovn \
--namespace kube-system \
--set cni_conf.NON_PRIMARY_CNI=true
手动安装¶
在 kube-ovn-controller deployment 中添加以下标志:
containers:
- name: kube-ovn-controller
args:
- --non-primary-cni-mode=true
配置¶
网络附件定义(NADs)¶
创建 NAD 以定义额外的网络接口:
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: kube-ovn-vpc-network
namespace: default
spec:
config: |
{
"cniVersion": "0.3.1",
"type": "kube-ovn",
"server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
"provider": "kube-ovn-vpc-network.default.ovn"
}
VPC 和子网配置¶
为次要网络创建 VPC 和子网资源:
apiVersion: kubeovn.io/v1
kind: Vpc
metadata:
name: vpc-secondary
spec:
namespaces:
- default
---
apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
name: subnet-secondary
spec:
vpc: vpc-secondary
cidr: "10.100.0.0/16"
gateway: "10.100.0.1"
provider: kube-ovn-vpc-network.default.ovn
Pod 配置¶
为 Pod 添加注解以请求额外的网络接口:
apiVersion: v1
kind: Pod
metadata:
name: multi-network-pod
annotations:
k8s.v1.cni.cncf.io/networks: default/kube-ovn-vpc-network
spec:
containers:
- name: app
image: nginx
网络接口行为¶
主接口(eth0)¶
- 由主 CNI(Cilium、Calico 等)管理
- 用于集群网络、服务发现和默认路由
- 提供与 Kubernetes 服务和外部网络的连接
次要接口(net1、net2...)¶
- 由 Kube-OVN 管理
- 提供额外的网络连接
- 可以连接到不同的 VPC 和子网
- 支持 Kube-OVN 功能,如安全组、QoS 和 NAT
使用场景¶
1. 网络分段¶
将不同类型的流量分离到不同的网络接口:
# 前端 Pod 可同时访问公共网络和内部网络
apiVersion: v1
kind: Pod
metadata:
name: frontend
annotations:
k8s.v1.cni.cncf.io/networks: |
[
{"name": "default/public-network"},
{"name": "default/internal-network"}
]
2. 多租户¶
提供租户特定的网络:
# 租户 A Pod
apiVersion: v1
kind: Pod
metadata:
name: tenant-a-app
annotations:
k8s.v1.cni.cncf.io/networks: default/tenant-a-network
---
# 租户 B Pod
apiVersion: v1
kind: Pod
metadata:
name: tenant-b-app
annotations:
k8s.v1.cni.cncf.io/networks: default/tenant-b-network
3. VPC NAT 网关¶
为次要网络启用外部连接:
apiVersion: kubeovn.io/v1
kind: VpcNatGateway
metadata:
name: vpc-nat-gw
spec:
vpc: vpc-secondary
subnet: subnet-secondary
lanIp: "10.100.0.254"
高级功能¶
多个网络提供者¶
Pod 可以拥有来自多个提供者的接口:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: |
[
{"name": "default/kube-ovn-network-1", "interface": "net1"},
{"name": "default/kube-ovn-network-2", "interface": "net2"}
]
IP 地址分配¶
控制次要接口的 IP 分配:
# 静态 IP 分配
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: |
[{
"name": "default/kube-ovn-network",
"ips": ["10.100.0.100/16"]
}]
服务质量(QoS)¶
对次要接口应用 QoS 策略:
metadata:
annotations:
ovn.kubernetes.io/ingress_rate: "1000"
ovn.kubernetes.io/egress_rate: "1000"
故障排查¶
常见问题¶
-
Pod 无法获取次要接口 - 验证 NAD 是否在正确的命名空间中创建 - 检查 kube-ovn-cni 日志中的错误 - 确保 Multus 已正确安装
-
次要接口无连接 - 验证子网和 VPC 配置 - 检查 Pod 中的路由表 - 确保安全组规则允许流量
-
IP 地址冲突 - 验证子网 CIDR 范围不重叠 - 检查静态 IP 冲突 - 查看 IPAM 配置
调试命令¶
# 检查 Pod 网络状态
kubectl get pod <pod-name> -o yaml | grep -A 10 "networks-status"
# 查看 Pod 中的网络接口
kubectl exec <pod-name> -- ip addr show
# 检查路由表
kubectl exec <pod-name> -- ip route show
# 调试 kube-ovn-cni
kubectl logs -n kube-system daemonset/kube-ovn-cni
限制¶
- 服务发现:附属网卡不参与 Kubernetes 服务发现
- 负载均衡:服务负载均衡通常仅在主网卡上工作
- DNS:Pod DNS 解析通过主网卡进行
最佳实践¶
- 网络规划:仔细规划网络拓扑以避免 IP 冲突
- 资源管理:监控资源使用情况,因为每个接口都会消耗额外的资源
- 安全:对次要网络应用适当的安全组规则
- 文档:记录网络架构和接口用途
- 测试:彻底测试不同网络段之间的连接性