1. Kiến trúc Data Fabric và Vai trò của Iceberg - Trino
Khái niệm: Data Fabric là một kiến trúc tích hợp dữ liệu dùng phần mềm để tự động hóa việc phát hiện, kết nối và quản lý dữ liệu phân tán trên nhiều nền tảng (Cloud, On-premise) thành một nguồn dữ liệu thống nhất.
Vai trò Apache Iceberg: Đóng vai trò là "Table Format" hiện đại, cung cấp tính năng ACID, Time Travel, Schema Evolution cho dữ liệu thô (raw data) lưu trữ trên Object Storage, giúp xóa bỏ sự phụ thuộc vào Catalog cũ kỹ.
Vai trò Trino: Đóng vai trò là "Distributed SQL Engine", truy vấn dữ liệu trực tiếp trên Iceberg mà không cần di chuyển dữ liệu (No ETL), hỗ trợ nhiều nguồn dữ liệu khác nhau trong cùng một truy vấn.
Lợi ích tích hợp: Kết hợp Iceberg và Trino trên Kubernetes giúp tạo ra một Data Lakehouse linh hoạt, có khả năng mở rộng (scalable), chi phí thấp và hỗ trợ truy vấn tức thời cho cả batch và interactive analytics.
Verify kiến trúc
Đảm bảo bạn đã nắm rõ luồng dữ liệu: Data Source → Object Storage (S3/MinIO) → Iceberg Catalog → Trino → BI/Analytics Tool.
2. Yêu cầu tài nguyên và Phần cứng cho Kubernetes Cluster
Mục tiêu: Xác định cấu hình tối thiểu để chạy cụm Kubernetes ổn định cho bài lab này, tránh lỗi OutOfMemory (OOM) khi khởi động các pod Trino/Iceberg sau này.
Cấu hình đề xuất (Local Development/Minikube):
- CPU: Tối thiểu 4 Core (4 vCPU).
- RAM: Tối thiểu 8 GB (Khuyên dùng 16 GB để chạy Trino + Iceberg REST Catalog đồng thời).
- Storage: 20 GB SSD trống cho container images và local storage.
- OS: Linux (Ubuntu 22.04 LTS hoặc CentOS Stream 9).
Cấu hình đề xuất (Production/EKS/GKE):
- Control Plane: 3 nodes (Managed).
- Worker Nodes: 3 nodes loại m5.large (AWS) hoặc n2-standard-4 (GCP), mỗi node 2 vCPU / 8 GB RAM.
Lý do: Trino cần nhiều bộ nhớ cho bộ nhớ đệm (memory cache) của query, Iceberg REST Catalog cần CPU để xử lý metadata. Thiếu RAM sẽ khiến pod bị kill liên tục.
Verify tài nguyên
Chạy lệnh kiểm tra RAM và CPU trên máy chủ:
free -h && lscpu | grep "Core(s)"
Kết quả mong đợi: Tổng RAM >= 8GB và Core(s) >= 4. Nếu nhỏ hơn, hãy nâng cấp hoặc giảm số lượng node worker.
3. Cài đặt và Cấu hình Kubernetes Cluster (Minikube)
Mục tiêu: Khởi tạo cụm Kubernetes local để phát triển, sử dụng Minikube với driver Docker và driver containerd để mô phỏng môi trường production.
Thiết lập tham số: Cấu hình Minikube để sử dụng đủ RAM và CPU đã yêu cầu ở phần trên, đồng thời kích hoạt thêm các addon cần thiết như metrics-server.
minikube start --driver=docker --cpus=4 --memory=8192 --disk-size=20g --kubernetes-version=v1.28.0
Khởi động thêm addon metrics-server: Cần thiết để xem resource usage (CPU/RAM) của các pod sau này.
minikube addons enable metrics-server
Cấu hình context: Đảm bảo kubectl trỏ đúng vào cluster vừa tạo.
kubectl config use-context minikube
Verify Kubernetes
Kiểm tra trạng thái các node trong cluster:
kubectl get nodes
Kết quả mong đợi: Thấy 1 node với trạng thái Ready.
Kiểm tra phiên bản Kubernetes:
kubectl version --short
Kết quả mong đợi: Client và Server version hiển thị v1.28.x (hoặc tương đương).
4. Chuẩn bị Object Storage (MinIO) cho Data Fabric
Mục tiêu: Thiết lập Object Storage tương thích S3 để lưu trữ dữ liệu Iceberg. Trong môi trường local, ta dùng MinIO thay vì AWS S3 để tiết kiệm chi phí và dễ kiểm soát.
Bước 1: Tạo namespace Kubernetes: Cô lập môi trường MinIO.
kubectl create namespace data-storage
Bước 2: Cài đặt MinIO qua Helm: Sử dụng Helm chart chính thức của MinIO để deploy nhanh.
helm repo add minio https://operator.min.io/helm-charts && helm repo update
helm install minio minio/minio --namespace data-storage --set mode=distributed --set rootUser=admin --set rootPassword=minio123 --set resources.requests.memory=512Mi --set resources.requests.cpu=250m
Bước 3: Tạo Bucket cho Iceberg: Tạo bucket riêng cho catalog metadata và bucket cho data files.
mc alias set myminio http://minio.minio.svc.cluster.local:9000 admin minio123
Lưu ý: Lệnh trên cần chạy trong môi trường đã cài đặt mc (MinIO Client) hoặc dùng kubectl exec để chạy lệnh mc bên trong pod MinIO. Dưới đây là cách dùng kubectl exec để tạo bucket trực tiếp:
kubectl exec -it deploy/minio -n data-storage -- mc mb myminio/iceberg-catalog --ignore-existing
kubectl exec -it deploy/minio -n data-storage -- mc mb myminio/iceberg-data --ignore-existing
Verify Object Storage
Liệt kê các bucket đã tạo:
kubectl exec -it deploy/minio -n data-storage -- mc ls myminio
Kết quả mong đợi: Hiển thị 2 bucket: iceberg-catalog và iceberg-data.
Kiểm tra trạng thái pod MinIO:
kubectl get pods -n data-storage
Kết quả mong đợi: Pod minio-0 (hoặc tương tự) ở trạng thái Running.
5. Cài đặt các công cụ CLI cần thiết
Mục tiêu: Đảm bảo môi trường làm việc có đầy đủ các công cụ điều khiển Kubernetes (kubectl), quản lý package (helm), và xử lý JSON (jq).
1. Cài đặt kubectl (nếu chưa có):
Ubuntu/Debian:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
2. Cài đặt Helm:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
3. Cài đặt jq:
Ubuntu/Debian:
sudo apt-get update && sudo apt-get install -y jq
4. Cài đặt MinIO Client (mc) để thao tác với Object Storage:
curl https://dl.min.io/client/mc/release/linux-amd64/mc -o mc && chmod +x mc && sudo mv mc /usr/local/bin/
Verify CLI Tools
Chạy lệnh kiểm tra version của từng công cụ:
kubectl version --client --short && helm version --short && jq --version && mc version
Kết quả mong đợi: Hiển thị phiên bản của cả 4 công cụ mà không báo lỗi "command not found".
6. Cấu hình kết nối giữa Kubernetes và Object Storage
Mục tiêu: Tạo Secret trong Kubernetes chứa thông tin đăng nhập của MinIO để các pod (Iceberg Catalog, Trino) có thể truy cập Object Storage một cách an toàn.
Tạo Secret từ biến môi trường: Đây là cách chuẩn để lưu trữ credential trong Kubernetes.
kubectl create secret generic minio-creds --namespace data-storage --from-literal=access-key=admin --from-literal=secret-key=minio123
Tạo ConfigMap cho Endpoint: Lưu địa chỉ URL của MinIO để các ứng dụng khác trong cluster có thể tìm thấy.
kubectl create configmap minio-config --namespace data-storage --from-literal=minio-endpoint=http://minio.minio.svc.cluster.local:9000
Verify Configuration
Kiểm tra Secret đã được tạo:
kubectl get secret minio-creds -n data-storage -o jsonpath='{.data.access-key}' | base64 --decode && echo
Kết quả mong đợi: Hiển thị chuỗi admin.
Kiểm tra ConfigMap:
kubectl get configmap minio-config -n data-storage -o yaml
Kết quả mong đợi: File YAML hiển thị đúng endpoint http://minio.minio.svc.cluster.local:9000.
7. Tổng kết môi trường đã sẵn sàng
Trạng thái hiện tại: Bạn đã có một cụm Kubernetes hoạt động, Object Storage (MinIO) đã được deploy với 2 bucket riêng biệt, và các công cụ CLI đã được cài đặt.
Chuẩn bị cho Phần 2: Môi trường này đã sẵn sàng để triển khai Apache Iceberg REST Catalog. Các bước tiếp theo sẽ là viết file config cho Iceberg Catalog để trỏ vào bucket iceberg-catalog vừa tạo.
Kiểm tra tổng thể cuối cùng:
kubectl get all -n data-storage
kubectl get nodes
Kết quả mong đợi: Tất cả resource trong namespace data-storage đều Running và node cluster là Ready.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Data Fabric hiện đại với Apache Iceberg, Trino và Kubernetes
Phần 1: Giới thiệu kiến trúc Data Fabric và chuẩn bị môi trường Kubernetes »