尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

云原生网络架构实战:CNI、ServiceMesh与开放网络选型指南

云原生网络架构实战:CNI、ServiceMesh与开放网络选型指南 简介云原生趋势下网络架构正随容器与微服务理念发生深刻变革。这份文档围绕开放网络架构展开系统讲解面向云原生架构师、网络工程师及平台运维人员。内容覆盖云原生概述、Docker/Kubernetes容器网络、CNI接口与二层/三层实现、ServiceMesh 4~7层服务通信、网络策略、安全隔离、负载均衡及自动化弹性设计并结合数据中心从IaaS、PaaS到Serverless、数据智能的演进脉络剖析开放网络中标准化、模块化与开放API的意义。打包内容为1个docx文档共1个文件大小约1.84MB结构清晰适合按章节系统阅读。目前已有181人学习浏览适用于理解云原生网络设计原理、微服务通信治理及开放网络架构选型参考。1. 云原生与开放网络为什么传统网络在容器化浪潮前先暴露短板不管你是做网络运维还是搞容器平台最近两年应该都有一个直观感受Kubernetes 和微服务把原有的网络认知撕碎了。过去我们画一张 VLAN 拓扑、配几台交换机就能交付业务现在一个服务拆成几十个 Pod每个 Pod 都有独立 IP创建、销毁、迁移的节奏按秒计算传统静态网络根本跟不上。这份《云原生视角下的开放网络架构》文档本质上就是回答两个问题网络如何为云原生应用提供支撑以及如何用云原生的设计理念反过来改造网络。它把 CNI、ServiceMesh、Istio、Cilium、SONiC、SDN 这些概念串在一条主线上适合正在做容器化改造的运维工程师、以及需要给云平台做网络选型的架构师。我拆完这份材料后最直观的收获是以后再有人把 SDN 和云原生网络混为一谈你可以直接拿里面的云原生指数说事。2. 云原生概述从“用云”到“长在云上”的认知转换2.1 三个非原生痛点烟囱式、伪运维与不解放的开发文档第一部分对非原生云环境的批判非常直接我建议先看这里。它指出了传统方式下三个结构性痛点业务系统烟囱式构建项目经验没法沉淀复用项目数据无法协作共享运维模式没有本质改变虚拟化只是把物理资源运维变成了虚拟机运维服务高可用、自动伸缩、监控审计这些平台能力依然缺失开发没有解放写代码时还要考虑资源使用情况、部署高可用方案、自己搭中间件、自己做测试。这三个痛点放在云原生语境下对应的正是 IT 治理、可运维性和开发友好性三个目标。我拆这份文档时觉得这部分的逻辑链很重要云原生不是突然冒出来的技术堆砌而是对之前“用云方式有问题”的系统性修正。Docker 容器成为应用发布的标准形态Kubernetes 成为分布式集群的核心操作系统这是结果不是原因。真正的动因是把资源、运维、研发三者之间的边界重新划了一遍。2.2 容器、编排与微服务云原生的落地技术栈从技术栈层面看云原生狭义上就是指以 Docker 容器和 Kubernetes 为支撑的 CNCF 生态堆栈。文档特别提到一个观察某次大会的 OpenStack 开发者论坛上所有演讲议题都以容器或 K8S 为主。这个细节很有说服力说明编排层已经成为事实标准。落到架构上云原生应用与传统单体应用的最大区别在于前端服务尽量无状态化有状态的部分后置到分布式存储服务间的可靠通信、流量均衡、故障自愈交给平台负责。这个“状态后置 平台兜底”的模型直接决定了网络该怎么设计——节点弹性扩缩容、服务间通信、故障转移全部依赖网络层面的动态能力。2.3 数据中心架构演进IaaS 的边界与 PaaS/Serverless 的牵引数据中心架构的演进分三个阶段IaaS 资源池化阶段以 VMware 和 OpenStack 为代表统一管理计算、网络、存储解决的是资源运维问题但应用构建和部署方式没有本质改变PaaS 服务化阶段强调服务能力而非资源供给要求弹性与高可用保障当前大部分系统架构聚焦于此再往后是数据智能阶段以数据流为核心架构强调数据治理与隐私保护。这三阶段演进不是替代关系而是层层叠加。文档的判断是云原生目标就是能力堆栈复用业务能在有保障的云平台中快速上线。对应到网络侧我提炼出四条核心诉求大规模虚拟节点与微服务通信的高效支撑、以每秒千级的速率创建网络端点、跨 K8S 集群多活组网、以及四到七层服务化通信的可靠保障。这四条诉求构成了第 3 章的分析框架。3. 云原生组网从 CNI 到 ServiceMesh 的流量链路3.1 CNI 接口以分钟级速度创建的虚拟网络端点文档中 CNI 的定义很干脆二三层主要实现 K8S 中 CNI 接口创建一张二层的虚拟隔离网络相当于 IaaS 中 VPC 的概念。但云原生场景下的创建速度和弹性伸缩要求远高于虚机时代每秒要创建上千个网络端点还要支持快速弹性伸缩、自愈合和跨集群多活组网。CNI 方案的选型我一般先看数据面实现再看运维复杂度。flannel 简单直接VXLAN 后端适合中小集群calico 用 BGP 做路由分发性能好、支持 Network Policy是生产环境最常见的默认选择weave 自带加密适合对链路安全有要求的场景contiv 已经基本淡出主流文档提到它更多是历史参考价值。选型时先把集群规模和后端存储方案定下来再回来选 CNI否则容易返工。# 查看当前集群使用的 CNI 插件类型 kubectl get pods -n kube-system | grep -E flannel|calico|weave|cilium # 确认 Pod 网段与 Service 网段分配 kubectl get nodes -o wide # 查看某个命名空间下实际运行的 Pod IP 分布 kubectl get pods -o wide -n namespace --show-labels第一段命令用于确认集群里跑的是哪个 CNI排障时第一时间要知道数据面是谁在管。第二段看节点 IP 和 Pod 网段第三段看具体 Pod 的 IP 分布判断是路由模式还是隧道模式。如果是 calico 的 IPIP 模式流量会多一层隧道封装排查抓包时要先意识到这层开销。3.2 ServiceMesh 与 Istio四到七层的服务化通信文档把 ServiceMesh 定位为四到七层的组网方案核心是从点到点通信抽象为服务到服务通信。每一组服务由众多实例组成以服务为中心弱化实例 IP关注服务虚拟 IP。它提供有状态通信、路由限流、灰度切换、熔断监控等高级功能。文档里那句话“ServiceMesh 可被称作下一代的 SDN”有一定道理但它必须依赖基础二三层网络的联通不能把它当成 SDN 的替代品。负载均衡在 K8S 中的地位文档讲得很重整个分布式架构的数据平面基本靠负载均衡维系。入口路由是七层负载均衡服务间通信与发现靠负载均衡分发灰度发布靠负载均衡在版本间切换弹性伸缩本质上也是负载均衡把流量逐步切换到新增实例。K8S 中默认通过 iptables 规则实现分发每条实例规则按顺序做 DNAT 匹配。这种实现的问题在规则数量膨胀后开始显现。Istio 的架构核心是数据平面通过 sidecar 劫持服务间流量实现无代码侵入的服务网格。控制平面由三个组件构成pilot 下发配置、mixer 收集运行状态、citadel 负责安全证书。这种架构让微服务通信的所有能力下沉到平台层不再依赖应用代码或 Java 框架更贴合云原生理念。部署后验证 Istio 组件是否正常我一般用下面一组命令# 确认 Istio 控制面与数据面 Pod 都处于 Running 状态 kubectl get pods -n istio-system # 查看 Pod 内是否注入 sidecar 容器envoy kubectl get pods -n namespace -o jsonpath{.items[*].spec.containers[*].name} | tr \n | sort -u # 查看某个服务对应的端点列表 kubectl get endpoints -n namespace service-name第二段命令里如果看到服务 Pod 同时包含业务容器和 istio-proxy 两个容器说明 sidecar 注入生效。第三段命令用于核对服务对应的后端实例排查流量分发是否符合预期。3.3 组网安全一体化最小权限、零信任与 Cilium云原生组网的安全设计与传统网络有本质区别。第一是最小权限组网传统网络默认互通服务化场景应该默认不连通有调用关系才下发访问策略。第二是零信任理念每次调用前先验证后连接基于 K8S 自身的身份认证体系做认证。这两点落实下来网络策略的配置密度会大幅提升对控制面的下发效率提出更高要求。Cilium 是这套安全理念的代表实现。它主打的不是传统性能牌而是安全牌数据面全部基于 BPF 机制Cilium 团队本身就是 BPF 的原班人马基于 BPF 框架能以 service、pod、container 为对象做动态网络与安全策略管理解耦控制面的策略管理和实际网络环境的动态变化还能做到七层感知识别 HTTP、Kafka 等应用流量。它的状态通过 etcd 维护天然复用 K8S 的能力。这是云原生安全里最值得关注的方向后面避坑章节我会专门讲 BPF 的版本问题。4. 网络的云原生化用一张表评估 SONiC 与 SDN4.1 SONiC容器化模块化设计BGP 分布式自带弹性“网络的云原生化”这部分文档用 BGP 和 SDN 两种典型网络架构做对比样本。BGP 侧以 SONiC 为代表SDN 侧以 StratumONOS 为代表两者都是开源交换机操作系统。这个对比选的很有水平因为它不是拿传统交换机跟 SDN 比而是拿已经容器化改造过的开源交换机系统跟集中式控制器比。SONiC 的设计理念和云原生天然契合操作系统采用容器化、模块化架构中心是一个存储状态的 redis 数据库其他功能组件围绕 redis 构建交互。组件按功能拆成独立容器比如负责与硬件转发芯片驱动打交道的 SAI 容器、负责路由协议收发的 BGP 容器一般跑 FRR、负责交换机状态同步的 SWSS 容器。这种设计与 K8S 的 Pod 理念同构每个模块独立升级、故障隔离。分布式的优势集中体现在弹性与高可用上。BGP 是分布式路由协议天然具备横向扩展能力在全球互联网规模下久经考验。BGP 的短板在运维侧分布式系统故障排查困难人为配置错误频繁出现在各类故障报告中配置友好性差。# 进入 SONiC 的 BGP 容器查看路由状态常用于排查邻居关系 docker exec -it bgp vtysh # 在 vtysh 里查看 BGP 邻居状态摘要 show ip bgp summary # 查看 SONiC 当前生效的配置以 redis 为准而非 /etc 下的文件 show runningconfiguration第一段命令进入 BGP 管理容器vtysh 是 FRR 的统一 CLI。第二段看邻居建立情况排查路由震荡。第三段是 SONiC 运维习惯的关键——它读的是 redis 里的配置而不是 Linux 文件系统的配置。这一点是很多新手踩坑的根源我后面避坑章节会展开。4.2 StratumONOS集中式控制的扩展性与运维成本SDN 侧的问题从对比中看得很清楚。集中式控制的好处明显全局视图完整配置统一下发可测量性好闭环可控性强。BGP 的弱项几乎全是它的强项。但代价也集中控制平面的分布式可扩展和高可用需要大量专门设计数据面与控制面链路出现故障时能否快速恢复是核心考量。文档点出了一个关键差异SONiC 操作系统采用容器化、模块化设计而 ONOS 是基于 Java OSGi 框架构建尚无容器化计划。这意味着 ONOS 在云原生语境下的镜像化、编排化部署难度远大于 SONiC。在“开发友好性”维度上两者的评价都只是一般。4.3 五个指标一张表把选型争议量化文档提出云原生最重要的两个指标是横向弹性可扩展、自愈和高可用此外还有配置友好性、可测量性、闭环可控性。我把这些维度整理成一张对比表方便直接用于评审。评估维度SONiC BGP 分布式Stratum ONOS 集中式 SDN横向弹性扩展天然占优分布式路由协议自带扩展能力控制面需专门设计分布式方案成本高自愈与高可用Internet 规模长期验证链路故障收敛机制成熟依赖控制面高可用设计链路故障恢复需重点验证配置友好性较弱BGP 配置易出错人工错误难避免较强集中下发、全局一致性好可测量性较弱分布式故障排查困难较强统一控制面便于观测与闭环容器化支持强SONiC 本身就是容器化模块化架构弱ONOS 基于 Java OSGi暂无容器化计划开发友好性一般一般这张表的用途不是直接给谁判死刑而是把“我觉得 SDN 好”或者“BGP 天下第一”这种争论转成一个可讨论的评分体系。在你自己的选型评审里可以按实际业务权重调整指标分值比如数据中心内部网络更看重可测量性骨干网更看重弹性与自愈。5. 避坑指南云原生网络落地中的常见翻车点5.1 最小权限组网直接全拒存量业务瞬间断链现象按照文档里“默认不连通有调用关系才下发策略”的思路改造网络策略配置下发后大量存量服务互相访问失败业务报障电话被打爆。原因最小权限模型的前提是服务依赖关系已经梳理清楚。如果存量业务本来就是默认互通环境下跑起来的服务间调用关系没有被完整记录过直接切换默认拒绝等于让所有未配置策略的流量全部断掉。解决先做服务依赖梳理用 K8S 的 NetworkPolicy 可以先用审计模式记录流量拓扑再分批切换。我一般建议按命名空间灰度推进先选非核心业务验证策略下发链路确认策略生效逻辑无误后再逐步扩大范围。不要在业务高峰期做这个操作血的教训。5.2 在 SONiC 上直接改 Linux 配置文件重启后配置全丢现象按照传统 Linux 设备习惯用 vi 直接改/etc/network/interfaces或相关配置文件重启后配置消失或者发现协议栈根本不加载新配置。原因SONiC 的中心是 redis 数据库配置以config_db为准。设备启动时从config_db.json加载配置到 redis各容器从 redis 读取配置生效。直接修改文件系统上的配置文件不会同步到 redis重启后自然被覆盖。解决遵循 SONiC 的配置流程用config命令做变更比如config interface ip add、config bgp系列命令改完配置会自动写入config_db。要查看实际生效的配置用show runningconfiguration不要用cat /etc/xxx。从那以后我每次改 SONiC 都强制先敲一遍show runningconfiguration确认当前配置源再决定用哪个命令改。5.3 对着老文档找 Istio 的 mixer 组件发现控制面缺了一块现象根据文档描述排查 Istio 控制面组件发现istio-system命名空间下只有 istiod找不到 mixer 相关的 Pod以为是部署失败。原因Istio 架构在持续演进。文档描述的 pilot、mixer、citadel 三组件是较早期版本的设计从 Istio 1.5 开始控制面收敛为单体组件 istiodpilot 和 citadel 的功能并入其中mixer 的遥测功能被移除或下沉到 sidecar 与 Envoy 扩展中。解决读这类架构文档时先确认成文时间再对照当前版本的官方架构图。排障时不要纠结组件名称是否一致看功能是否等价配置下发看 istiod证书管理看 istiod 的 CA 能力遥测数据看 Prometheus 是否采集到数据。文档有价值的是设计思想和组件职责划分不是具体的组件清单。5.4 BPF、eBPF 混为一谈旧内核上跑 Cilium 翻车现象照着文档尝试部署 Cilium安装后 Pod 处于 CrashLoopBackOff 状态cilium-agent日志报 BPF 相关错误或者直接提示内核版本不支持。原因Cilium 依赖的是 eBPF即 extended BPF不是传统意义上的 cBPF。eBPF 需要较新的内核特性支持包括但不限于 BPF 系统调用、BTF、cgroup hook 等。旧内核要么缺功能模块要么没有编译对应支持运行自然失败。解决部署前先核对内核版本。Cilium 官方对不同版本的内核提供不同功能支持矩阵常见做法是生产环境至少选择 4.19 以上内核5.x 系列更好并确认内核开启了 BTF 支持。检查命令很简单uname -r看版本ls /sys/kernel/btf/vmlinux看 BTF 是否存在。部署环境准备阶段先把内核版本列入验收清单能规避大部分 Cilium 相关问题。5.5 用 iptables 模式测负载均衡性能结果失真现象在 K8S 集群里做服务间通信压测发现服务规模扩大后流量转发延迟明显上升部分连接出现随机重置但 CPU 和内存占用并不高。原因kube-proxy 的 iptables 模式通过规则链做 DNAT 分发规则是按顺序匹配的。当 Service 和后端 Pod 数量庞大时规则链变得很长每一跳流量都要遍历规则内核的 netfilter 表更新是全量替换频繁变更时锁竞争加剧。这些开销在集群规模变大后被放大性能测试结果自然偏离预期。解决评估大规模集群的负载均衡性能时优先切换到 IPVS 模式或考虑 eBPF 方案比如 Cilium 自带 kube-proxy 替代。IPVS 基于哈希表规则数量增加对性能影响远小于 iptables。切换前确认节点内核加载了ip_vs相关模块切换后要重新验证 Service 的 ClusterIP 连通性和负载均衡效果。压测环境要和目标生产规模一致否则数据没有参考意义。6. 进阶用法用云原生指数给存量网络做一次体检文档第 2 章里那套云原生指数不仅能用来对比 SONiC 和 SDN把它转成一个自评模板可以对存量网络做一次量化的云原生成熟度盘点。这个用法我觉得是这份文档最有实操价值的部分。评估维度权重自评问题打分1-5横向弹性扩展0.3集群扩容时网络能否自动跟随能否支撑秒级创建网络端点自愈与高可用0.3链路故障后流量收敛是秒级还是分钟级切换是否需要人工干预可测量性0.2丢包、时延、队列深度是否能实时观测能否定位到具体 Pod 粒度配置友好性0.1网络变更走配置下发还是逐台登录设备手工操作开发友好性0.1网络能力是否暴露 API能否被上层平台以编程方式调用做的时候有几点要注意。打分前先定基线1 分代表“完全依赖人工、无自动化能力”5 分代表“全自动闭环、无需人工介入”。每项打完之后加权求和总分低于 2 分意味着网络还是传统静态架构改造优先级最高的是弹性与自愈两个加权项——这两项加起来 0.6 的权重它们决定了平台能不能真正跑起来。总评完成后把得分最低的维度拆成具体动作比如可测量性低就优先引入监控采集与分布式追踪工具层面直接对应 Prometheus、Grafana、Jaeger、Kiali 这套组合。这套模板用在两个场景特别合适一是新平台上线前的网络就绪度评估二是老集群扩容前的风险排查。模板的价值不在分数本身而在于逼着每个角色把话说清楚网络团队说“支持弹性”时到底是指能在多少时间内完成多少 Pod 的网络配置平台团队说“高可用”时到底验证过哪条故障路径的切换时延。从那以后我每次评估网络架构都强制先走一遍这份自评表再谈选型避免一开始就陷入技术路线之争。希望这份文档的拆解和多出来的这套方法能帮你在云原生网络改造时少走几段弯路。本文还有配套的精品资源点击获取
返回列表