Kiến trúc tổng quan và yêu cầu tài nguyên cho Data Mesh
Trước khi triển khai, bạn cần xác định rõ các thành phần chính trong kiến trúc Data Mesh để phân bổ tài nguyên Kubernetes chính xác. Mô hình này bao gồm Data Platform (Kubernetes + Iceberg), Data Engineering (dbt), và Data Consumers (Business Units).
Với môi trường phát triển (Dev/Staging) trên một máy chủ vật lý hoặc VPS, yêu cầu tối thiểu là 8 CPU cores và 16GB RAM. Nếu triển khai trên Cloud (EKS/GKE), hãy sử dụng node group với instance type t3.large hoặc m5.large để đảm bảo hiệu năng cho các tác vụ Spark và dbt.
Yêu cầu phần cứng và cấu hình Node
Bạn cần đảm bảo mỗi Node trong Kubernetes Cluster có đủ dung lượng RAM để chạy container của Apache Iceberg REST Catalog và dbt runner. Thiếu RAM sẽ gây lỗi OOMKilled ngay khi khởi động các dịch vụ này.
Cấu hình đề xuất cho một cluster 3 node (1 control-plane, 2 worker):
- Control Plane: 2 CPU, 4GB RAM
- Worker Nodes: 4 CPU, 16GB RAM (Cần thiết để chạy Spark/Iceberg và dbt cùng lúc)
- Disk: SSD NVMe, tối thiểu 100GB mỗi node
Triển khai Kubernetes Cluster và công cụ quản lý
Bước đầu tiên là thiết lập môi trường Kubernetes. Hướng dẫn này sử dụng Minikube để mô phỏng môi trường Kubernetes trên máy local, giúp bạn cài đặt và test nhanh chóng mà không cần chi phí cloud. Nếu ở môi trường production, các command tương tự sẽ áp dụng cho EKS/GKE với kubectl.
Cài đặt Minikube và khởi tạo Cluster
Chúng ta sẽ khởi tạo cluster với driver Docker để tận dụng container engine có sẵn. Cần chỉ định số CPU và RAM tối thiểu cho cluster để đảm bảo các workload sau này chạy mượt mà.
Thao tác khởi tạo cluster với 4 CPU và 16GB RAM:
minikube start --driver=docker --cpus=4 --memory=16144 --kubernetes-version=v1.28.0 --profile=data-mesh-dev
Kết quả mong đợi: Minikube khởi tạo xong, hiển thị "Kubernetes is available at" và IP address của API server.
Cài đặt Helm và cấu hình kubectl
Helm là package manager cho Kubernetes, cần thiết để triển khai các chart phức tạp như Iceberg REST Catalog. Bạn cần cài đặt cả client và thêm repository chính thức.
Cài đặt Helm trên Linux (Ubuntu/Debian):
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash
Thêm repository Helm cho các chart liên quan đến Data:
helm repo add apache https://apache.github.io/iceberg-k8s
helm repo update
Kết quả mong đợi: Helm được cài đặt thành công và repository "apache" được thêm vào danh sách.
Triển khai Apache Iceberg trên Object Storage (S3)
Apache Iceberg cần một Catalog để quản lý metadata của các table. Trong kiến trúc Data Mesh, chúng ta sử dụng REST Catalog để trung tâm hóa việc quản lý, cho phép nhiều team truy cập vào cùng một storage (S3/ADLS) một cách an toàn.
Trước khi deploy Iceberg, bạn cần chuẩn bị bucket S3 (hoặc tương đương trên Minikube là một folder local được mount). Hướng dẫn này giả định bạn đã có bucket S3 với quyền truy cập.
Cấu hình Secrets cho AWS/S3
Để Iceberg Catalog kết nối với S3, bạn cần lưu trữ Access Key và Secret Key dưới dạng Kubernetes Secret. Đây là bước bắt buộc để xác thực.
Tạo file secret-config.yaml với nội dung sau (thay thế các giá trị bằng key thật của bạn):
cat > /tmp/iceberg-s3-secret.yaml
Kết quả mong đợi: File YAML được tạo thành công tại /tmp/iceberg-s3-secret.yaml.
Tạo namespace và apply secret:
kubectl create namespace data-mesh
kubectl apply -f /tmp/iceberg-s3-secret.yaml -n data-mesh
Kết quả mong đợi: Namespace "data-mesh" được tạo và Secret "iceberg-s3-credentials" được apply.
Deploy Iceberg REST Catalog với Helm
Chúng ta sẽ deploy Iceberg REST Catalog để đóng vai trò là metadata server. Catalog này sẽ hướng các client (dbt, Spark) đến đúng location của data trong S3.
Tạo file values.yaml để cấu hình Iceberg kết nối với S3 và sử dụng REST API:
cat > /tmp/iceberg-values.yaml
Deploy Iceberg Catalog vào cluster:
helm install iceberg-catalog apache/iceberg-k8s -f /tmp/iceberg-values.yaml -n data-mesh
Kết quả mong đợi: Helm deploy thành công, hiển thị status "deployed" và thông tin về service IP.
Verify kết quả Iceberg Catalog
Kiểm tra xem pod của Iceberg REST Catalog đã chạy và sẵn sàng chưa:
kubectl get pods -n data-mesh -l app=iceberg-rest-catalog
Đợi pod đạt trạng thái "Running", sau đó kiểm tra logs để đảm bảo catalog đã load config S3 thành công:
kubectl logs -n data-mesh -l app=iceberg-rest-catalog --tail=20
Kết quả mong đợi: Pod ở trạng thái Running và logs không có lỗi "Connection refused" hoặc "AccessDenied".
Cài đặt và cấu hình dbt kết nối với Iceberg
dbt là công cụ chuẩn hóa dữ liệu trong Data Mesh. Để dbt có thể đọc ghi trực tiếp vào Iceberg, chúng ta cần sử dụng adapter cụ thể (iceberg-adapter) hoặc cấu hình dbt để tương tác qua Spark Trino/Presto.
Trong phần này, chúng ta sẽ cài đặt dbt-core local và cấu hình profile để kết nối tới Iceberg Catalog đã deploy ở bước trên thông qua REST API (giả lập môi trường thực tế).
Thiết lập môi trường Python và cài đặt dbt
Bạn cần cài đặt Python 3.9+ và dbt-core cùng với adapter tương thích. Lưu ý: Hiện tại adapter trực tiếp cho Iceberg REST trong dbt-core đang phát triển, hướng dẫn này sử dụng cấu hình chuẩn để tương thích với Spark/Trino truy xuất Iceberg.
Cài đặt dbt-core và các dependencies cần thiết:
pip install dbt-core dbt-postgres dbt-spark
Tạo thư mục dự án dbt:
mkdir -p /home/user/data-mesh-project && cd /home/user/data-mesh-project
Cấu hình dbt_project.yml và profiles.yml
File dbt_project.yml định nghĩa cấu trúc dự án và các biến môi trường. File profiles.yml chứa thông tin kết nối tới Iceberg Catalog.
Tạo file dbt_project.yml với nội dung:
cat > /home/user/data-mesh-project/dbt_project.yml
Tạo file profiles.yml để cấu hình kết nối. Lưu ý: dbt cần biết địa chỉ REST Catalog của Iceberg để thực thi SQL.
cat > /home/user/.dbt/profiles.yml
Thay thế bằng IP của service Iceberg đã lấy từ bước trước (kubectl get svc -n data-mesh).
Kết quả mong đợi: Các file cấu hình được tạo chính xác, không lỗi cú pháp YAML.
Kế hoạch phân quyền và mô hình Data Product
Trong Data Mesh, mỗi đơn vị kinh doanh (Business Unit) là một Domain riêng. Bạn cần thiết kế mô hình Data Product để dữ liệu được đóng gói, versioning và chia sẻ an toàn.
Mô hình phân quyền dựa trên Namespace (Domain)
Chúng ta sẽ sử dụng Namespace trong Iceberg Catalog để tách biệt dữ liệu theo Domain. Ví dụ: Domain "Sales" sẽ có namespace "sales", Domain "Marketing" có "marketing".
Cấu trúc Data Product đề xuất:
- Namespace: {domain-name} (Ví dụ: sales)
- Table: {product-name}_{version} (Ví dụ: daily_sales_summary_v1)
- Metadata: Chứa thông tin về owner, SLA, contact person trong comment của table.
Xây dựng chính sách bảo mật (RBAC)
Để đảm bảo an toàn, bạn cần cấu hình chính sách truy cập. Iceberg REST Catalog hỗ trợ RBAC. Bạn sẽ định nghĩa các Role: Data Product Owner (Read/Write), Data Consumer (Read Only).
Định nghĩa chính sách trong file policy.yaml (sử dụng ví dụ cấu hình giả định cho Iceberg REST Catalog):
cat > /tmp/iceberg-rbac-policy.yaml
Áp dụng chính sách này vào Iceberg Catalog (thông qua mount hoặc config map tùy theo deployment cụ thể):
kubectl apply -f /tmp/iceberg-rbac-policy.yaml -n data-mesh
Kết quả mong đợi: ConfigMap được tạo thành công, sẵn sàng để Iceberg Catalog load và enforce các quy tắc truy cập.
Verify kế hoạch Data Product
Kiểm tra xem bạn có thể tạo một Namespace mới trong Catalog để đại diện cho một Domain mới chưa.
Thực hiện lệnh tạo namespace (giả sử qua REST API hoặc CLI Iceberg):
curl -X POST http://:8080/v1/catalogs/demo-catalog/namespaces \
-H "Content-Type: application/json" \
-d '{"namespace': ["finance"]}'
Kết quả mong đợi: Response 200 OK, namespace "finance" được tạo thành công trong catalog, xác nhận kiến trúc phân quyền đang hoạt động.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Data Mesh phi tập trung với Apache Iceberg, dbt và Kubernetes để chia sẻ dữ liệu an toàn giữa các đơn vị kinh doanh
Phần 2: Thiết lập hạ tầng Apache Iceberg và quản lý Catalog »