
Kubespray 集成 Kube-OVN 部署指南基于 OVN 的企业级容器网络实践【免费下载链接】kubesprayDeploy a Production Ready Kubernetes Cluster项目地址: https://gitcode.com/GitHub_Trending/ku/kubesprayKube-OVN 将 OVNOpen Virtual Network的网络虚拟化能力与 Kubernetes 深度整合为集群提供面向企业场景的高级容器网络结构Container Network Fabric。本文基于 Kubespray 仓库中 docs/CNI/kube-ovn.md 展开结合 roles/network_plugin/kube-ovn 的默认配置、部署任务与模板实现系统讲解如何通过 Kubespray 启用 Kube-OVN、理解其各配置项的真实作用并在部署完成后验证网络组件与子网状态。读完本文你将能够在 Kubespray 集群中正确启用并验收 Kube-OVN同时具备依据源码定位网络故障的能力。Kube-OVN 与 Kubespray 的关系Kube-OVN 是一个将 OVN 的网络虚拟化能力与 Kubernetes 集成起来的 CNI 插件提供子网Subnet、VPC、网关、NAT、网络策略NetworkPolicy、QoS 等面向企业的网络特性。在 Kubespray 中Kube-OVN 与 Calico、Cilium、Flannel、Kube-router 等并列作为可选的kube_network_plugin实现。从调度入口看roles/network_plugin/tasks/main.yml 会根据kube_network_plugin变量的取值动态 include 对应的角色目录并将kube-ovn同时注册为可用的 play 标签。也就是说只要将kube_network_plugin设为kube-ovnKubespray 的cluster.yml主流程网络插件阶段就会自动加载network_plugin/kube-ovn角色的全部任务与模板无需额外改动 playbook。启用 Kube-OVN修改集群配置Kubespray 的集群级网络插件配置位于 inventory 的group_vars/k8s_cluster下。参考 inventory/sample/group_vars/k8s_cluster/k8s-cluster.yml默认值为calico。改为 Kube-OVN 只需# inventory/你的集群目录/group_vars/k8s_cluster/k8s-cluster.yml ... kube_network_plugin: kube-ovn ...修改后执行常规部署或重跑cluster.yml或带--tags kube-ovn定向应用网络插件阶段即可。Kube-OVN 角色的镜像版本在 roles/kubespray_defaults/defaults/main/download.yml 中定义当前仓库锁定的版本为kube_ovn_version: 1.12.21对应的组件镜像分别为镜像变量仓库路径说明kube_ovn_container_image_repo{{ docker_image_repo }}/kubeovn/kube-ovn主组件controller、cni、ovn-central、ovs、pinger、monitorkube_ovn_vpc_container_image_repo{{ docker_image_repo }}/kubeovn/vpc-nat-gatewayVPC NAT 网关kube_ovn_dpdk_container_image_repo{{ docker_image_repo }}/kubeovn/kube-ovn-dpdkDPDK 模式专用镜像三者的 tag 均以v{{ kube_ovn_version }}DPDK 为19.11-v{{ kube_ovn_version }}形式拼接仓库统一通过 download 角色的镜像清单 下发校验和checksum。内核版本前置检查务必先行确认Kube-OVN 依赖 OVS/OVN 内核数据路径官方文档在部署前给出了一条硬性警告内核版本cat /proc/version查看不能是3.10.0-862否则 Kube-OVN 无法启动并会打印如下错误kernel version 3.10.0-862 has a nat related bug that will affect ovs function, please update to a version greater than 3.10.0-898含义是该内核版本存在与 NAT 相关的 bug会影响 OVS 功能需要升级到高于3.10.0-898的内核。建议在运行集群节点前统一核对所有节点尤其是控制平面与运行 ovs 守护进程的节点的内核版本避免部署完成后出现 ovs 组件反复 CrashLoopBackOff。Kube-OVN 核心配置参数详解Kube-OVN 角色的全部默认参数集中在 roles/network_plugin/kube-ovn/defaults/main.yml它们会通过模板渲染进最终的 Kubernetes 资源清单。以下按功能分组说明参数名即变量名可直接在 group_vars 中覆盖。资源配额requests/limits默认值为各组件设置了 CPU 与内存的 requests/limits覆盖 dbovn-central 数据库、nodeovs 数据面、cni-server、controller、pinger、monitor 与 DPDK 节点变量组默认 requests默认 limitskube_ovn_db_*500m / 200Mi3000m / 3000Mikube_ovn_node_*200m / 200Mi1000m / 800Mikube_ovn_cni_server_*200m / 200Mi1000m / 1Gikube_ovn_controller_*200m / 200Mi1000m / 1Gikube_ovn_pinger_*100m / 200Mi200m / 400Mikube_ovn_monitor_*200m / 200Mi200m / 200Mikube_ovn_dpdk_node_*1000m / 2Gi1000m / 2Gi控制面高可用与集群拓扑kube_ovn_central_hosts: {{ groups[kube_control_plane] }} # ovn-central 部署节点 控制平面节点 kube_ovn_central_replics: {{ kube_ovn_central_hosts | length }} # 副本数跟随控制平面数量 kube_ovn_controller_replics: {{ kube_ovn_central_hosts | length }} kube_ovn_central_ips: |- {% for item in kube_ovn_central_hosts -%} {{ hostvars[item][main_ip] }}{% if not loop.last %},{% endif %} {%- endfor %}kube_ovn_central_ips会由模板拼接成逗号分隔的地址列表注入 ovn-central 与 ovs 容器的OVN_DB_IPS环境变量实现多副本 OVN 数据库的相互发现与选举。ovn-centralDeployment 还通过 nodeSelector 要求节点带kube-ovn/role: master标签该标签由部署任务中的 kubectl label 命令打到控制平面节点上。网络模式geneve / vlan# geneve or vlan kube_ovn_network_type: geneve # geneve, vxlan or stt. ATTENTION: some networkpolicy cannot take effect when using vxlan and stt need custom compile ovs kernel module kube_ovn_tunnel_type: genevekube_ovn_network_type决定控制器层使用的网络类型kube_ovn_tunnel_type决定 ovs 数据面的封装协议注意默认注释中的两条约束使用 vxlan 时部分 NetworkPolicy 无法生效stt 则需要自编译 OVS 内核模块。切换前请先评估特性需求。物理网卡与 MTU# kube_ovn_iface: eth1 # kube_ovn_mtu: 1333kube_ovn_iface指定承载容器网络的物理网卡可填单个网卡名或以逗号分隔的正则组如enp6s0f0,eth.*留空时自动使用默认路由对应的网卡kube_ovn_mtu用于覆盖 overlay 网络的 Pod 接口 MTU默认值为物理网卡 MTU 减 100。两者在 cni-server 启动参数中通过--iface与--mtu注入仅当变量被显式定义时--mtu才会出现。外部连通性探测与网关kube_ovn_external_address: 8.8.8.8 kube_ovn_external_address_ipv6: 2400:3200::1 kube_ovn_external_dns: alauda.cn kube_ovn_default_gateway_check: true kube_ovn_default_logical_gateway: false kube_ovn_u2o_interconnection: falsekube_ovn_external_address_merged会根据集群 IP 栈ipv4_stack / ipv6_stack自动合并 v4/v6 探测地址交给 pinger 组件做外部可达性监控--external-address。kube_ovn_external_dns则用于 DNS 连通性探测。kube_ovn_default_gateway_check、kube_ovn_default_logical_gateway、kube_ovn_u2o_interconnection均会原样传入 controller 的启动参数--default-gateway-check、--default-logical-gateway、--default-u2o-interconnection。子网与 CIDRkube_ovn_node_switch_cidr: 100.64.0.0/16 kube_ovn_node_switch_cidr_ipv6: fd00:100:64::/64 # kube_ovn_default_exclude_ips: 10.16.0.1 # kube_ovn_default_gateway: 10.233.64.1,fd85:ee78:d8a6:8607::1:0kube_ovn_node_switch_cidr_merged按 IP 栈自动合并 v4/v6作为--node-switch-cidr参数下发即默认的 join 子网网段。Pod 默认子网ovn-default的 CIDR 来自集群变量kube_pods_subnets--default-cidrService 网段来自kube_service_subnets--service-cluster-ip-range。kube_ovn_default_exclude_ips可预留默认子网中不参与分配的 IP。VLAN 直连模式kube_ovn_default_vlan_id: 100 kube_ovn_vlan_name: product # kube_ovn_default_interface_name: eth0当kube_ovn_network_type: vlan时kube_ovn_default_interface_name指定物理接口kube_ovn_default_vlan_id与kube_ovn_vlan_name决定默认 ProviderNetwork/VLAN 的 ID 与名称。Pod 接口类型与网络特性开关kube_ovn_pod_nic_type: veth_pair # veth-pair 或 internal-port kube_ovn_enable_lb: true kube_ovn_enable_np: true kube_ovn_enable_external_vpc: true kube_ovn_encap_checksum: true kube_ovn_enable_ssl: false kube_ovn_hw_offload: false kube_ovn_traffic_mirror: false kube_ovn_bind_local_ip_enabled: true kube_ovn_eip_snat_enabled: true kube_ovn_ls_dnat_mod_dl_dst: true kube_ovn_keep_vm_ip: true kube_ovn_cni_config_priority: 01这些开关分别控制Pod 网卡形态veth pair 或 OVS internal port、内置负载均衡LB、网络策略NP、外部 VPC、封装校验和、SSL/TLS 加密、硬件卸载hw-offload 需将网卡设为物理口并保证物理口绑定 IP、流量镜像、本地 IP 绑定、EIP/SNAT、DNAT 目的 MAC 改写、VM 场景下保留 IP 行为以及 CNI 配置文件优先级--cni-conf-name中的前缀序号。多集群互连InterConnectionkube_ovn_ic_enable: false kube_ovn_ic_autoroute: true kube_ovn_ic_dbhost: 127.0.0.1 kube_ovn_ic_zone: kubernetes当kube_ovn_ic_enable: true时模板会在 kube-system 命名空间额外生成ovn-ic-configConfigMap见 cni-kube-ovn.yml.j2内容包含enable-ic、az-name、ic-db-host、ic-nb-port: 6645、ic-sb-port: 6646、gw-nodes即控制平面节点列表与auto-route用于多集群的 OVN IC 互联与自动路由。部署流程从变量到 Pod 的完整链路Kube-OVN 的部署任务集中在 roles/network_plugin/kube-ovn/tasks/main.yml共三步标记 ovn-db 节点由控制平面首个节点inventory_hostname groups[kube_control_plane][0]对所有kube_ovn_central_hosts执行kubectl label --overwrite node 节点 kube-ovn/rolemaster为 ovn-central 与 monitor 提供调度依据。渲染三份清单通过 template 模块把 cni-kube-ovn-crd.yml.j2、cni-ovn.yml.j2、cni-kube-ovn.yml.j2 渲染到{{ kube_config_dir }}下的实际 manifest 文件。应用资源同样仅在控制平面首节点上通过 Kubespray 自带的 kube 模块state: latest依次 apply CRD、ovn 基础组件与 kube-ovn 主组件清单。三份模板分工明确cni-kube-ovn-crd.yml.j2Kube-OVN 的自定义资源定义Subnet、VPC、VLAN、ProviderNetwork、IP 等 CRD是上层资源模型的基础cni-ovn.yml.j2OVN 基础运行环境——ovn-centralDeployment运行 northd/NB/SB端口 6641/6642/6643通过 ovn-nb/ovn-sb/ovn-northd 三个 ClusterIP Service 对外暴露 leader 地址、ovs-ovnDaemonSet每节点 OVS 数据面含 DPDK 分支、以及 ovn/ovn-ovs 的 ServiceAccount 与 RBACcni-kube-ovn.yml.j2Kube-OVN 主组件——kube-ovn-controllerDeployment负责子网/IPAM/网络策略编排、kube-ovn-cniDaemonSet含 install-cni initContainer 与 cni-server 容器、kube-ovn-pingerDaemonSet网络连通性探测、kube-ovn-monitorDeployment采集 OVN northd/NB/SB 指标metrics 端口 10661以及 VPC NAT 相关的 ConfigMap 与整套 RBAC。一个值得注意的细节ovs-ovnDaemonSet 的启动命令会根据kube_ovn_dpdk_enabled切换为/kube-ovn/start-ovs-dpdk.sh与 DPDK 镜像并在启用时挂载/dev/hugepagesHugePages与/opt/ovs-config同时显式申请hugepages-1Gi: 1Gi——这就是 DPDK 模式在资源与内核层面的特殊要求。验证 Kube-OVN 安装1. 检查 kube-ovn 命名空间下的 PodKube-OVN 的 OVN 组件与控制器运行在kube-ovn命名空间模板中实际资源位于 kube-system 命名空间Pod 名称以kube-ovn/ovn前缀区分。文档给出的验收视角如下# From the CLI kubectl get pod -n kube-ovn # Output NAME READY STATUS RESTARTS AGE kube-ovn-cni-49lsm 1/1 Running 0 2d20h kube-ovn-cni-9db8f 1/1 Running 0 2d20h kube-ovn-cni-wftdk 1/1 Running 0 2d20h kube-ovn-controller-68d7bb48bd-7tnvg 1/1 Running 0 2d21h ovn-central-6675dbb7d9-d7z8m 1/1 Running 0 4d16h ovs-ovn-hqn8p 1/1 Running 0 4d16h ovs-ovn-hvpl8 1/1 Running 0 4d16h ovs-ovn-r5frh 1/1 Running 0 4d16h验收要点kube-ovn-cni-*的数量应与节点数一致DaemonSetovs-ovn-*同样逐节点部署ovn-central-*与kube-ovn-controller-*的副本数应等于控制平面节点数由kube_ovn_central_replics/kube_ovn_controller_replics推导。所有组件READY 1/1且STATUS Running即为正常。2. 检查默认子网与节点子网# From the CLI kubectl get subnet # Output NAME PROTOCOL CIDR PRIVATE NAT join IPv4 100.64.0.0/16 false false ovn-default IPv4 10.16.0.0/16 false truejoin子网的 CIDR 即kube_ovn_node_switch_cidr100.64.0.0/16用于节点与 Pod 的网关互通ovn-default为默认 Pod 子网CIDR 来自kube_pods_subnetsNAT true表示默认开启出站 NAT。双栈集群下此处会同时出现 IPv6 条目对应kube_ovn_node_switch_cidr_ipv6等。3. 辅助验收手段运行一个测试 Podkubectl exec进去 ping 对端 Pod IP 与外部地址如 8.8.8.8即kube_ovn_external_address默认值查看kube-ovn-pinger的 8080 metrics 端口确认外部连通性探测状态查看kube-ovn-monitor的 10661 端口指标确认 northd/NB/SB 正常。常见故障与排查方向ovn-central无法调度或反复重启确认控制平面节点带上了kube-ovn/rolemaster标签kubectl get nodes --show-labels该标签是 ovn-central 与 monitor 的 nodeSelector 硬性要求。ovs-ovn启动失败优先核对内核版本是否命中 3.10.0-862 的 NAT bug其次确认节点已加载 OVS 所需内核模块非 DPDK 模式下HW_OFFLOAD与TUNNEL_TYPE环境变量是否正确注入。NetworkPolicy 不生效检查kube_ovn_tunnel_type是否被改成了 vxlan默认注释明确提示 vxlan 下部分策略无法生效。Pod 无法获取 IP检查kubectl get subnet中ovn-default是否就绪并确认kube_pods_subnets与节点网卡 MTU 设置合理kube_ovn_mtu默认应为物理网卡 MTU 减 100。小结通过 Kubespray 启用 Kube-OVN 只需一行变量kube_network_plugin: kube-ovn。其背后是 network_plugin/kube-ovn 角色 依据 defaults/main.yml 中的数十个参数渲染并应用 CRD、ovn-central、ovs-ovn、controller、cni、pinger、monitor 等组件。理解这些参数的默认值与生效路径controller 启动参数、cni-server 启动参数、环境变量、nodeSelector就能在部署前完成合理的网络规划封装协议、MTU、子网、双栈、DPDK、多集群 IC并在部署后通过kubectl get pod -n kube-ovn与kubectl get subnet快速完成验收。【免费下载链接】kubesprayDeploy a Production Ready Kubernetes Cluster项目地址: https://gitcode.com/GitHub_Trending/ku/kubespray创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考