Xác định yêu cầu phần cứng và chuẩn bị hạ tầng vật lý
Để vận hành ổn định nền tảng Multi-Tenant với Kubernetes, Falco, OPA và Apache Iceberg, bạn cần phân bổ tài nguyên tính toán và lưu trữ theo tiêu chuẩn tối thiểu sau.
Yêu cầu CPU và RAM cho Control Plane (Master) và Worker Nodes:
- Control Plane: Tối thiểu 4 vCPU và 8GB RAM để xử lý các request API và chạy các controller (etcd, kube-apiserver).
- Worker Nodes: Tối thiểu 4 vCPU và 16GB RAM mỗi node. Cần dư RAM để chạy container tenant, pod Falco, pod OPA và catalog service của Iceberg.
- Storage: Tối thiểu 100GB NVMe SSD cho hệ điều hành và container runtime. Iceberg cần lưu trữ riêng (Object Storage).
Thực hiện kiểm tra tài nguyên hiện có trên máy chủ Linux (node master) để đảm bảo đáp ứng tiêu chuẩn.
free -h && lscpu && df -h
Kết quả mong đợi: Tổng RAM >= 24GB (cho cụm 1 master + 2 worker), CPU >= 12 vCPU, và dung lượng trống trên phân vùng root >= 100GB.
Cài đặt và cấu hình Kubernetes (Kubeadm)
Chúng ta sử dụng Kubeadm để khởi tạo cụm Kubernetes tự quản (Self-managed) trên Linux, phù hợp nhất cho môi trường thực tế cần kiểm soát chi tiết. Phiên bản Kubernetes được khuyến nghị là v1.28 trở lên để hỗ trợ tốt cho OPA Gatekeeper và các tính năng security mới.
Trên tất cả các node (Master và Worker), thực hiện cài đặt container runtime (containerd) và công cụ quản lý kubernetes.
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl containerd
sudo systemctl enable --now containerd
Kết quả mong đợi: Các gói kubelet, kubeadm, kubectl và containerd được cài đặt thành công, dịch vụ containerd đang chạy (active).
Cấu hình containerd để sử dụng CNI plugins và runtime mặc định phù hợp với Kubernetes.
sudo mkdir -p /etc/containerd
sudo containerd config default > /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
Kết quả mong đợi: File cấu hình containerd đã được cập nhật, dịch vụ containerd khởi động lại thành công.
Khởi tạo Control Plane trên node Master. Chúng ta chỉ định mạng Pod và mạng Service để tránh xung đột với network infrastructure hiện có.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
Kết quả mong đợi: Xuất hiện thông báo "Your Kubernetes control-plane has initialized successfully!" kèm theo lệnh join cho worker nodes.
Trên node Master, cấu hình môi trường để kubectl có thể truy cập API server ngay lập tức.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
Kết quả mong đợi: Node Master có trạng thái "NotReady" vì chưa cài đặt CNI plugin. Đây là trạng thái bình thường ở bước này.
Triển khai CNI Plugin (Weave Net hoặc Calico) để kết nối mạng giữa các Pod. Ở đây chọn Weave Net cho tính đơn giản và tốc độ setup nhanh.
kubectl apply -f "https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml"
Kết quả mong đợi: Các pod của weave-net được tạo ra trong namespace kube-system. Sau 1-2 phút, lệnh `kubectl get nodes` sẽ trả về trạng thái "Ready" cho tất cả nodes.
Thiết kế sơ đồ kiến trúc phân tầng
Nền tảng Multi-Tenant cần được phân tách rõ ràng thành 3 tầng để đảm bảo tính bảo mật và khả năng mở rộng: Control Plane, Data Plane và Security Layer.
Tầng 1: Control Plane (Quản lý tài nguyên)
Tầng này bao gồm Kubernetes API Server, Etcd, Scheduler và Controller Manager. Nhiệm vụ là quản lý vòng đời của tenant (onboarding/offboarding) và phân bổ tài nguyên (ResourceQuota, LimitRange).
Trong kiến trúc này, mỗi Tenant sẽ được ánh xạ vào một Kubernetes Namespace riêng biệt. Control Plane sẽ áp dụng các chính sách OPA Gatekeeper để kiểm duyệt các yêu cầu tạo resource vào các Namespace này.
Tầng 2: Data Plane (Xử lý và Lưu trữ dữ liệu)
Tầng này chứa các Pod thực thi ứng dụng của tenant và các thành phần xử lý dữ liệu (Apache Iceberg Catalog, Trino/Spark). Dữ liệu thực tế không nằm trên đĩa của Kubernetes node mà được trỏ đến Object Storage (S3/GCS) thông qua Iceberg Table.
Iceberg đóng vai trò là lớp metadata abstraction, cho phép nhiều tenant truy cập vào cùng một data lake nhưng chỉ được phép thao tác trên các partition/table được phân quyền cho tenant đó.
Tầng 3: Security Layer (Bảo mật và Giám sát)
Tầng này bao gồm OPA Gatekeeper (chặn request không tuân thủ), Falco (giám sát runtime behavior) và Vault/KMS (quản lý key). Security Layer chạy song song với Control Plane và Data Plane, không can thiệp vào luồng xử lý dữ liệu nhưng có quyền chặn hoặc cảnh báo.
Falco sẽ được cài đặt ở chế độ sidecar hoặc daemonset trên mỗi node để phát hiện các hành vi bất thường của container tenant, như truy cập file system nhạy cảm hoặc tạo socket mới trái phép.
Chuẩn bị tài khoản và cấu hình Cloud Storage cho Iceberg Catalog
Apache Iceberg cần một nơi để lưu trữ Catalog (metadata về bảng) và một nơi để lưu trữ dữ liệu thực tế (data files). Chúng ta sẽ sử dụng AWS S3 làm Object Storage. Nếu không có AWS, bạn có thể dùng MinIO hoặc GCS với cấu hình tương tự.
Tạo Bucket S3 và cấu hình IAM Policy
Trước tiên, tạo một bucket S3 để chứa dữ liệu Iceberg. Tên bucket nên có định dạng chuẩn để dễ quản lý, ví dụ: `company-iceberg-data-lake`.
aws s3 mb s3://company-iceberg-data-lake --region us-east-1
Kết quả mong đợi: Thông báo "Bucket created" kèm URL bucket.
Tạo IAM Role (hoặc User) cho Kubernetes Cluster để truy cập bucket này. Role này cần quyền `s3:GetObject`, `s3:PutObject`, `s3:DeleteObject`, `s3:ListBucket` trên bucket trên.
cat
Kết quả mong đợi: Policy được tạo thành công, xuất hiện ARN của policy.
Cấu hình Iceberg Catalog trong Kubernetes
Chúng ta sẽ sử dụng REST Catalog Server của Iceberg (hoặc Glue Catalog nếu dùng AWS Glue, nhưng REST Catalog linh hoạt hơn cho multi-tenant). Dưới đây là file cấu hình `values.yaml` để triển khai Iceberg REST Catalog qua Helm Chart.
File cấu hình này sẽ được dùng để deploy Catalog Server vào Kubernetes, kết nối với S3 bucket đã tạo.
cat
Kết quả mong đợi: File `/etc/iceberg/catalog-values.yaml` được tạo với nội dung hoàn chỉnh.
Trước khi deploy, tạo Kubernetes Secret chứa credentials AWS để Catalog Server có thể truy cập S3. Thay thế các giá trị `AWS_ACCESS_KEY_ID` và `AWS_SECRET_ACCESS_KEY` bằng giá trị thực tế của bạn.
kubectl create secret generic iceberg-s3-creds \
--from-literal=AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY \
--from-literal=AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY \
--namespace=iceberg
Kết quả mong đợi: Secret `iceberg-s3-creds` được tạo trong namespace `iceberg`.
Triển khai Iceberg REST Catalog vào Kubernetes. Chúng ta sẽ dùng Helm chart chính thức hoặc deploy trực tiếp từ file values.yaml trên nếu chưa cài Helm. Giả sử bạn đã có Helm, lệnh deploy sẽ như sau:
helm repo add iceberg https://tabulario.github.io/helm-charts
helm repo update
helm install iceberg-catalog iceberg/iceberg-rest-catalog \
--namespace iceberg \
--create-namespace \
-f /etc/iceberg/catalog-values.yaml \
--set properties.s3.access-key-idFromSecret=iceberg-s3-creds \
--set properties.s3.secret-access-keyFromSecret=iceberg-s3-creds \
--set properties.s3.access-key-idSecretKey=AWS_ACCESS_KEY_ID \
--set properties.s3.secret-access-keySecretKey=AWS_SECRET_ACCESS_KEY
Kết quả mong đợi: Pod `iceberg-catalog` được tạo trong namespace `iceberg` và chuyển sang trạng thái `Running` sau khoảng 1-2 phút.
Verify kết quả tổng thể
Thực hiện các bước kiểm tra sau để đảm bảo toàn bộ nền tảng đã sẵn sàng cho Phần 2 (Triển khai Namespace và Resource Quota).
- Kiểm tra trạng thái các node trong cụm Kubernetes:
kubectl get nodes. Tất cả node phải có trạng thái Ready.
- Kiểm tra các thành phần hệ thống trong namespace kube-system:
kubectl get pods -n kube-system. Không có pod nào ở trạng thái CrashLoopBackOff hoặc Error.
- Kiểm tra dịch vụ Iceberg Catalog:
kubectl get pods -n iceberg. Pod catalog phải đang Running.
- Kiểm tra khả năng kết nối đến Catalog Server từ bên trong cluster:
kubectl run test-iceberg --image=curlimages/curl --rm -it --restart=Never -- curl http://iceberg-catalog.iceberg.svc.cluster.local:8080/v1/config. Kết quả trả về JSON cấu hình catalog thành công.
Đảm bảo bạn đã lưu lại ARN của IAM Policy và endpoint của Iceberg Catalog để sử dụng trong các phần tiếp theo của series.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Secure Multi-Tenant Data Platform với Kubernetes, Falco, OPA và Apache Iceberg để bảo vệ dữ liệu doanh nghiệp trong môi trường chia sẻ tài nguyên
Phần 2: Triển khai Kubernetes với cơ chế Namespace và Resource Quota cho Multi-Tenant »