Yêu cầu cấu hình phần cứng cho Kafka, Flink và ClickHouse
Để đảm bảo hệ thống Real-time Analytics hoạt động ổn định, bạn cần phân bổ tài nguyên CPU và RAM cụ thể cho từng thành phần dựa trên kiến trúc 3-node cluster (1 Master, 2 Worker).
Kafka yêu cầu bộ nhớ RAM lớn để đệm (buffer) dữ liệu và disk I/O tốc độ cao. Flink cần nhiều core CPU cho các task manager xử lý stream song song. ClickHouse tối ưu hóa tốt trên CPU mạnh nhưng cần RAM để caching các bảng dữ liệu lớn.
Cấu hình tối thiểu cho một node Worker (chạy Kafka, Flink TaskManager, ClickHouse) như sau:
- CPU: 8 vCPU (Tối thiểu 4 vCPU cho môi trường dev).
- RAM: 16 GB (Tối thiểu 8 GB). Kafka cần 2-4GB, Flink 4-6GB, ClickHouse 4-6GB.
- Disk: 100 GB SSD NVMe. Bắt buộc dùng SSD, không dùng HDD cho Kafka và ClickHouse để đảm bảo latency thấp.
- Network: 1 Gbps, latency < 5ms giữa các node.
Node Master (chạy Control Plane, Flink JobManager, ClickHouse Keeper/Zookeeper) cần cấu hình cân bằng hơn:
- CPU: 4 vCPU.
- RAM: 8 GB.
- Disk: 50 GB SSD.
Verify cấu hình phần cứng bằng lệnh:
cat /proc/cpuinfo | grep processor | wc -l
Kết quả: Trả về số lượng logical CPU cores.
free -h
Kết quả: Hiển thị tổng dung lượng RAM (total) và RAM còn trống (available).
lsblk -o NAME,SIZE,TYPE,FSTYPE
Kết quả: Hiển thị danh sách disk, kích thước và loại (partitions). Đảm bảo disk chính là SSD.
Cài đặt Docker Engine và kubectl trên máy chủ
Trước khi triển khai Kubernetes, bạn cần cài đặt Docker Engine (runtime) và kubectl (client) trên tất cả các node (Master và Worker) để quản lý container và cluster.
Trên hệ điều hành Ubuntu 20.04/22.04 hoặc CentOS 7/8, thực hiện cài đặt Docker Engine chính chủ thay vì dùng package mặc định của distro.
Cập nhật repository và cài đặt các dependency cần thiết:
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release
Kết quả: Các gói hệ thống cơ bản được cài đặt thành công.
Thêm GPG key của Docker vào hệ thống:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Kết quả: File keyring được tạo tại /usr/share/keyrings/.
Cấu hình repository Docker:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Kết quả: Source list Docker được ghi vào file cấu hình apt.
Cài đặt Docker Engine, CLI, và Containerd:
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Kết quả: Docker được cài đặt xong. Kiểm tra version:
docker --version && docker info | grep "Server Version"
Kết quả: Hiển thị version Docker Engine đang chạy.
Để kubectl có thể giao tiếp với Docker, cần cấu hình Docker socket hoặc thêm user vào group docker:
sudo usermod -aG docker $USER && newgrp docker
Kết quả: Bạn có thể chạy lệnh docker mà không cần sudo.
Cài đặt kubectl client. Tải binary từ trang chính thức của Kubernetes:
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/
Kết quả: kubectl được cài đặt vào /usr/local/bin/.
Verify kubectl đã sẵn sàng (sẽ lỗi nếu chưa có cluster, nhưng lệnh phải chạy được):
kubectl version --client
Kết quả: Hiển thị version của kubectl client.
Khởi tạo cụm Kubernetes với Minikube
Để bắt đầu nhanh chóng trên môi trường development hoặc testing, chúng ta sử dụng Minikube. Minikube khởi tạo một single-node cluster chạy Docker container, đủ để test các thành phần Kafka, Flink, ClickHouse trước khi up lên production.
Cài đặt Minikube driver và binary:
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
Kết quả: Binary minikube được cài đặt vào /usr/local/bin/.
Khởi tạo cluster Minikube với driver Docker, cấp phát 4 CPU và 8GB RAM cho node để đảm bảo đủ tài nguyên cho Kafka và ClickHouse:
minikube start --driver=docker --cpus=4 --memory=8192 --container-runtime=containerd
Kết quả: Minikube khởi tạo cluster, pull image Kubernetes và start control plane. Chờ đến khi thấy "Kubernetes is available at...".
Verify cluster đang hoạt động:
kubectl get nodes
Kết quả: Hiển thị 1 node với trạng thái "Ready".
Cài đặt Kubernetes Dashboard để có giao diện quản lý trực quan:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
Kết quả: Các resource của dashboard được tạo trong namespace kubernetes-dashboard.
Đăng nhập vào dashboard bằng token:
minikube dashboard
Kết quả: Trình duyệt web tự động mở ra trang Dashboard Kubernetes.
Tạo service account và cluster role binding để truy cập dashboard bằng token (an toàn hơn):
kubectl create serviceaccount admin-user && kubectl create clusterrolebinding admin-user-binding --clusterrole=cluster-admin --serviceaccount=default:admin-user
Kết quả: Service account và binding được tạo.
Lấy token để đăng nhập:
kubectl -n default describe secret $(kubectl -n default get secret | grep admin-user | awk '{print $1}') | grep token | awk '{print $2}'
Kết quả: Trả về chuỗi token dài dùng để paste vào ô login của Dashboard.
Cấu hình quyền truy cập và Network Policy cơ bản
Trong môi trường production, việc bảo mật network là bắt buộc. Mặc dù Minikube chạy trên local, bạn cần thiết lập Network Policy để mô phỏng môi trường thực tế, ngăn chặn truy cập trái phép vào các pod.
Trước tiên, cài đặt CNI (Container Network Interface) hỗ trợ Network Policy. Minikube mặc định dùng CNI nhưng cần kích hoạt hoặc cài đặt plugin cụ thể. Với Minikube, ta dùng Calico hoặc Cilium. Ở đây dùng Calico cho tính tương thích cao.
Cài đặt Calico network policy plugin:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml
Kết quả: Pod calico-node và calico-kube-controllers được tạo trong namespace kube-system.
Verify Calico đã hoạt động:
kubectl get pods -n kube-system | grep calico
Kết quả: Hiển thị các pod của Calico ở trạng thái "Running".
Tạo Network Policy mặc định để chặn tất cả traffic vào các pod trừ khi được phép (Deny All by Default):
cat
Kết quả: NetworkPolicy "default-deny-all" được tạo trong namespace default. Bây giờ mọi pod mới tạo sẽ không thể nhận traffic từ bên ngoài trừ khi có policy cho phép.
Để Kafka, Flink và ClickHouse giao tiếp với nhau, bạn cần tạo Network Policy cho phép traffic nội bộ (Intra-namespace communication):
cat
Kết quả: Policy "allow-intra-namespace" được tạo. Các pod trong cùng namespace "default" có thể talk với nhau, nhưng vẫn bị chặn từ bên ngoài namespace.
Verify Network Policy đã (có hiệu lực):
kubectl get networkpolicies
Kết quả: Hiển thị danh sách 2 policies vừa tạo.
Tạo một pod test để kiểm tra connectivity (chạy một container sleep):
kubectl run test-pod --image=busybox:1.28 --rm -it --restart=Never -- sleep 3600
Kết quả: Bạn vào được shell của pod test-pod.
Trong shell của test-pod, ping đến một pod khác (nếu có) hoặc kiểm tra network namespace:
ping -c 4 kubernetes.default.svc
Kết quả: Nếu Calico hoạt động đúng và policy cho phép, ping sẽ thành công (reply from IP service).
Thoát khỏi pod test và xóa nó:
exit
Kết quả: Pod test-pod bị xóa (do flag --rm).
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống Real-time Analytics và Stream Processing với Apache Kafka, Flink và ClickHouse trên Kubernetes
Phần 2: Triển khai Apache Kafka trên Kubernetes với Strimzi Operator »