ARTICLE DETAIL

资讯详情

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

基于Kubernetes的Data Mesh落地实践:从架构理念到参考实现

基于Kubernetes的Data Mesh落地实践:从架构理念到参考实现 1. 先搞明白Data Mesh到底在解决什么问题1.1 传统大数据架构的三个死穴我在一线做数据平台的时间不算短从早期的传统数仓到后来的Hadoop生态再到所谓的湖仓一体基本都经历了一遍。先说个结论大多数公司的大数据架构问题不在技术上而在组织协作和“所有权”上。早期玩Hadoop那会儿我们建了一个集中的数据平台所有数据ETL都往这个平台里灌所有报表都从这个平台出。刚开始数据量小问题不明显。可数据规模一旦上来麻烦就接踵而至。第一个死穴是数据管道变成“意大利面条”。A团队的数据加工依赖B团队的表B团队又要等C团队凌晨跑完任务才动手。数据血缘理不清出了故障定位要三四个小时。第二个死穴是集中式数据团队成为瓶颈所有需求都要排队等平台团队排期业务部门天天催平台团队天天加班中间是各种扯皮。第三个死穴是数据质量和语义问题元数据标准不统一“用户ID”在不同部门含义不一样同一个数跑出来结果对不上信任感逐步丧失。你会发现这些问题的核心都不是“集群资源不够”而是“责任边界模糊”。数据平台越做越大数据越多可每个人都有理由说“这不归我管”。1.2 Data Mesh的核心把“平台中心”翻转成“域中心”Data Mesh是Thoughtworks的Zhamak Dehghani在前些年提出的一套数据架构范式。它最反直觉的一点是不主张构建一个集中式的“大中台”反而建议把数据和加工数据的责任下放给各个业务域。Data Mesh有四个核心原则一是领域数据所有权。每个业务域订单、用户、库存、支付等等自己负责自己的数据管道和数据集而不是把数据丢给一个中央平台团队。二是数据作为产品。每个域对外提供的数据不只是“一张表”而是一个产品。要有明确的SLA、质量指标、文档、版本控制消费方把它当作产品来接入。三是自助式数据平台。基础设施不是某个域自己搭而是平台团队提供一套“数据基础设施即服务”让每个域能自主创建、发布、运维自己的数据产品而不需要理解底层存储和集群的细节。四是联邦式计算治理。全局标准必须有但不是由一个集中团队强制执行而是通过自动化策略引擎、全局元数据目录和互惠协定把“治理”作为一种协作机制来运转。我把这套思路翻译成一句大白话以前是“数据都送到中央厨房厨师统一做菜”Data Mesh改成“每个部门都是独立餐厅中央只提供标准化的水电煤和食材供应链”。这套思路天然和Kubernetes的调度、隔离、自服务理念非常契合所以这两个词被放在一起讨论不是赶时髦而是数据架构演进的一个自然交点。2. 为什么偏偏是Kubernetes当底座2.1 云原生数据平台的三种组网路线先说一个背景这几年“云原生大数据”喊得很响但到底怎么把数据组件跑在云原生环境里路线其实分了三派。第一派是“托管的云服务派”直接用云厂商的托管Hadoop、托管Kafka、托管Spark比如AWS EMR、Confluent Cloud这些。优点是省心缺点是组件割裂、平台不统一、成本难控制而且一旦多云部署运维模型就散架了。第二派是“传统Hadoop发行版上云派”把Cloudera或者Hortonworks部署到云上的虚拟机里。本质还是老一套YARN继续管资源HDFS继续做存储只是虚拟机换成了云主机。这套方案稳定但和容器生态之间隔了一层弹性不够扩展和升级都笨重。第三派就是我今天要聊的“Kubernetes原生派”把Kafka、Spark、Trino、MinIO这些数据组件全部容器化跑在Kubernetes集群上由K8s统一管生命周期。说实话这个路线早几年还不够成熟组件和运维工具都比较折腾。但这几年生态成熟度上来之后优势非常明显尤其是做Data Mesh这种“多域自服务”的架构K8s几乎就是最顺手的底座。2.2 选K8s当底座的四个硬核理由有人会问我单独用虚拟机不也能搭数据平台吗为什么非要Kubernetes第一个硬核理由是资源隔离和弹性伸缩。数据产品天然有波峰波谷月底月初对账跑批、大促活动数据分析都是明显的资源高峰。K8s的HPA和节点弹性提供的是分钟级甚至秒级的扩缩容能力业务量下来后自动缩容、释放资源。我见过传统虚拟机方式下为了扛住月底跑批机器得常年开着CPU使用率平时不到百分之十都是白花花的成本。第二个理由是标准化和自服务。Data Mesh强调“平台自助化”K8s的Namespace、RBAC、ResourceQuota、LimitRange天然就是一套自服务租户模型。每个域拿到一个Namespace配好资源配额平台团队制定模板各个域的数据工程师可以在模板上自由发挥不用跑到平台团队开工单。Helm Chart和Operator机制则让数据产品像软件一样“发布版本、升级回滚”。第三个理由是环境一致性。传统方式下开发环境的Hadoop版本和线上差一个小版本可能就导致任务运行时行为不一致。而Kubernetes加容器镜像从构建到生产环境一字不差地带过去数据管道的可复现性直接上升一个级别。第四个理由是组件生态的成熟度。这几年各大开源数据项目基本都主动向Kubernetes靠拢Kafka有Strimzi和Confluent OperatorSpark和Flink原生支持Kubernetes调度器Trino有Helm ChartMinIO天然对接S3协议。就连元数据目录、调度编排这类辅助组件也都能在云原生生态里找到成熟方案。生态这件事太重要了没有一个成熟的组件生态光有一个“完美的架构理念”是落不了地的。3. 把Data Mesh落到K8s一套可复制的参考架构3.1 五层拓扑从基础设施到业务域的职责划分天天讲理念没用重点是能落地。我自己梳理出一套在Kubernetes上实现Data Mesh的参考架构你可以在自己的环境里照着搭。从底往上分五层。第一层是核心基础设施层。这就是Kubernetes集群本身加上节点、存储比如用TopoLVM做本地卷用Ceph做持久存储、网络Calico或Cilium、Ingress。这一层由平台基础设施团队负责。第二层是数据基础服务层即平台团队需要统一提供的能力。包括对象存储MinIO或者Ceph RGW、消息中间件Kafka、调度引擎以及后续会用到的元数据目录。这一层也是平台团队集中运维的但它不直接拥有具体业务数据。第三层是数据计算服务层。包括执行批处理任务的Spark或者Flink、做交互式查询的Trino、做流处理的引擎等。这一层应该以“服务目录”的方式暴露给各域域团队只需要提交计算任务不需要关心计算资源是怎么调度的。第四层是数据产品发布层。各业务域在自己的Namespace里按统一模板创建“数据产品服务”。一个数据产品可以是一个Helm Chart构建的Deployment对外暴露HTTP API也可以是存储在对象存储里的一张表加数据质量报告后者通过Trino和元数据目录来管理。第五层是治理与联邦控制层。用Open Policy Agent加元数据目录加上全局的SLA和数据质量检查框架全局策略以“策略即代码”的形式下发到所有域。3.2 组件选型清单哪些项目是“闭眼入”哪些需要慎重直接给你一份我实测下来的选型参考表既能覆盖Data Mesh的保存、计算、治理需求又能和Kubernetes无缝集成。功能需要推荐组件成熟度watch注意点对象存储MinIO单集群Ceph RGW多集群高MinIO的桶和而治之策略要和域对应起来消息中间件Kafka Strimzi Operator高Strimzi对Topic权限、User认证管理很友好批处理Spark on Kubernetes原生调度器中高Dependency要打镜像里动态分配需要额外配置流处理Flink Kubernetes Operator中高Flink的StatefulSet重启策略要谨慎配置交互式查询Trino 各域catalog高catalog映射到MinIO注意内存管理编排调度Airflow on K8s高KubernetesExecutor下DAG即Pod灵活但调度开销大元数据目录开源DataHub / 自研元数据库中必须包含数据产品Owner、SLA、血缘关系策略引擎OPAOpen Policy Agent高和K8s Admission Controller配合最顺选型上最想提醒的是两点不要在对象存储上搞“私有化协议”要选至少兼容S3 API的组件否则将来数据迁移和跨云复制会很痛苦不要因为某个组件是“最热门的网红项目”就直接上生产先在测试集群和K8s的Pod安全策略、多租户兼容性打磨一轮再上。3.3 按照方案落地一台测试机器上搭一个“迷你数据网格”接下来我带你一步步在Kubernetes里搭一个最小可运行的“数据网格”例子你可以在自己的机器上用kind或者k3s完成全部操作。下面步骤我实测过顺序按依赖关系来错了容易绕弯路。第一步起一个Kubernetes集群。本地开发我推荐k3s因为轻量一个命令就搞定资源占用也小。如果机器内存只有8G记得给k3s加--memory限制避免吃满物理内存导致宿主机卡死。curl -sfL https://get.k3s.io | sh -第二步部署MinIO对象存储。因为Data Mesh里各域的数据最终都是落到对象存储上的所以这个得先到位。用Helm装最快helm repo add minio https://helm.min.io/ helm install minio minio/minio -n minio-system --create-namespace --set rootUseradmin,rootPasswordchange-me装完之后把MinIO的S3 endpoint暴露到集群内比如minio.minio-system.svc.cluster.local:9000后面所有组件都往这个地址写入和读取数据。第三步部署Strimzi管理Kafka。Kafka在数据网格里负责做流式数据的接入和域间消息传递。Strimzi的优点是把Kafka的部署变成CRD你只需要定义Kafka和KafkaTopic的YAML它自动帮你拉起来一个高可用的集群。kubectl create -f - EOF apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name:>
返回列表