Cài đặt Strimzi Operator và Custom Resource Definitions
Đầu tiên, bạn cần thêm repository Helm chính thức của Strimzi vào môi trường Kubernetes của mình để có thể truy cập các phiên bản operator mới nhất.
Việc này giúp quản lý phiên bản và nội dung cài đặt một cách tự động, tránh việc tải file YAML thủ công dễ bị lỗi phiên bản.
helm repo add strimzi https://strimzi.io/charts/
Kiểm tra xem repository đã được thêm thành công chưa bằng cách liệt kê các repo Helm.
helm repo update
Bây giờ, bạn sẽ cài đặt Strimzi Operator vào namespace mặc định (hoặc namespace đã tạo ở phần 1) bằng Helm. Command này sẽ deploy các Custom Resource Definitions (CRD) cần thiết như Kafka, KafkaTopic, KafkaConnect.
CRD là cơ chế mở rộng API của Kubernetes, cho phép bạn định nghĩa các tài nguyên như KafkaCluster mà Kubernetes chưa hỗ trợ sẵn.
helm install strimzi-kafka-operator strimzi/kafka --namespace kafka-system --version 0.41.0
Kiểm tra trạng thái các pod của Strimzi Operator để đảm bảo chúng đang chạy (Running) và sẵn sàng (Ready).
kubectl get pods -n kafka-system -l app=strimzi-kafka-operator
Verify: Bạn phải thấy ít nhất 1 pod có trạng thái "Running" và "1/1" trong cột READY. Nếu thấy "CrashLoopBackOff", hãy kiểm tra logs bằng kubectl logs -n kafka-system -l app=strimzi-kafka-operator.
Khởi tạo Kafka Cluster và ZooKeeper qua YAML
Thay vì tạo các pod Kafka và ZooKeeper thủ công, Strimzi yêu cầu bạn định nghĩa một tài nguyên tùy chỉnh (Custom Resource) tên là Kafka để operator tự động điều phối.
Tài nguyên này chứa toàn bộ cấu hình cluster, bao gồm số lượng broker, dung lượng lưu trữ, và cấu hình ZooKeeper.
Tạo file cấu hình kafka-cluster.yaml với nội dung hoàn chỉnh dưới đây để khởi tạo một cluster Kafka đơn giản với 3 broker và 3 ZooKeeper.
cat > kafka-cluster.yaml
Áp dụng file cấu hình này vào Kubernetes cluster. Strimzi Operator sẽ phát hiện tài nguyên mới và bắt đầu triển khai các pod Kafka và ZooKeeper tương ứng.
kubectl apply -f kafka-cluster.yaml
Quá trình khởi tạo có thể mất 2-5 phút tùy vào tốc độ disk và tài nguyên của cluster. Bạn cần theo dõi trạng thái của pod cho đến khi tất cả đều ở trạng thái Running.
kubectl get pods -n kafka-system -l strimzi.io/kafka=my-cluster -w
Verify: Khi command trên dừng lại (hoặc bạn tự ngắt), bạn phải thấy 6 pod (3 kafka, 3 zookeeper) đều có trạng thái "Running" và "1/1".
Cấu hình Topic, Replication Factor và Partition Strategy
Sau khi Kafka Cluster đã sẵn sàng, bạn cần tạo Topic để lưu trữ dữ liệu. Strimzi cung cấp một CRD tên là KafkaTopic để quản lý điều này thay vì dùng command line CLI của Kafka.
Sử dụng KafkaTopic giúp đồng bộ cấu hình topic với Kubernetes, đảm bảo tính nhất quán khi scale cluster.
Tạo file kafka-topic.yaml để định nghĩa một topic tên là raw-events với 6 partitions và replication factor là 3.
cat > kafka-topic.yaml
Giải thích cấu hình: retention.ms đặt thời gian lưu trữ là 7 ngày (604800000 ms), segment.bytes là 1GB để tối ưu I/O, và cleanup.policy là delete để xóa dữ liệu cũ tự động.
Áp dụng cấu hình topic vào cluster.
kubectl apply -f kafka-topic.yaml
Kiểm tra trạng thái của topic để đảm bảo Strimzi đã tạo thành công và các partition đã được phân bổ đúng trên các broker.
kubectl get kafkatopic raw-events -n kafka-system -o yaml
Verify: Trong output YAML, bạn phải thấy trường status có observedGeneration khớp với metadata.generation, và số lượng partitions phải là 6.
Kiểm tra kết nối và sản xuất/sử dụng message test
Bây giờ bạn cần xác minh rằng Kafka Cluster hoạt động thực tế bằng cách gửi và nhận message. Chúng ta sẽ sử dụng các client CLI có sẵn trong container Kafka.
Để làm điều này, bạn cần chạy một container tạm thời (ephemeral) trong cùng namespace để truy cập vào dịch vụ Kafka.
Chạy container Kafka với shell để truy cập vào topic raw-events. Command dưới đây sẽ khởi tạo một pod tạm, chờ cluster sẵn sàng, và mở shell vào trong container.
kubectl run kafka-cli -it --rm --image=quay.io/strimzi/kafka:3.7.0-kafka-3.7.0 --image-pull-policy=IfNotPresent --namespace=kafka-system -- kafka-console-producer --broker-list my-cluster-kafka-bootstrap:9092 --topic raw-events
Sau khi shell mở ra, hãy gõ 2-3 dòng message test và nhấn Enter. Mỗi dòng sẽ được gửi như một message vào topic.
test-message-1
test-message-2
test-message-3
EOF
Để kiểm tra xem message đã được nhận chưa, bạn cần mở một terminal mới (hoặc chạy command sau trong terminal cũ nếu bạn đã thoát). Command này sẽ sử dụng console consumer để đọc message từ topic.
kubectl run kafka-consumer -it --rm --image=quay.io/strimzi/kafka:3.7.0-kafka-3.7.0 --image-pull-policy=IfNotPresent --namespace=kafka-system -- kafka-console-consumer --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic raw-events --from-beginning
Verify: Trong cửa sổ console consumer, bạn phải thấy ngay lập tức 3 dòng message test-message-1, test-message-2, test-message-3 hiện ra cùng với offset metadata.
Khóa cuối cùng: Kiểm tra lại trạng thái của Kafka Cluster để đảm bảo không có sự cố nào phát sinh sau khi có lưu lượng.
kubectl get kafka my-cluster -n kafka-system -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
Verify: Output phải trả về giá trị True. Nếu là False, hãy kiểm tra logs của pod broker bằng kubectl logs -n kafka-system -l strimzi.io/kafka=my-cluster -c kafka.
Đ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 1: Chuẩn bị môi trường: Yêu cầu phần cứng, Docker và Kubernetes
Phần 3: Đặt máy chủ ClickHouse vào Kubernetes cho lưu trữ dữ liệu lớn »