ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

数据网格落地难?Kubernetes才是承载Data Mesh的最佳底座

数据网格落地难?Kubernetes才是承载Data Mesh的最佳底座 我记得接手数据平台改造项目时最头疼的一幕凌晨四点的调度集群又崩了十几个数据团队各自维护一套Spark脚本数据字典没人说得清任务发布全靠运维手动排队。那会儿我们认真讨论过要不要引入数据网格Data Mesh但架构组争论最激烈的不是网格理念对不对而是——理念有了拿什么落地最终我们把答案逼向了Kubernetes一个乍看之下和数据网格八竿子打不着的容器编排平台。这篇文章想聊的就是这件事数据网格Data Mesh不是一张挂在墙上的架构PPT云原生大数据架构也不是把数据库塞进容器就完事。网格需要一套能承载领域自治、数据即产品、联邦治理原则的基础设施底座而Kubernetes恰好是目前唯一能把这三者同时落地的容器编排系统。适合正在设计数据平台、或者准备从传统湖仓架构往分布式数据架构迁移的读者看——包括平台工程师、数据工程师以及被数据治理折腾到头秃的架构负责人。1. Data Mesh四大原则为什么天然指向Kubernetes先说个容易被忽略的事实Data Mesh理论提出到现在市面上几乎没有一套开箱即用的实现方案。原因很简单它不是一个具体软件而是一组组织和技术原则。Zhamak Dehghani提出Data Mesh时给出的四个原则——领域所有权、数据即产品、自助式数据基础设施、联邦式计算治理——每一条在传统大数据平台上都很难真正落地。但把这些原则逐条拆开看每一条都能在Kubernetes身上找到对应物。1.1 领域自治网格的起点是把域名空间变成命名空间数据网格最核心的主张是谁产生数据谁负责把数据做成产品。这意味着每个业务域比如订单域、用户域、库存域要拥有自己的数据管道、数据存储和数据服务而不是把全公司的数据都堆到一个中央大数据团队手里。这个主张落到基础设施层面就要求系统必须提供清晰的隔离边界。传统做法是给每个团队分一套Hadoop集群或者在一套YARN集群上用队列区分但前者贵到离谱后者根本无法隔离故障——一个团队的失控作业就能拖垮整个集群的调度器。Kubernetes在这里的映射几乎是完美的Namespace就是逻辑隔离边界ResourceQuota管资源上限NetworkPolicy管网络通路RBAC管谁能碰谁的数据。一个业务团队整体接管一个Namespace命名空间即能力边界。你是订单域这就是你的域空间里面怎么跑管道、怎么暴露服务、怎么管权限你自己说了算。这种将组织边界直接翻译为基础设施边界的做法比物理机、虚拟机都要干净得多。我们当时把订单域切到一个独立Namespace之后那个域的调度延迟直接降了三分之二——不是因为性能变好了而是因为他们不再和十几个团队挤同一个队列。1.2 数据即产品可交付的数据需要可编排的应用载体第二条原则要求数据像软件产品一样有版本、有接口、有服务质量SLO。这个要求如果放在传统数据仓库语境下是没法谈的——一张Hive表谈不上版本发布一个Sqoop同步任务也谈不上SLO监控。但把数据产品想象成一个跑在Kubernetes上的应用事情就顺了。数据管道是CronJob或SparkApplication数据的读接口是Service和Ingress数据新鲜度是Prometheus里的监控指标数据更新的SLA就是Deployment的探针检查。我们在实践中发现一旦给数据产品套上微服务的壳产品化这个抽象概念就有了具体的操作载体数据团队能直接复用微服务团队积累的全部经验滚动发布、金丝雀、灰度、健康检查。这些都是现成的Kubernetes机制不需要专门为数据场景重新发明。1.3 自助式基础设施平台团队交付能力而不是操作传统数据平台团队的工作模式非常像政务大厅——开账号排个队、加队列提个工单、扩存储走个审批。这种模式的本质问题是平台团队成了所有数据交付路径上的瓶颈规模一大必然卡死。数据网格要求平台团队别再当操作员而是交付一套能让领域团队自己动手的自助平台。Kubernetes在这件事上的贡献体现在两个层次。第一层是声明式API。用户只需要描述我要一个什么状态比如kind: FlinkApplication里面写清楚并行度、任务JAR包、参数系统负责把当前状态朝目标状态收敛。这个模型天然适合做自助平台——你给每个领域团队发一套写好的YAML模板他们改改参数就能发布自己的数据管道根本不需要知道底层的调度细节。第二层是Operator机制。Operator是Kubernetes上把复杂系统的运维知识固化到控制器里的利器。Spark-on-K8s是Spark Operator来管Flink集群是Flink Kubernetes Operator来管连Kafka这种状态ful的中间件也有Strimzi这样的成熟Operator。数据团队看的还是自己熟悉的Spark、Flink但底层的故障恢复、滚动升级都交给了Operator自动处理。说得直白点微服务团队早就习惯了平台给你工具、你自己部署这套云原生开发体验数据团队过去享受不到是因为大数据组件太复杂没人愿意做成自助服务。现在Operator把这层复杂性消化掉了数据团队终于能站在同一个起跑线上。1.4 联邦式治理策略要集中执行要分布第四原则看起来最矛盾——联邦和治理天然拉扯。既要保证全公司在数据标准、数据契约、访问规范上有统一的声音又不能回到中央团队一刀切的老路上。Kubernetes的解决思路是把治理策略放在控制面集中定义推到各个域执行。具体来说就是准入控制器Admission Controller加OPA Gatekeeper这样的策略引擎。举例全公司规定敏感数据表的读取必须走审计接口这个策略由平台团队写成OPA策略下发到所有Namespace的准入控制器上。任何域的Pod想直接访问未脱敏表创建时就被拦下。策略的制定是集中的拦截的执行是分布式的——这不就是联邦式治理的标准姿势吗还有个很容易被忽视的治理组件Schema Registry。数据的Schema表结构就是数据产品之间的契约。契约集中管理各域生产、消费时按契约走避免某天上游偷偷删了个字段下游直接跑崩。在Kubernetes生态里Schema Registry、数据目录服务也可以作为调度型应用跑在集群上和网格本身融合得很好。2. Kubernetes给数据网格提供的不只是调度底座有很多人理解Kubernetes和大数据的关系纯粹停留在轮子换了个轨道。实际上它给网格带来的是一种全新的操作维度。我在这里把我认为最关键的几个点展开说。2.1 一份编排同时管批、流、服务和存储传统大数据架构是分裂的批处理归YARN管实时计算归Flink/YARN管数据服务是一堆Java应用部署在虚拟机或SpringCloud体系里消息队列是独立的一套Kafka集群存储又在另一套HDFS/S3上。运维起来一个人要同时盯五六套系统的监控跨系统排障简直像拼图。Kubernetes的混合编排把这一切统一在一个控制平面里。同一个集群上CronJob负责人肉不眨眼的日批Deployment跑着对外提供数据的API服务StatefulSet扛着Kafka或者ClickHouse各类Operator管理着Flink任务和Spark任务。数据从生产、加工、存储到服务每一个环节都以Pod的形式存在于同一个世界里。排查一个数据晚了一个小时的问题时你不需要在三个系统间来回切上下文一条kubectl get pods就能看出是哪条链路堵了。这种统一带来的隐形好处是资源池的融合。批处理不需要独立的机器组服务高峰和批处理高峰可以错峰互补——白天服务多占资源凌晨的批处理接上。我们统计过这一条资源池融合直接让整体机器利用率从20%出头提到了接近40%成本下降是实打实的。2.2 弹性伸缩大数据负载的天然诉求大数据工作负载是出了名的峰谷反差大——月初对账跑几百个并行任务平时只有零星几个大促前夜实时链路压力陡增平日闲得冒烟。静态集群只能按峰值配置结果就是大部分时间在烧钱。Kubernetes的自动伸缩能力给这个老毛病提供了解法。HPAHorizontal Pod Autoscaler管服务类负载根据CPU、QPS等指标伸缩副本数。对数据任务KEDA这两个月的更新值得关注。KEDA让伸缩的触发源从指标扩展到了事件源——比如消息队列堆积长度、数据库Binlog堆积量、定时表达式都可以。这让离线批处理有了正确姿势Kafka队列里堆了100万条消息事件源触发KEDA把并行Worker从10拉到100高峰期过了Worker自动缩回去。配合云厂商的节点自动扩缩容整个集群的计算能力可以跟随负载动态伸缩这在传统YARN上是很难做到的因为YARN要管理一个相对静态的节点池。2.3 从单集群到多集群的联邦边界当数据网格真正铺开单集群几乎必然会撞墙。大型企业不会只有一个Kubernetes集群特别是数据平台要跨区域、跨云、或者正在从自建机房往云上迁移时多集群是常态。Kubernetes虽然没有把多集群做成一个开箱即得的特性但它的生态提供了清晰的思路每个域跑一个或多个独立集群集群之间通过联邦层或服务网格来打通。这其实非常符合数据网格的联邦精神——每个域自治到甚至可以拥有自己的K8s集群全局只需要一套统一的策略和安全标准。跨集群的数据访问如果延迟敏感可以考虑服务网格的跨集群路由能力配合mTLS加密保证数据安全。多集群也天然给了故障隔离的保险某个域集群升级出事不会把全公司的数据管道带崩。2.4 可观测性数据血缘和基础设施打通传统大数据平台的监控是作业级别的——看任务有没有跑成功反推数据新鲜度。这种监控视角有个大坑数据链路长一段断了下游的SLA早就破了一小时了你才在监控图上看到异常。Kubernetes提供了从Pod、容器、节点、到集群的多层次遥测数据Prometheus加Grafana这一套已经成为事实标准。数据网格里每个数据产品的健康状态——读接口并发、管道延迟、存储水位线——统一成基础设施的指标。我们做到过这么一件事把OpenMetadata里记录的数据血缘关系和Kubernetes的Pod监控指标打通。用户问某张宽表是不是不准啊可以在血缘图上点击节点直接看到对应的任务Pod的CPU、内存、失败日志一步到位。这种血缘往下能看Infra往上能看SLO的统一可观测性视角在传统架构里想都不要想。3. 云原生数据网格参考架构一个可落地的分层分解聊完理念和底座能力说点实际的。经历了几个项目的反复调整之后我手里的参考架构大概长这样。它不一定适合每一家公司但把要点拆出来大家可以根据自己的情况做一些改造。3.1 平台平面让数据基础设施变成服务目录数据网格的自助式基础设施落到架构上就是需要一个叫平台平面的层级。它不是指某个具体服务而是一组用云原生方式封装好的基础能力通过Kubernetes统一暴露给各个领域团队。我们的平台平面大概包括这几类东西对象存储MinIO或云上的S3作为数据湖的统一底座提供低成本的海量存储跟计算完全分离。消息和事件Kafka或Redpanda作为实时数据进出的主干用Strimzi这样的Operator部署在Kubernetes里。OLAP查询引擎ClickHouse、Doris或者Trino为分析型查询提供高性能服务需要支持弹性扩缩容。元数据服务DataHub或OpenMetadata负责数据目录、血缘和Schema管理。策略服务OPA Gatekeeper加Schema Registry统一管理数据访问策略和契约。这五类能力有一个共同要求全部以Kubernetes原生的方式交付。平台团队负责把每个组件的Operator部署好、把监控接好、把文档写清楚然后以服务目录的形式开放给领域团队。领域团队使用每项能力不再是提工单让平台团队开个Kafka集群而是提交一个声明式资源描述平台自动创建。我们在内网把这套服务目录做成了一站式自助页面拉起来一条Kafka数据管道从申请到可用控制在十分钟以内这个速度在传统模式下是不可想象的。3.2 数据平面每个领域一套数据产品工厂数据平面是各个领域团队实际运行数据产品的空间在Kubernetes里就是一个又一个Namespace。一个标准数据产品的结构我们高度模板化了。它有四个标准组成部分流式入站读Kafka事件、批式加工跑Spark或Flink任务、数据存储接对象存储或OLAP引擎以及对外服务接口暴露API供下游消费。四个部分拆开都能挂到Kubernetes资源上组合起来就是一个数据产品实例。平台团队提供了一个标准的Helm Chart模板字段都是定死的产品名称、所属域、负责人、数据源位置、目标存储位置、调度周期、SLO信息、服务端口。领域团队只需要改这个Chart里的配置然后走一遍CI/CD流水线就能发布一个符合组织规范的数据产品。这一步的意义在于数据产品不再是一个模糊的概念而是一份可以版本化、可评审、可回滚的交付物。为了便于治理每个数据产品还要求暴露四类标准接口数据读写接口、事件发布订阅接口、血缘和SLO报告接口、权限审计接口。这四类接口是数据产品对外部的对接口径也是联邦治理落地的基础——审计系统只需要统一采集这些接口的信息就能掌握全公司的数据流动情况。3.3 控制平面联邦治理真正落地的位置控制平面是数据网格最容易说空话的地方。统一治理如果只停在制度层面执行起来就会走样。我们这里的实现方式是把能被系统自动执行的治理逻辑固化成代码和策略。在平台层面做几件事数据契约管理Schema Registry统一注册和校验、数据SLO监控从Prometheus指标里抓取数据新鲜度、完整性等指标设定告警、数据权限管理RBAC结合OPA策略控制谁能读哪些数据、审计追踪所有数据访问行为记录日志对接安全团队。控制平面和责任边界对应平台团队负责控制平面的运维和策略框架各域团队负责自己域内数据产品的内容治理。打卡工作时间开会讨论是谁家的表质量问题在控制平面上谁的产品挂了SLO自动告警就直接发给谁——这个过程不需要任何协调会议。3.4 数据目录与血缘如何驱动产品生命周期最后一块拼图是数据目录。为什么专门提它因为数据网格最大的风险之一是数据孤岛换个形式重来——每个域自治了但别人不知道你的域有什么数据那和没有网格有什么区别。我们把OpenMetadata部署为一个独立服务它既采集Kubernetes里数据管道的信息也采集Schema Registry和Hive Metastore的元数据能自动生成跨域的血缘关系图。血缘图是整个网格的中枢神经系统下游消费者能查到数据的来源和质量上游生产者能看到自己数据被谁用、用得怎么样。当数据产品要下线时血缘图能帮你判断是否还有在下游依赖——有了依赖关系明文记录数据销毁才敢做这是传统数据仓库时代很难完成的事情。4. 从单体湖仓迁移到网格我实测过的渐进式路径很多团队觉得数据网格改革动作太大动辄要推倒重来。如果你想全量落地那是伤筋动骨但渐进式路径是可以走的。我建议参考下面这个顺序每一步的改动范围是可控的。4.1 先做资产盘点和域划分不急着上基建最大的误区是一上来就购K8s集群、装平台组件。我们第一次就吃了这个亏集群还没配好业务团队已经因为新平台没有我现有的表而不愿意迁了。正确顺序是先做数据资产盘点现有系统里究竟有哪些数据归属哪个业务域谁是负责人质量如何被谁消费。这个盘点工作虽然无聊但它是所有后续工作的地基。域划分有个实用标准每个域有独立业务目标、有明确的数据边界、有足够的人力承担自治责任三者缺一不可。我们当时只圈了订单、用户、供应链三个域作为网格试点域其他域保持原有湖仓通道不动。这一步的产出不是麻烦的表格文档而是一份数据域与资产映射清单。它是后续所有迁移计划的输入权限划分、命名空间配额、数据模型设计都必须从这份清单出发。4.2 试点域的选择标准边界清晰、痛点强烈、团队到位试点域选得好不好几乎决定了网格项目在组织里的生死。选域的标准我们总结成三条。第一个是业务边界和数据边界清晰方便在系统里对应出一个干净Namespace。第二个是痛点强最好是数据管道交付经常被中央平台卡住的域这样改革的好处项目里所有人都感受得到。第三个是域内有懂数据、也愿意承担平台责任的技术负责人数据网格的落地很依赖领域团队的主动性和能力。我们最终选了订单域。原因很简单订单数据规模大、实时性要求高电商大促的实时大盘就是他们做的、团队技术能力强、被平台调度瓶颈折磨得最惨。试点团队自己写了一套订单数据产品的Chart模板在Kubernetes上跑通了从Kafka消费、Flink清洗、ClickHouse存储到API服务出数的完整链路。上线稳定一个月后订单域再也不喊平台团队扩容了反而是隔壁库存域的同事主动跑过来问你们怎么做到的。4.3 平台团队从运维转型为产品团队数据网格能不能走远平台团队的角色转变比技术栈升级更难更关键。原来的大数据平台组多数时间是救火队员——处理任务失败、扩容、权限审批。网格模式下他们的定位变成内创业者团队交付物不再是稳定的集群而是让领域团队能自助做数据产品的平台产品。打个比方以前他们是厨师给各部门做菜现在他们开了一家自助餐厅把灶台、食材、菜谱都摆好培训各个部门自己做饭。这个转型需要给平台团队配齐几类角色基础设施工程师玩转Kubernetes和Operator、平台SRE负责平台本身的稳定性、数据治理专家设计契约规范和SLO框架、技术写作平台文档和模板示例的交互体验优化。我们腾出了两个后端工程师专门维护自助平台门户和模板仓库并把平台本身当作一个敏捷产品版本按双周迭代。这一步的投资短期内看不见直接的业务收益但它是整个网格后续规模化的关键杠杆。4.4 数据产品的标准流水线从YAML到生产只需半小时当模板和各域自助能力都就绪后数据产品的发布流水线长这样。## 数据产品发布流水线示意图 1. 领域工程师把数据产品的Chart模板代码推到自己的Git仓库 2. CI阶段Schema校验用Schema Registry验证字段定义、静态扫描OPA策略检查、单元测试小数据集跑通管道 3. CD阶段Argo CD监听Git仓库变化自动同步到对应Namespace 4. 发布后自动创建Prometheus监控规则和SLO告警并注册到OpenMetadata目录 5. 消费者通过服务目录看到这个新产品申请权限后开始消费这套流水线跑通之后一个全新的数据产品从提交代码到可供下游消费正常情况不到半小时。这在过去是神话——申请一个Kafka topic都要审批一周。但要注意的是流水线跑通只是开始维护模板的演进才是长期工作要持续根据域团队的反馈调整模板字段和策略规则。5. 落地过程中最容易翻车的5个细节都是拿真金白银买来的教训下面这些坑不是从文档里看到的是我在真实环境里踩过的每一条都造成了线上事故或严重的资源浪费。写出来希望大家少走一轮弯路。5.1 命名空间配额的死板设计第一版我们把每个域的ResourceQuota卡得非常死——CPU按峰值预估给了上限内存给了富裕量。结果两个问题立刻暴露一是实际负载波动大配额设置要么浪费要么不够二是跨域的临时性任务比如数据科学家做实验要拉全表经常因为配额不足直接失败然后他们绕过平台去老集群跑数据资产又开始分裂。后来把配额设计成了基线突发两层基线配额是稳定的日常资源突发部分是NodePool里预留的弹性容量超额会调度到弹性节点池而不是直接拒绝。配合成本监控看板的实时可见性域团队会因为预算可见而主动优化任务写法。这比硬性配额拦人有效的多。5.2 大规模Spark任务在K8s上的动态分配陷阱跑Spark on Kubernetes时很多人图省事直接打开Spark的动态资源分配然后对Kubernetes说你看着办。结果任务高峰时Pod像疯了一样往节点池里铺一晚上把一个月预算烧掉一半任务本身反而因为排队和节点启动慢而没快多少。正确做法是别让Spark自己调度的随意性暴露给调度器用Spark OperatorsResourceDriver模式把资源请求包在Application的配置里让Operator精确控制executor数量、核数、内存这样既能充分利用Kubernetes调度能力又不至于让动态分配把集群水位打满。如果一定需要弹性宁可依赖KEDA基于队列长度触发也别让每个Spark任务自己抢资源。这条经验我们付出了两个月的加班费才换来。5.3 跨集群时延和元数据单点问题网格铺开成多集群后新问题出现了域A的Flink任务读域B的数据时数据经过网络传输时延暴涨。另一个更隐蔽的问题是Hive Metastore如果还保持单点集中式所有集群的元数据请求都打到它身上它一旦抖动全公司所有任务的Schema解析全崩。多集群架构下解决思路一般有两个方向。第一是数据本地化调度调度平台优先把计算任务调度到数据所在的集群或者节点上减少跨网络数据传输。第二是Metastore本身的分布式改造比如用云化元数据服务或支持多副本的部署方式避免单点。我们在实际项目中两个方向都做了调度策略上给跨域数据引用加了重放本地缓存机制元数据方面把Metastore做成多可用区高可用部署。折腾完之后跨集群作业的稳定性才算真正立住。5.4 成本归属必须从第一天就设计好数据网格给了每个域自治权但如果没有财务上的同等自治域团队不会有动力优化成本。我们碰到过因为没做成本归属所有域都拿公共资源池跑任务月底账单爆炸后没人认领最后平台团队背锅。Kubernetes的成本分摊解决方案现在已经很成熟了给每个Namespace打上域标签用Kubecost这样的工具把集群成本按照命名空间的资源使用量摊回来做成每个域的月度费用报表。这样每个域负责人能看到自己域的数据产品消耗了多少存储、多少计算、多少网络他们自然会优化管道调度、压缩存储格式、清理过期数据。没有成本的可视化你永远管不住冗余。5.5 组织变革绕不开系统做不了的事得靠人做最后一条最扎心数据网格落地技术只占一半另外一半是组织设计。很多团队在技术上已经做得很好了但仍然卡住——因为业务线的负责人不接受我们域要负责自己的数据产品认为这是平台团队甩锅。想解决这件事没有技术魔法只有自上而下的组织决心和持续的内部运营。要把数据产品写进各域团队的绩效考核里让域负责人既有收益也背负责任要定期搞数据产品运营会议用数据透明推动共享。我们用了差不多两个季度才让各域从被迫接活变成主动分享最佳实践这个时间成本要提前算进去。6. 我对Data Mesh加Kubernetes组合的真实评价先说结论Data Mesh没有过时Kubernetes也不是包治百病的神药但数据网格Kubernetes这套组合确实是我见过最合理的云原生大数据架构演进方向之一。Data Mesh的价值不在于分布式三个字很时髦而在于它承认了一个残酷的现实数据规模一大、业务一多单靠中央数据团队不可能既保证数据质量又保证交付速度。它把数据的责任切到底层业务团队手里让数据成为业务运营的产物而不是一个后台任务。Kubernetes的价值则是给这种切分提供了可操作的基础设施契约——域边界是命名空间数据产品是应用治理规则是策略代码弹性伸缩是KEDA和节点池成本归属是标签和报表。理念和工程在这里对齐了。当然要泼一盆冷水如果组织没有准备好让各域承担数据责任K8s用得再溜也白搭。技术把可能做到了极致剩下愿意和坚持的部分还是要靠组织去完成。这也是我最有体会的地方数据网格的瓶颈往往出现在会议室而不是出现在集群监控面板上。
返回列表