Deploy Kafka Cluster using Strimzi
ํ์ฌ์์ Confluent๋ฅผ ํตํด Kafka ํด๋ฌ์คํฐ๋ฅผ ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด ์นดํ์นด์ ๋ํด์ ์ข๋ ์์ธํ ์๊ณ , ์ ๋ฌธ์ฑ์ ๊ฐ์ถ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด์ 2025๋ ์ฒซ ๋ชฉํ๋ก Confluent์ Kafka ์๊ฒฉ์ฆ์ธ Confluent Certified Developer for Apache Kafkaยฎ ์๊ฒฉ์ฆ์ ์ค๋นํ๊ณ ์์ต๋๋ค โ๏ธ
๋ค์ด๊ฐ๋ฉฐ
Kafka๋ฅผ ๊น์ด์๊ฒ ๊ณต๋ถํ๋ฉด์ ๊ด๋ จ๋ eco-system๋ ์ดํด๋ณด๊ณ ์์ต๋๋ค! ํ์ฌ์์ Kafka ๊ด๋ จ ์์
์ ๋ง์ ์ํฐํด์ด๋ ํ์ฌ๋ค์์ Strimzi
๋ก Kafka ํด๋ฌ์คํฐ๋ Kafka Connect๋ฅผ ๋ํ๋ก์ด ํ๋ ๊ฑธ ์ ํ์ต๋๋ค.
๊ทธ๊ฒ๋ค์ ๋ณด๋ฉด์ โ์ค์คโฆ! ๋๋ ์ธ์ ๊ฐ ํ๋ฒ ์จ๋ด์ผ ๊ฒ ๋ค!โ๋ผ๊ณ ์๊ฐํ๋๋ฐ์! ์ด๋ฒ์ ์๊ฒฉ์ฆ์ ์ค๋นํ๋ฉด์ ํธ์ฆ์จ๊ณผ ํจ๊ป ์ดํด๋ณธ ์ด์ผ๊ธฐ๋ฅผ ์ ์ด๋ณด๊ณ ์ ํฉ๋๋ค. ์ฐธ๊ณ ๋ก โStrimziโ๋ Stream์ ์ฒด์ฝ์ด๋ก ํํํ ๊ฑฐ๋ผ๊ณ ํฉ๋๋ค! ๐จ๐ฟ
Kafka Cluster
Zookeeper Mode
์๋์ ๊ฐ์ด Kafka
๋ฆฌ์์ค๋ฅผ ์ ์ํฉ๋๋ค. 3๊ฐ์ ์ฃผํคํผ์ 3๊ฐ์ ๋ธ๋ก์ปค๋ก ๊ตฌ์ฑ๋ ํด๋ฌ์คํฐ ์
๋๋ค.
# @kafka-zookeper-cluster.yaml
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: strimzi
spec:
kafka:
version: 3.9.0
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
tls: false
storage:
type: ephemeral
zookeeper:
replicas: 3
storage:
type: ephemeral
entityOperator:
topicOperator: {}
userOperator: {}
$ kubectl apply -f kafka-zookeeper-cluster.yaml
Strimzi 0.45.0
๋ฒ์ ์ Zookeeper ๋ชจ๋๋ฅผ ์ง์ํ๋ ๋ง์ง๋ง Strimzi ๋ฒ์ ์
๋๋ค. ์์ผ๋ก๋ Strimzi์์ Kraft ๋ชจ๋์ ์นดํ์นด ํด๋ฌ์คํฐ๋ง ๋ํ๋ก์ด ํ ์ ์์ต๋๋ค.
Kraft Mode
Strimzi๋ Kraft ๋ชจ๋๋ก ์นดํ์นด ํด๋ฌ์คํฐ๋ฅผ ๋ํ๋ก์ด ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค! ๋ค๋ง, ์๊น ๋ดค๋ ์ฃผํคํผ ๊ธฐ๋ฐ ํด๋ฌ์คํฐ๋์ ๋ค๋ฅด๊ฒ KafkaNodePool
๋ฆฌ์์ค๋ฅผ ์ถ๊ฐ๋ก ๋ํ๋ก์ด ํด์ผ ํฉ๋๋ค.
To deploy a Kafka cluster in KRaft mode, you must use
Kafka
andKafkaNodePool
custom resources. The Kafka resource using KRaft mode must also have the annotationsstrimzi.io/kraft: enabled
andstrimzi.io/node-pools: enabled
. - Strimzi
์ผ๋จ Kafka
ํด๋ฌ์คํฐ๋ฅผ ์ ์ํ๊ณ ๋ํ๋ก์ด ํฉ๋๋ค.
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: strimzi
annotations:
strimzi.io/kraft: enabled
strimzi.io/node-pools: enabled
spec:
kafka:
version: 3.9.0
listeners:
- name: plain
port: 9092
type: internal
tls: false
entityOperator:
topicOperator: {}
userOperator: {}
์ฃผํคํผ ๋์๋ ๋ค๋ฅด๊ฒ spec.kafka.replicas
ํญ๋ชฉ๊ณผ spec.kafka.storage
ํญ๋ชฉ์ด ์์ด์ก์ต๋๋ค!
์ด์์ KafkaNodePool
์ ์ ์ ํฉ๋๋ค. ์ด๋, strimzi.io/cluster
๋ ์ด๋ธ์ด ์๊น ์ ์ํ Kafka
ํด๋ฌ์คํฐ์ ์ด๋ฆ๊ณผ ๋์ผํ๋๋ก ์ค์ ํฉ๋๋ค.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: controller-nodes
namespace: strimzi
labels:
strimzi.io/cluster: my-cluster # Kafka ํด๋ฌ์คํฐ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํจ
spec:
replicas: 3 # ์ปจํธ๋กค๋ฌ ๊ฐ์
roles:
- controller
storage:
type: ephemeral
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: broker-nodes
namespace: strimzi
labels:
strimzi.io/cluster: my-cluster # Kafka ํด๋ฌ์คํฐ ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํจ
spec:
replicas: 3 # ๋ธ๋ก์ปค ๊ฐ์
roles:
- broker
storage:
type: ephemeral
๊ทธ๋ฆฌ๊ณ ๋ํ๋ก์ด ํ๋ฉด, ์๋์ ๊ฐ์ด Kraft ๋ชจ๋์ ํด๋ฌ์คํฐ๊ฐ ๋ํ๋ก์ด ๋ฉ๋๋ค!!
NAME READY STATUS RESTARTS AGE
strimzi-cluster-operator-74f9cd5689-v7tcz 1/1 Running 7 (28m ago) 4h40m
my-cluster-controller-nodes-3 1/1 Running 0 5m39s
my-cluster-broker-nodes-2 1/1 Running 0 5m39s
my-cluster-controller-nodes-5 1/1 Running 0 5m39s
my-cluster-controller-nodes-4 1/1 Running 0 5m39s
my-cluster-broker-nodes-0 1/1 Running 0 5m39s
my-cluster-broker-nodes-1 1/1 Running 0 5m39s
my-cluster-entity-operator-7c4b65b7cb-x9gz8 2/2 Running 0 5m16s
ํจ๊ป ์์ฑ๋ entity-operator
๋ Kafka ํด๋ฌ์คํฐ์์ ์ฌ์ฉ์(KafkaUser
)์ ํ ํฝ(KafkaTopic
) ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ ์
๋๋ค. ์ entity-operator
๋ฅผ ํตํด Kafka์ ์ ์ ์ ํ ํฝ์ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Kafka Topic
Strimzi์์๋ Kafka Topic์ ์ ์ธ์ ์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 3
replicas: 3
config:
retention.ms: 7200000
segment.bytes: 1073741824
$ kubectl get kafkatopic
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY
my-topic my-cluster 3 3 True
ํ์ธ์ ์ํด Kafka CLI๋ก ํด๋ฌ์คํฐ์ ์ ์ ํด๋ด ์๋ค.
$ kafka-topics.sh \
--bootstrap-server my-cluster-kafka-bootstrap.strimzi:9092 \
--list
my-topic
๋งบ์๋ง
Strimzi๋ก ์นดํ์นด ํด๋ฌ์คํฐ๋ฅผ ๋ํ๋ก์ด ํ๋ zookeeper ๋ํ๋ก์ด ํ์ broker๋ค์ด ๋ํ๋ก์ด ๋์์ต๋๋ค! bitnami-kafka ๋๋ ์ฃผํคํผ์ ๋ธ๋ก์ปค๊ฐ ๋์์ ๋ํ๋ก์ด ๋์๊ณ , ์ฃผํคํผ๊ฐ ์ด๊ธฐํ ๋์ง ์์ ์ํ์์ ๋ธ๋ก์ปค๊ฐ ๋์ํ๋ฉด์ ๋ธ๋ก์ปค retry๊ฐ ์ข ์์๋๋ฐ์. Strimzi์์ ๊ทธ๋ฐ ํ์์ด ์์์ต๋๋ค!!
Kafka ํ ํฝ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ์ฅ์ ์ ๋๋ค! Kafka์ ๋ชจ๋ ์์๋ค์ yaml ํ์ผ๋ก ์ฝ๋ํ ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค๋! ์ ๋ง ํธ๋ฆฌํ ๊ฒ ๊ฐ์ต๋๋ค! ๊ทธ๋์ Confluent์์ ์น์ด๋ Confluent SDK๋ก ํ ํฝ์ ๋ง๋ค๊ฑฐ๋ ๊ด๋ฆฌ ํ๋๋ฐ์. Strimzi๋ โKafka๋ IaC ํ ์ ์์ด์!โ๋ผ๋ ์๊ฐ์ ์ผ๊นจ์ ์ค ๊ฒ ๊ฐ์ต๋๋ค ใ ใ
๊ทธ๋ฆฌ๊ณ ์นดํ์นด ํด๋ฌ์คํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋ํ๋ก์ด ํ ์ ์๋ค๋ ๊ฒ๋ ๋ถ๋ช ํ ์ฅ์ ์ด๊ตฌ์!! ์์ผ๋ก ์นดํ์นด ๊ฐ๋ฐ์๋ก ์ด์๊ฐ๋ฉด์ Strimzi๋ฅผ ์ด๋ป๊ฒ ๋ ํ์ฉํด ๋ณผ ์ ์์์ง ์ด๋ฆฌ์ ๋ฆฌ ์ฆ๊ฒ๊ฒ ๊ณ ๋ฏผ ํด๋ด์ผ ๊ฒ ์ต๋๋ค!