Kafka를 쿠버네티스에 올려야하는 상황이 주어졌다. 여러 가지를 리서치해봤는데 최종적으로 찾은 방법들은 다음과 같다.
1. kafka image를 직접 사용하는 법
2. K8s operator를 사용하는 법(strimzi)
1번의 방법은 직접 제어하고 커스터마이징할 수 있지만 클러스터의 관리나 운영을 수동으로 처리해야한다.
2번은 초기에 operator를 설치하고 구성하는 방법이 다소 복잡하고 커스터마이징 또한 1번에 비해 상대적으로 제한이 있는데(Operator의 기능에 따라가기 때문에) 클러스터의 설치, 업그레이드 등의 작업이 자동화되고 관리하기 편하다고 하여 2번으로 결정했다.
이제 요구 조건들을 살펴보겠다.
1. strimzi 0.41.0(몇일 전에 0.40.0을 설치했는데 지금 몇가지 이슈가 있어서 새로 구축할 겸 최신 버전으로 다시 구축해보려고 한다.)
2. Kafka 3.7(KRaft mode. None ZK)
전제 조건
1. k8s과 helm이 이미 설치되어 있다.
2. ZK와 KRaft mode에 대해 이미 알고 있다.

Zookeeper
Exporter
helm repo add strimzi https://strimzi.io/charts/
helm repo update
# namespace를 kafka로
k create ns kafka
helm install strimzi-kafka-operator strimzi/strimzi-kafka-operator --namespace kafka --version 0.41.0
여기서 KRaft mode를 적용하는 것이 아닌 3번에서 kafka 클러스터를 배포할때 KRaft mode를 적용한다.
kubectl apply -f https://strimzi.io/install/latest?namespace=kafka -n kafka
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: dual-role
namespace: kafka
labels:
strimzi.io/cluster: test-kafka
spec:
replicas: 3
roles:
- controller
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
class: nfs-client
kraftMetadata: shared
---
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: test-kafka
namespace: kafka
annotations:
strimzi.io/node-pools: enabled
strimzi.io/kraft: enabled
spec:
kafka:
version: 3.7.0
metadataVersion: 3.7-IV4
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
- name: external
port: 9094
type: nodeport
tls: false
config:
process.roles: broker,controller
node.id: 1
controller.quorum.voters: 1@test-kafka-kafka-0.test-kafka-kafka-brokers.kafka.svc:9093,2@test-kafka-kafka-1.test-kafka-kafka-brokers.kafka.svc:9093,3@test-kafka-kafka-2.test-kafka-kafka-brokers.kafka.svc:9093
inter.broker.listener.name: EXTERNAL
offsets.topic.replication.factor: 3
transaction.state.log.replication.factor: 3
transaction.state.log.min.isr: 2
default.replication.factor: 3
min.insync.replicas: 2
entityOperator:
topicOperator: {}
userOperator: {}
kafkaExporter:
groupRegex: ".*"
topicRegex: ".*"
k apply -f kafka-cluster.yaml으로 적용하면 된다.