ํ”„๋กœ์ ํŠธ/MLOps ํ†ตํ•ฉ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ Kafka ๋„์šฐ๊ธฐ: Strimzi vs Bitnami, ๊ทธ๋ฆฌ๊ณ  KRaft

THE NICOLE 2026. 6. 16. 17:29

ํ•ต์‹ฌ ์š”์•ฝ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์œ„์— Kafka๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐˆ๋ž˜์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” Bitnami Helm ์ฐจํŠธ๋กœ "์„ค์น˜ ํŒจํ‚ค์ง€์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ ์ฐ์–ด๋‚ด๋Š”" ๋ฐฉ์‹์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Strimzi ์˜คํผ๋ ˆ์ดํ„ฐ๋กœ "ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์ƒ์ฃผํ•˜๋Š” ๊ด€๋ฆฌ ๋กœ๋ด‡์—๊ฒŒ ์šด์˜์„ ๋งก๊ธฐ๋Š”" ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‘˜์€ ๊ฐ™์€ Kafka๋ฅผ ์˜ฌ๋ฆฌ์ง€๋งŒ ์‚ฌ์ƒ ์ž์ฒด๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์š”์ฆ˜ Kafka๋Š” ZooKeeper ์—†์ด ๋„๋Š” KRaft ๋ชจ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ด ๋˜์—ˆ๋Š”๋ฐ, ์ด๊ฒŒ ๋ฌด์—‡์ด๊ณ  ์™œ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๋ฉด ๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ํ›จ์”ฌ ๋˜๋ ทํ•ด์ง‘๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” โ‘  KRaft๊ฐ€ ๋ฌด์—‡์ธ์ง€ โ‘ก Helm๊ณผ Operator์˜ ์›๋ฆฌ ์ฐจ์ด โ‘ข Strimzi์™€ Bitnami๋ฅผ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ์šด์˜ํ•˜๋Š”์ง€ โ‘ฃ ์–ธ์ œ ๋ฌด์—‡์„ ๊ณจ๋ผ์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. ๋จผ์ €, Kafka๊ฐ€ K8s์—์„œ ๊นŒ๋‹ค๋กœ์šด ์ด์œ 

Kafka๋Š” ๊ทธ๋ƒฅ ๋–  ์žˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๋ฌด์ƒํƒœ(stateless) ์›น ์„œ๋ฒ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ๊ฐ€์ง„(stateful) ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ๋ฌด์ƒํƒœ ์›น ์„œ๋ฒ„๋Š” ํŽธ์˜์  ์•Œ๋ฐ”์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์™€๋„ ๋˜‘๊ฐ™์ด ์ผํ•˜๊ณ , ํ•œ ๋ช…์ด ๋น ์ง€๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์œผ๋กœ ๋ฐ”๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ง๋„, ๊ธฐ์–ต๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Kafka ๋ธŒ๋กœ์ปค๋Š” ์ž๊ธฐ ์ „์šฉ ์‚ฌ๋ฌผํ•จ์„ ๊ฐ€์ง„ ์ฐฝ๊ณ  ์ง์›์ž…๋‹ˆ๋‹ค. ๊ฐ์ž ๋งก์€ ์ง(๋ฐ์ดํ„ฐ)์„ ์ž๊ธฐ ์‚ฌ๋ฌผํ•จ(๋””์Šคํฌ)์— ๋ณด๊ด€ํ•˜๊ณ  ์žˆ์–ด์„œ, ์ž ๊น ์ž๋ฆฌ๋ฅผ ๋น„์› ๋‹ค ๋Œ์•„์™€๋„ ๋ฐ˜๋“œ์‹œ ์ž๊ธฐ ์‚ฌ๋ฌผํ•จ ์•ž์œผ๋กœ ๋Œ์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ์ž๋ฆฌ์—๋‚˜ ์ƒˆ๋กœ ์•‰์œผ๋ฉด ๊ทธ ์‚ฌ๋žŒ์ด ๋ณด๊ด€ํ•˜๋˜ ์ง์„ ๋ชป ์ฐพ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ ๋ธŒ๋กœ์ปค๋Š” ์ž๊ธฐ ๋””์Šคํฌ์— ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ๋ฅผ ์Œ“์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ๋“œ๊ฐ€ ์ฃฝ์—ˆ๋‹ค ์‚ด์•„๋‚˜๋„ ๊ฐ™์€ ๋””์Šคํฌ(PVC)์— ๋‹ค์‹œ ๋ถ™์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‚ฌ๋ฌผํ•จ ์•ž์œผ๋กœ ๋ณต๊ท€). ์•„๋ฌด ๋ฐ์„œ๋‚˜ ์ƒˆ๋กœ ๋– ์„  ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋กœ์ปค๋งˆ๋‹ค ๊ณ ์œ ํ•œ ID์™€ ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ์ด๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. kafka-0, kafka-1์ฒ˜๋Ÿผ ๋ฒˆํ˜ธ๊ฐ€ ๊ณ ์ •๋ผ์•ผ ์„œ๋กœ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ง์›๋งˆ๋‹ค ์‚ฌ๋ฒˆ๊ณผ ์ž๋ฆฌ ๋ฒˆํ˜ธ๊ฐ€ ๊ณ ์ •๋œ ์…ˆ์ž…๋‹ˆ๋‹ค.
  • ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊บผ๋ฒˆ์— ๋‹ค ๋‚ด๋ ธ๋‹ค ์˜ฌ๋ฆฌ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๊นจ์ง€๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐฝ๊ณ  ์ง์›์„ ์ „์› ๋™์‹œ์— ํ‡ด๊ทผ์‹œํ‚ค๋ฉด ๊ทธ ์‹œ๊ฐ„ ๋“ค์–ด์˜จ ์ง์„ ์•„๋ฌด๋„ ๋ชป ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ K8s์—์„œ๋Š” Deployment๊ฐ€ ์•„๋‹ˆ๋ผ StatefulSet(์ˆœ์„œ·๊ณ ์ • ์ด๋ฆ„·๊ณ ์ • ๋””์Šคํฌ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฆฌ์†Œ์Šค)์œผ๋กœ ๋„์šฐ๋Š” ๊ฒŒ ์ •์„์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด "์ƒํƒœ ๊ด€๋ฆฌ"์˜ ๋ฌด๊ฒŒ ๋•Œ๋ฌธ์—, Kafka๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฐํฌ·์šด์˜ํ•˜๋А๋ƒ๊ฐ€ ์ค‘์š”ํ•œ ์„ ํƒ์ง€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋‹จ์ˆœํžˆ apache/kafka ์ด๋ฏธ์ง€๋ฅผ Deployment ํ•˜๋‚˜๋กœ ๋„์šฐ๋Š” ๊ตฌ์„ฑ๋„ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์šฉ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ๋Š” ๋™์ž‘ํ•˜์ง€๋งŒ, ๋””์Šคํฌ ์˜์†์„ฑ·์ˆœ์„œ ๋ณด์žฅ·๊ณ ๊ฐ€์šฉ์„ฑ์ด ์—†์–ด์„œ ์šด์˜์—๋Š” ๋ถ€์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๋‹ค๋ฃจ๋Š” Strimzi/Bitnami๋Š” ๋‘˜ ๋‹ค StatefulSet ๊ธฐ๋ฐ˜์˜ ์ œ๋Œ€๋กœ ๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


2. KRaft๋ž€ ๋ฌด์—‡์ธ๊ฐ€

์˜›๋‚  ๋ฐฉ์‹: ZooKeeper

์˜ˆ์ „ Kafka๋Š” ํ˜ผ์ž ์‚ด๋ฆผ์„ ๋ชป ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๋ธŒ๋กœ์ปค๊ฐ€ ๋ช‡ ๋Œ€ ์‚ด์•„์žˆ๋Š”์ง€, ํ† ํ”ฝ์ด ๋ช‡ ๊ฐœ์ธ์ง€, ํŒŒํ‹ฐ์…˜ ๋ฆฌ๋”๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€, ๊ถŒํ•œ ์„ค์ •์€ ์–ด๋–ค์ง€)๋ฅผ ์ž๊ธฐ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ , ZooKeeper๋ผ๋Š” ๋ณ„๋„ ์‹œ์Šคํ…œ์— ๋งก๊ฒผ์Šต๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, Kafka๋Š” "์žฅ์‚ฌํ•˜๋Š” ๊ฐ€๊ฒŒ"์ด๊ณ  ZooKeeper๋Š” ๊ทธ ์˜† ๊ฑด๋ฌผ์˜ ๋ณ„๋„ ๊ด€๋ฆฌ์‚ฌ๋ฌด์†Œ์˜€์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์ž…์ฃผํ–ˆ๋Š”์ง€, ๋ˆ„๊ฐ€ ๋Œ€ํ‘œ์ธ์ง€ ๊ฐ™์€ ์žฅ๋ถ€๋ฅผ ์ „๋ถ€ ๊ด€๋ฆฌ์‚ฌ๋ฌด์†Œ๊ฐ€ ๋“ค๊ณ  ์žˆ์—ˆ๋˜ ์…ˆ์ž…๋‹ˆ๋‹ค. ๊ฐ€๊ฒŒ๋ฅผ ์šด์˜ํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ์‚ฌ๋ฌด์†Œ ๊ฑด๋ฌผ์„ ๋”ฐ๋กœ ์ง“๊ณ , ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๋”ฐ๋กœ ์žฅ์• ์— ๋Œ€๋น„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ์˜ ๋ฌธ์ œ:

  • ์šด์˜ํ•ด์•ผ ํ•  ์‹œ์Šคํ…œ์ด ๋‘˜์ด ๋ฉ๋‹ˆ๋‹ค(Kafka + ZooKeeper). ๊ฐ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ZooKeeper๊ฐ€ ํ”๋“ค๋ฆฌ๋ฉด Kafka ์ „์ฒด๊ฐ€ ํ”๋“ค๋ฆฝ๋‹ˆ๋‹ค.
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ZooKeeper๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ด์„œ, ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ปค์ง€๋ฉด ๋А๋ ค์ง€๊ณ  ํ•œ๊ณ„๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฐฉ์‹: KRaft (Kafka Raft)

KRaft๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ "Kafka + Raft" ์ž…๋‹ˆ๋‹ค. ZooKeeper๋ฅผ ์—†์• ๊ณ , Kafka๊ฐ€ ์ž๊ธฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ฐ”๊พผ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” Kafka ๋‚ด๋ถ€์˜ ํŠน์ˆ˜ ํ† ํ”ฝ(__cluster_metadata)์— ์ €์žฅ๋˜๊ณ , Raft๋ผ๋Š” ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ๋ณ„๋„ ๊ด€๋ฆฌ์‚ฌ๋ฌด์†Œ ๊ฑด๋ฌผ์„ ์—†์• ๊ณ  ๊ฐ€๊ฒŒ ๊ฑด๋ฌผ ์•ˆ์— ๊ด€๋ฆฌ์‹ค์„ ๋‚ด์žฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž…์ฃผ์ž ์žฅ๋ถ€๋ฅผ ๊ฑด๋ฌผ์ด ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌํ•  ๊ฑด๋ฌผ์ด ๋‘˜์—์„œ ํ•˜๋‚˜๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ƒˆ ๊ฐœ๋…์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. KRaft์—์„œ๋Š” ๋…ธ๋“œ๊ฐ€ ์—ญํ• (role) ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • controller(์ปจํŠธ๋กค๋Ÿฌ): ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ฉ์˜์— ์ฐธ์—ฌํ•˜๋Š” ์—ญํ• . ๊ณผ๊ฑฐ ZooKeeper๊ฐ€ ํ•˜๋˜ ์ผ์„ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ํ™€์ˆ˜ ๋Œ€(3, 5๋Œ€)๋กœ ๊ตฌ์„ฑํ•ด ๊ณผ๋ฐ˜ ํ•ฉ์˜(quorum)๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค.
  • broker(๋ธŒ๋กœ์ปค): ์‹ค์ œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์Œ“๊ณ  ๋‚ด์ฃผ๋Š” ์—ญํ• . ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ๊ทธ Kafka์˜ ๋ณธ์—…์ž…๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ํ•œ ํšŒ์‚ฌ๋กœ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด์‚ฌํšŒ/์ด๋ฌดํŒ€์ž…๋‹ˆ๋‹ค. ์ง์ ‘ ๋ฌผ๊ฑด์„ ๋‚˜๋ฅด์ง„ ์•Š์ง€๋งŒ, "๋ˆ„๊ฐ€ ์šฐ๋ฆฌ ์ง์›์ธ์ง€", "์ง€๊ธˆ ํŒ€์žฅ์ด ๋ˆ„๊ตฌ์ธ์ง€", "์กฐ์ง๋„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€"๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋กœ์ปค๋Š” ํ˜„์žฅ ์ง์›์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ง(๋ฉ”์‹œ์ง€)์„ ๋ฐ›๊ณ  ์Œ“๊ณ  ๋‚ด์ค๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™€์ˆ˜๋กœ ๋‘๋Š” ์ด์œ ๋Š” ์ด์‚ฌํšŒ ์˜๊ฒฐ์„ ๊ณผ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. 3๋ช… ์ค‘ 2๋ช…์ด ๋™์˜ํ•˜๋ฉด ๊ฒฐ์ •์ด ํ™•์ •๋˜๋‹ˆ, ํ•œ ๋ช…์ด ์ž๋ฆฌ๋ฅผ ๋น„์›Œ๋„ ํšŒ์‚ฌ ์˜์‚ฌ๊ฒฐ์ •์ด ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ ๋…ธ๋“œ๊ฐ€ controller์™€ broker๋ฅผ ๊ฒธํ•  ์ˆ˜๋„ ์žˆ๊ณ (์†Œ๊ทœ๋ชจ — ์‚ฌ์žฅ์ด ํ˜„์žฅ๋„ ๋›ฐ๋Š” 1์ธ ํšŒ์‚ฌ), ๋ถ„๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์šด์˜ — ๊ฒฝ์˜์ง„๊ณผ ํ˜„์žฅ์ง์ด ๋‚˜๋‰œ ํฐ ํšŒ์‚ฌ). ๊ทธ๋ž˜์„œ K8s์—์„œ KRaft Kafka๋ฅผ ๋„์šฐ๋ฉด ...-controller-0, ...-broker-0 ๊ฐ™์€ ํŒŒ๋“œ๊ฐ€ ๋”ฐ๋กœ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Raft๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด: ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ "์ง€๊ธˆ ๋ฆฌ๋”๊ฐ€ ๋ˆ„๊ตฌ๋‹ค", "์ด ๋ณ€๊ฒฝ์„ ํ™•์ •ํ•œ๋‹ค"๋ฅผ ๊ณผ๋ฐ˜ ํˆฌํ‘œ๋กœ ํ•ฉ์˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ํšŒ์˜์—์„œ ์•ˆ๊ฑด์„ ๊ณผ๋ฐ˜ ์†๋“ค๊ธฐ๋กœ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐธ์„์ž ์ ˆ๋ฐ˜ ๋„˜๊ฒŒ ์ฐฌ์„ฑํ•ด์•ผ ํ™•์ •๋˜๋ฏ€๋กœ, ํ•œ ๋ช…์ด ์ž๋ฆฌ๋ฅผ ๋น„์šฐ๊ฑฐ๋‚˜ ์˜๊ฒฌ์ด ์—‡๊ฐˆ๋ ค๋„ ํšŒ์˜ ์ „์ฒด๊ฐ€ ์ผ๊ด€๋œ ๊ฒฐ๋ก ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ "ํ•œ ๋ช…์ด ์ฃฝ์–ด๋„ ๋‚˜๋จธ์ง€๊ฐ€ ์ผ๊ด€๋œ ๊ฒฐ์ •์„ ์œ ์ง€"ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด, KRaft = ZooKeeper๋ฅผ ๋–ผ์–ด๋‚ธ ์ž๋ฆฝํ˜• Kafka์ด๊ณ , 2024๋…„ ์ดํ›„ Kafka(ํŠนํžˆ 4.0๋ถ€ํ„ฐ)๋Š” KRaft๊ฐ€ ๊ธฐ๋ณธ์ด์ž ์‚ฌ์‹ค์ƒ ์œ ์ผํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Strimzi๋“  Bitnami๋“  ์š”์ฆ˜ ๋ฒ„์ „์€ ๋‹ค KRaft๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


3. Helm vs Operator: ๋‘ ์‚ฌ์ƒ์˜ ์ฐจ์ด

์ด์ œ ๋ณธ๋ก ์ž…๋‹ˆ๋‹ค. Bitnami๋Š” Helm ์ฐจํŠธ, Strimzi๋Š” Operator์ž…๋‹ˆ๋‹ค. ์ด ๋‘˜์€ "Kafka๋ฅผ ๊นŒ๋Š” ๋„๊ตฌ"๋ผ๋Š” ์ ์€ ๊ฐ™์ง€๋งŒ, ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Helm = ์„ค์น˜ ํ…œํ”Œ๋ฆฟ (ํ•œ ๋ฒˆ ์ฐ์–ด๋ƒ„)

Helm์€ YAML ํ…œํ”Œ๋ฆฟ ์—”์ง„ + ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ž…๋‹ˆ๋‹ค. values.yaml์ด๋ผ๋Š” ์„ค์ •๊ฐ’์„ ๋„ฃ์œผ๋ฉด, ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๊ฐ’์„ ์ฑ„์›Œ K8s ๋งค๋‹ˆํŽ˜์ŠคํŠธ(StatefulSet, Service, ConfigMap...)๋ฅผ ๋ Œ๋”๋งํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฑธ๋กœ ๋์ž…๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, Helm์€ ์ด์ผ€์•„ ๊ฐ€๊ตฌ ์กฐ๋ฆฝ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ ์กฐ๋ฆฝํ•˜๋ฉด ๊ฐ€๊ตฌ๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋’ค์— ๋‚˜์‚ฌ๊ฐ€ ํ’€๋ฆฌ๊ฑฐ๋‚˜ ์„œ๋ž์ด ๋น ์ ธ๋„ ๊ฐ€๊ตฌ๊ฐ€ ์Šค์Šค๋กœ ๊ณ ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ๋‹ค์‹œ ์™€์„œ ์†๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” Maven archetype์ด ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ํ•œ ๋ฒˆ์œผ๋กœ ํ”„๋กœ์ ํŠธ ๋ผˆ๋Œ€๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์ง€๋งŒ, ์ƒ์„ฑ๋œ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๋ฌด์Šจ ์ผ์ด ์ƒ๊ธฐ๋“ , ๋‹ค์Œ์— ์‚ฌ๋žŒ์ด helm upgrade๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง€ Helm์€ ์ž ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰ Helm์€ "์„ค์น˜ ์‹œ์ ์— ํ•œ ๋ฒˆ ์ผํ•˜๋Š”" ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์„ค์น˜ ํ›„์˜ ์šด์˜(์—…๊ทธ๋ ˆ์ด๋“œ, ์žฅ์•  ๋ณต๊ตฌ, ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ)์€ ์ „๋ถ€ ์‚ฌ๋žŒ ๋ชซ์ž…๋‹ˆ๋‹ค.

Operator = ์ƒ์ฃผํ•˜๋Š” ๊ด€๋ฆฌ ๋กœ๋ด‡ (๊ณ„์† ๋งž์ถฐ์คŒ)

Operator๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ๊ณ„์† ๋„๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. Kafka๋ผ๋Š” CRD(์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค) ์— "๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ"(๋ธŒ๋กœ์ปค 3๋Œ€, Kafka 3.9.0, TLS ์ผœ๊ธฐ ๋“ฑ)๋ฅผ ์„ ์–ธํ•ด๋‘๋ฉด, ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋Š์ž„์—†์ด ๊ฐ์‹œํ•˜๋ฉด์„œ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๋งž์ถฐ์ค๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ฆฌ์ปจ์‹ค๋ ˆ์ด์…˜(reconciliation, ์กฐ์ • ๋ฃจํ”„)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, Operator๋Š” ์˜จ๋„์กฐ์ ˆ๊ธฐ(thermostat) ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. "์‹ค๋‚ด 24๋„"๋ผ๊ณ  ์„ค์ •ํ•ด๋‘๋ฉด, ์˜จ๋„์กฐ์ ˆ๊ธฐ๋Š” ๊ณ„์† ์˜จ๋„๋ฅผ ์žฌ๋ฉด์„œ ๋”์šฐ๋ฉด ๋ƒ‰๋ฐฉ์„, ์ถ”์šฐ๋ฉด ๋‚œ๋ฐฉ์„ ์ผญ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ๋งค๋ฒˆ ์—์–ด์ปจ์„ ์ผœ๊ณ  ๋„์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์„ค์ •๊ฐ’(์›ํ•˜๋Š” ์ƒํƒœ)๋งŒ ์ •ํ•ด๋‘๋ฉด ๊ธฐ๊ณ„๊ฐ€ ์•Œ์•„์„œ ํ˜„์‹ค์„ ๊ฑฐ๊ธฐ์— ๋งž์ถฅ๋‹ˆ๋‹ค. Strimzi๋„ "๋ธŒ๋กœ์ปค 3๋Œ€, ๋ฒ„์ „ 3.9.0"์ด๋ผ๊ณ  ์ ์–ด๋‘๋ฉด ๊ณ„์† ๊ทธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋” ์ต์ˆ™ํ•œ ์˜ˆ๋กœ๋Š” ArgoCD๊ฐ€ ์ •ํ™•ํžˆ ๊ฐ™์€ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค. ArgoCD๋Š” Git์— ์ ํžŒ "์›ํ•˜๋Š” ์ƒํƒœ"๋ฅผ ๋ณด๊ณ , ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‹ค์ œ ์ƒํƒœ๊ฐ€ ์–ด๊ธ‹๋‚˜๋ฉด ์ž๋™์œผ๋กœ ๋งž์ถฐ์ค๋‹ˆ๋‹ค(sync). Strimzi๋Š” ๊ทธ ๋Œ€์ƒ์ด Git์ด ์•„๋‹ˆ๋ผ Kafka CRD์ผ ๋ฟ, "์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์„ ์–ธ → ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ณ„์† ๋งž์ถค" ์ด๋ผ๋Š” ๊ณจ๊ฒฉ์ด ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ Strimzi๋Š” Kafka ์ „์šฉ ArgoCD๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”/์Šคํ”„๋ง ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š”, Operator๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ์ฃผํ•˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„ํ˜• ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. @Scheduled๋กœ ๋Š์ž„์—†์ด ๋„๋Š” ์ž‘์—…์ด "์ง€๊ธˆ ์ƒํƒœ"์™€ "์›ํ•˜๋Š” ์ƒํƒœ(์„ค์ •)"๋ฅผ ๋น„๊ตํ•ด ์ฐจ์ด๋ฅผ ๋ฉ”์šฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. CRD๋Š” ๊ทธ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ์ปค์Šคํ…€ ์—”ํ‹ฐํ‹ฐ/์„ค์ •์ด๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฐจ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ:

  • Helm: "์ด๋ ‡๊ฒŒ ์„ค์น˜ํ•ด์ค˜" → ์„ค์น˜ํ•˜๊ณ  ๋.
  • Operator: "์ด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์ค˜" → ๊ณ„์† ์ง€์ผœ๋ณด๋ฉฐ ์œ ์ง€.

์ด ์ฐจ์ด๊ฐ€ ๋ชจ๋“  ์žฅ๋‹จ์ ์˜ ๋ฟŒ๋ฆฌ์ž…๋‹ˆ๋‹ค.


4. Bitnami๋กœ Kafka ์„ค์น˜ํ•˜๊ธฐ

์„ค์น˜ ์›๋ฆฌ

Bitnami๋Š” Kafka์šฉ Helm ์ฐจํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. KRaft ๋ชจ๋“œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ, controller์™€ broker๋ฅผ ๋ถ„๋ฆฌํ•œ StatefulSet ๊ตฌ์„ฑ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

1) ์ฐจํŠธ ์ถ”๊ฐ€ / ํ™•์ธ

# Bitnami๋Š” OCI ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค
helm show values oci://registry-1.docker.io/bitnamicharts/kafka > kafka-values.yaml

2) values.yaml ์ž‘์„ฑ

# kafka-values.yaml (ํ•ต์‹ฌ๋งŒ ๋ฐœ์ทŒ)
controller:
  replicaCount: 3          # KRaft ์ปจํŠธ๋กค๋Ÿฌ 3๋Œ€ (๊ณผ๋ฐ˜ ํ•ฉ์˜)
  persistence:
    enabled: true
    size: 8Gi              # ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ ๋””์Šคํฌ
broker:
  replicaCount: 3          # ๋ธŒ๋กœ์ปค 3๋Œ€
  persistence:
    enabled: true
    size: 20Gi
listeners:
  client:
    protocol: PLAINTEXT    # ๊ฐœ๋ฐœ์šฉ. ์šด์˜์€ SASL/TLS ๊ถŒ์žฅ
kraft:
  enabled: true            # KRaft ๋ชจ๋“œ (์š”์ฆ˜์€ ๊ธฐ๋ณธ๊ฐ’)

3) ์„ค์น˜

helm install devops-kafka \
  oci://registry-1.docker.io/bitnamicharts/kafka \
  -n devops-infra --create-namespace \
  -f kafka-values.yaml

์„ค์น˜ํ•˜๋ฉด ์ด๋Ÿฐ ํŒŒ๋“œ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

devops-kafka-controller-0   1/1   Running
devops-kafka-controller-1   1/1   Running
devops-kafka-controller-2   1/1   Running
devops-kafka-broker-0       1/1   Running
devops-kafka-broker-1       1/1   Running
devops-kafka-broker-2       1/1   Running

4) ์„ค์ • ๋ณ€๊ฒฝ / ์—…๊ทธ๋ ˆ์ด๋“œ

๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ์‚ฌ๋žŒ์ด ์ง์ ‘ helm upgrade๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

# broker๋ฅผ 3 → 5๋Œ€๋กœ ๋Š˜๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด values ์ˆ˜์ • ํ›„
helm upgrade devops-kafka \
  oci://registry-1.docker.io/bitnamicharts/kafka \
  -n devops-infra -f kafka-values.yaml

ํ† ํ”ฝ ์ƒ์„ฑ ๊ฐ™์€ ์ผ์ƒ ์ž‘์—…์€ Kafka CLI๋กœ ์ง์ ‘ ํ•ฉ๋‹ˆ๋‹ค.

kubectl exec -it devops-kafka-broker-0 -n devops-infra -- \
  kafka-topics.sh --create --topic my-topic \
  --bootstrap-server localhost:9092 \
  --partitions 3 --replication-factor 3

์‹ค์ œ๋กœ ๊น”๋ ค ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฒ•

๋ฐฐํฌ ๋ฐฉ์‹์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒฐ์ •์  ๋‹จ์„œ๋Š” ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.

kubectl get sts devops-kafka-broker -n devops-infra --show-labels
# app.kubernetes.io/managed-by=Helm
# helm.sh/chart=kafka-32.4.3            ← Bitnami Helm ์ฐจํŠธ
# image: docker.io/bitnamilegacy/kafka:4.0.0-debian-12-r10

managed-by=Helm + helm.sh/chart=kafka-... ๊ฐ€ ๋ณด์ด๋ฉด Bitnami(Helm) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


5. Strimzi๋กœ Kafka ์„ค์น˜ํ•˜๊ธฐ

์„ค์น˜ ์›๋ฆฌ

Strimzi๋Š” ๋‘ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์˜คํผ๋ ˆ์ดํ„ฐ(๊ด€๋ฆฌ ๋กœ๋ด‡)๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๊ทธ๋‹ค์Œ Kafka CR(์›ํ•˜๋Š” ์ƒํƒœ)์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์‹ค์ œ StatefulSet/ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

1) ์˜คํผ๋ ˆ์ดํ„ฐ ์„ค์น˜

kubectl create namespace kafka

# ์˜คํผ๋ ˆ์ดํ„ฐ + CRD ํ•œ ๋ฒˆ์— ์„ค์น˜
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka

์ด ์‹œ์ ์— ํด๋Ÿฌ์Šคํ„ฐ์— CRD๊ฐ€ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ Strimzi์˜ ์ง€๋ฌธ์ž…๋‹ˆ๋‹ค.

kubectl get crd | grep strimzi
# kafkas.kafka.strimzi.io
# kafkanodepools.kafka.strimzi.io
# kafkatopics.kafka.strimzi.io
# kafkausers.kafka.strimzi.io

2) KafkaNodePool + Kafka CR ์„ ์–ธ

์š”์ฆ˜ Strimzi๋Š” KRaft + NodePool ๋ฐฉ์‹์„ ์”๋‹ˆ๋‹ค. ๋…ธ๋“œ ํ’€๋กœ controller/broker ์—ญํ• ์„ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

# controller ํ’€
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: controller
  labels:
    strimzi.io/cluster: my-kafka
spec:
  replicas: 3
  roles:
    - controller          # ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• 
  storage:
    type: persistent-claim
    size: 8Gi
---
# broker ํ’€
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: broker
  labels:
    strimzi.io/cluster: my-kafka
spec:
  replicas: 3
  roles:
    - broker              # ๋ธŒ๋กœ์ปค ์—ญํ• 
  storage:
    type: persistent-claim
    size: 20Gi
---
# Kafka ๋ณธ์ฒด (์›ํ•˜๋Š” ์ƒํƒœ ์„ ์–ธ)
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-kafka
  annotations:
    strimzi.io/node-pools: enabled
    strimzi.io/kraft: enabled         # KRaft ๋ชจ๋“œ
spec:
  kafka:
    version: 3.9.0
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
    config:
      default.replication.factor: 3
      min.insync.replicas: 2
  entityOperator:
    topicOperator: {}                  # ํ† ํ”ฝ์„ CRD๋กœ ๊ด€๋ฆฌ
    userOperator: {}                   # ์œ ์ €๋ฅผ CRD๋กœ ๊ด€๋ฆฌ
kubectl apply -f kafka-cluster.yaml -n kafka

์ ์šฉํ•˜๋ฉด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์•Œ์•„์„œ StatefulSet๊ณผ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด StatefulSet์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3) ํ† ํ”ฝ์„ "์„ ์–ธํ˜•"์œผ๋กœ ๊ด€๋ฆฌ

Strimzi์˜ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค. ํ† ํ”ฝ๋„ CLI๊ฐ€ ์•„๋‹ˆ๋ผ YAML(CRD) ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic
  labels:
    strimzi.io/cluster: my-kafka
spec:
  partitions: 3
  replicas: 3
kubectl apply -f my-topic.yaml -n kafka

์ด๋Ÿฌ๋ฉด ํ† ํ”ฝ ์ •์˜๊ฐ€ Git์— ๋‚จ๊ณ , ArgoCD ๊ฐ™์€ GitOps ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "ํ† ํ”ฝ๋„ ์ฝ”๋“œ์ฒ˜๋Ÿผ" ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4) ์„ค์ • ๋ณ€๊ฒฝ / ์—…๊ทธ๋ ˆ์ด๋“œ

Kafka CR์˜ version์„ ๋ฐ”๊พธ๊ณ  kubectl apply ํ•˜๋ฉด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ํ•œ ์ˆœ์„œ๋กœ ๋กค๋ง ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ → ๋ธŒ๋กœ์ปค ์ˆœ์„œ, ํŒŒํ‹ฐ์…˜ ๋ฆฌ๋” ์•ˆ์ „์„ฑ ํ™•์ธ๊นŒ์ง€ ์ž๋™์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์€ "์›ํ•˜๋Š” ๋ฒ„์ „"๋งŒ ์ ์Šต๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ๋‹ค๋ฆฌ ๋ณด์ˆ˜๊ณต์‚ฌ๋ฅผ ์ฐจ์„  ํ•˜๋‚˜์”ฉ ๋ง‰์œผ๋ฉด์„œ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „ ์ฐจ์„ ์„ ๋™์‹œ์— ๋ง‰์œผ๋ฉด ๊ตํ†ต์ด ๋งˆ๋น„๋˜๋‹ˆ, ํ•œ ์ฐจ์„ ์”ฉ ๋ง‰๊ณ  ์ฐจ๊ฐ€ ๋น ์ง„ ๊ฑธ ํ™•์ธํ•œ ๋’ค ๋‹ค์Œ ์ฐจ์„ ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๋ธŒ๋กœ์ปค๋ฅผ ํ•œ ๋Œ€์”ฉ ๋‚ด๋ ค ๊ต์ฒดํ•˜๊ณ , ๊ทธ ์‚ฌ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๋ธŒ๋กœ์ปค์— ์•ˆ์ „ํ•˜๊ฒŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค์—์•ผ ๋‹ค์Œ ๋Œ€๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. Helm์€ ์ด "ํ•œ ์ฐจ์„ ์”ฉ, ์•ˆ์ „ ํ™•์ธํ•˜๋ฉฐ"๋ฅผ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š์•„์„œ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์ฑ™๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

spec:
  kafka:
    version: 3.9.0   # → 4.0.0 ์œผ๋กœ ๋ฐ”๊พธ๊ณ  apply ํ•˜๋ฉด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์•Œ์•„์„œ ๋กค๋ง

6. ์ •๋ฉด ๋น„๊ต

ํ•ญ๋ชฉ Bitnami (Helm) Strimzi (Operator)
ํŒจ๋Ÿฌ๋‹ค์ž„ ์„ค์น˜ ํ…œํ”Œ๋ฆฟ (ํ•œ ๋ฒˆ ์ฐ์–ด๋ƒ„) ์ƒ์ฃผ ์ปจํŠธ๋กค๋Ÿฌ (๊ณ„์† ๋งž์ถฐ์คŒ)
์„ค์ • ๋ฐฉ์‹ values.yaml → ๋ Œ๋”๋ง Kafka CRD (์„ ์–ธํ˜• ๋ฆฌ์†Œ์Šค)
์„ค์ • ๋ณ€๊ฒฝ ๋ฐ˜์˜ ์‚ฌ๋žŒ์ด helm upgrade ์‹คํ–‰ CR ์ˆ˜์ • → ์˜คํผ๋ ˆ์ดํ„ฐ ์ž๋™ ๋ฐ˜์˜
๋กค๋ง ์—…๊ทธ๋ ˆ์ด๋“œ StatefulSet ๊ธฐ๋ณธ ๋™์ž‘์— ์˜์กด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ ์ˆœ์„œ ๋ณด์žฅ
ํ† ํ”ฝ/์œ ์ € ๊ด€๋ฆฌ CLI ์ˆ˜๋™ KafkaTopic/KafkaUser CRD (GitOps ๊ฐ€๋Šฅ)
TLS ์ธ์ฆ์„œ ์ง์ ‘ ๋ฐœ๊ธ‰·๊ฐฑ์‹  ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์ž๋™ ๋ฐœ๊ธ‰·์ž๋™ ๊ฐฑ์‹  (์—ฌ๊ถŒ ์ž๋™ ๊ฐฑ์‹ ์ฒ˜๋Ÿผ)
ํŒŒํ‹ฐ์…˜ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์ˆ˜๋™ ์Šคํฌ๋ฆฝํŠธ Cruise Control ๋‚ด์žฅ (์ž๋™, ์ฐฝ๊ณ  ์ง ์žฌ๋ฐฐ์น˜์ฒ˜๋Ÿผ)
ํ•™์Šต ๊ณก์„  ๋‚ฎ์Œ (Helm๋งŒ ์•Œ๋ฉด ๋จ) ๋†’์Œ (CRD·์˜คํผ๋ ˆ์ดํ„ฐ ์ดํ•ด ํ•„์š”)
๋ฆฌ์†Œ์Šค ์˜ค๋ฒ„ํ—ค๋“œ Kafka ํŒŒ๋“œ๋งŒ + ์˜คํผ๋ ˆ์ดํ„ฐ ํŒŒ๋“œ ์ƒ์‹œ ์ ์œ 
๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์™€ ํ†ต์ผ์„ฑ ๋†’์Œ (PostgreSQL·Redis ๋“ฑ ๊ฐ™์€ ์ฐจํŠธ๊ตฐ) Kafka ์ „์šฉ
์ ํ•ฉ ๊ทœ๋ชจ ์†Œ๊ทœ๋ชจ·๊ฐœ๋ฐœ·POC ์ค‘๋Œ€ํ˜•·์šด์˜·๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ

Strimzi ์žฅ๋‹จ์ 

์žฅ์  - Day-2 ์šด์˜(์—…๊ทธ๋ ˆ์ด๋“œ·๋ณต๊ตฌ·๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ·์ธ์ฆ์„œ ๊ฐฑ์‹ ) ์ž๋™ํ™”๊ฐ€ ํ•ต์‹ฌ ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค. Kafka๋Š” "์„ค์น˜"๋ณด๋‹ค "์šด์˜"์ด ํ›จ์”ฌ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. - ํ† ํ”ฝ·์œ ์ €๋ฅผ ์„ ์–ธํ˜•์œผ๋กœ ๊ด€๋ฆฌ → GitOps(ArgoCD)์™€ ๊ถํ•ฉ์ด ์ข‹์Šต๋‹ˆ๋‹ค. - CNCF ์ƒํƒœ๊ณ„์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€ Kafka ์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ·๋ฌธ์„œ๊ฐ€ ํƒ„ํƒ„ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ํ™” ๋‘ ๊ฐ€์ง€๋ฅผ ๋น„์œ ๋กœ ์งš์œผ๋ฉด — - ์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹ : ์—ฌ๊ถŒ์€ 10๋…„๋งˆ๋‹ค ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊นœ๋นกํ•˜๋ฉด ์ถœ๊ตญ ๋‹น์ผ ๊ณตํ•ญ์—์„œ ๋ง‰ํž™๋‹ˆ๋‹ค. TLS ์ธ์ฆ์„œ๋„ ๋งŒ๋ฃŒ๋˜๋ฉด ํ†ต์‹ ์ด ๋Š๊น๋‹ˆ๋‹ค. Strimzi๋Š” ๋งŒ๋ฃŒ ์ „์— ์•Œ์•„์„œ ์ƒˆ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ด ๋ผ์›Œ์ค๋‹ˆ๋‹ค(์—ฌ๊ถŒ ์ž๋™ ์žฌ๋ฐœ๊ธ‰ ์„œ๋น„์Šค๊ฐ€ ์žˆ๋Š” ์…ˆ). - ํŒŒํ‹ฐ์…˜ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ(Cruise Control): ์ฐฝ๊ณ ์—์„œ ์ง์ด ํŠน์ • ์„ ๋ฐ˜์—๋งŒ ๋ชฐ๋ฆฌ๋ฉด ๊ทธ ์„ ๋ฐ˜๋งŒ ๋ฌด๋„ˆ์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋” ์ง์„ ๊ณ ๋ฅด๊ฒŒ ์žฌ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, Strimzi๋Š” ์ด ์ฐฝ๊ณ  ์ •๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ค๋‹ˆ๋‹ค. Bitnami๋Š” ์‚ฌ๋žŒ์ด ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์  - ๊ฐœ๋…์ด ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค(CRD, NodePool, ์˜คํผ๋ ˆ์ดํ„ฐ ๋™์ž‘ ๋ชจ๋ธ). ์ž…๋ฌธ ์ง„์ž…์žฅ๋ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. - ์˜คํผ๋ ˆ์ดํ„ฐ ํŒŒ๋“œ๊ฐ€ ์ƒ์‹œ ๋–  ์žˆ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์”๋‹ˆ๋‹ค. ์ž‘์€ ๋‹จ์ผ ๋…ธ๋“œ์—๋Š” ๋ถ€๋‹ด์ž…๋‹ˆ๋‹ค. - "Kafka ํ•˜๋‚˜ ๋„์šฐ๊ณ  ๋"์ด๋ฉด ๊ณผํ•ฉ๋‹ˆ๋‹ค.

Bitnami ์žฅ๋‹จ์ 

์žฅ์  - ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. helm install ํ•œ ์ค„, values.yaml๋งŒ ๋งŒ์ง€๋ฉด ๋ฉ๋‹ˆ๋‹ค. - ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค(๋ณ„๋„ ์˜คํผ๋ ˆ์ดํ„ฐ ์—†์Œ). ๊ฐœ๋ฐœ·POC์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. - PostgreSQL·Redis·Jenkins๊นŒ์ง€ ๊ฐ™์€ Bitnami ์ฐจํŠธ๊ตฐ์œผ๋กœ ํ†ต์ผํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹จ์  - Day-2 ์šด์˜์ด ์ „๋ถ€ ์ˆ˜๋™์ž…๋‹ˆ๋‹ค(์—…๊ทธ๋ ˆ์ด๋“œ·๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ·์ธ์ฆ์„œ). - ์„ค์ • ๋ณ€๊ฒฝ ์•ˆ์ „์„ฑ(๋กค๋ง ์ˆœ์„œ ๋“ฑ)์ด ์˜คํผ๋ ˆ์ดํ„ฐ๋งŒํผ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์ด๋ฏธ์ง€ ๋™๊ฒฐ ์ด์Šˆ: 2025๋…„ 8์›”๋ถ€ํ„ฐ Bitnami๊ฐ€ ๋ฌด๋ฃŒ ์นดํƒˆ๋กœ๊ทธ๋ฅผ bitnamilegacy๋กœ ์˜ฎ๊ธฐ๊ณ  ๋™๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ bitnamilegacy/kafka ๊ฒฝ๋กœ๋Š” ๋ณด์•ˆ ํŒจ์น˜๊ฐ€ ๋” ๋“ค์–ด์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์˜ ์ด๊ด€ ์‹œ ๋ฐ˜๋“œ์‹œ ์ด๋ฏธ์ง€ ์†Œ์Šค๋ฅผ ์žฌ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


7. ์–ธ์ œ ๋ฌด์—‡์„ ๊ณจ๋ผ์•ผ ํ•˜๋‚˜

  • ๊ฐœ๋ฐœ·POC, ๋น ๋ฅด๊ฒŒ ๋„์šฐ๊ณ  ์‹ถ๋‹ค, ์šด์˜ ์ž๋™ํ™”๋Š” ์•„์ง ๋ถˆํ•„์š” → Bitnami(Helm). ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.
  • ์šด์˜, ๋ฌด์ค‘๋‹จ ์—…๊ทธ๋ ˆ์ด๋“œ·์ž๋™ ๋ณต๊ตฌ·๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ·GitOps ํ† ํ”ฝ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” → Strimzi(Operator). ์ดˆ๊ธฐ ํ•™์Šต ๋น„์šฉ์„ ๋‚ด๊ณ  ์šด์˜ ์ž๋™ํ™”๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ํ˜„์‹ค์ ์ธ ๊ธฐ์ค€: "Kafka๋ฅผ ์•ž์œผ๋กœ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์†๋ณผ ๊ฒƒ์ธ๊ฐ€" ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์•ˆ ๊ฑด๋“œ๋ฆฌ๊ณ  ํ•œ ๋ฒˆ ๋„์›Œ ์“ธ ๊ฑฐ๋ฉด Helm์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „์„ ์ž์ฃผ ์˜ฌ๋ฆฌ๊ณ , ํ† ํ”ฝ์ด ๊ณ„์† ๋Š˜๊ณ , ์ธ์ฆ์„œ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ , ์žฅ์•  ๋ณต๊ตฌ๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ ๋ฐ˜๋ณต ์ž‘์—…์„ ๋Œ€์‹ ํ•ด์ค„ ์˜คํผ๋ ˆ์ดํ„ฐ(Strimzi)์˜ ๊ฐ€์น˜๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค.


8. ํ˜„์žฅ ์ด์•ผ๊ธฐ: Strimzi๋กœ ์‹œ์ž‘ํ–ˆ๋‹ค๊ฐ€ Bitnami๋กœ ๋ฐ”๊พผ ์ด์œ 

์ด๊ฑด ์ž๋ฃŒ๋งŒ ๋ณด๊ณ  ๊ณ ๋ฅธ ๊ฒฐ๋ก ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ๋กœ ํ•œ ๋ฐ”ํ€ด ๋Œ์•„๋ณธ ๋์— ๋‚ด๋ฆฐ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ์ ์–ด๋‘ก๋‹ˆ๋‹ค.

์ฒ˜์Œ์— Strimzi๋ฅผ ๊ณ ๋ฅธ ์ด์œ 

์ฒ˜์Œ์—” "Kafka๋Š” ์šด์˜์ด ์–ด๋ ต๋‹ค๋‹ˆ๊นŒ ์ œ๋Œ€๋กœ ํ•˜์ž"๋Š” ์ƒ๊ฐ์ด ์ปธ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ์–ด๋””์„œ๋‚˜ Strimzi๊ฐ€ ํ‘œ์ค€์œผ๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค. CNCF ํ”„๋กœ์ ํŠธ์ด๊ณ , ์ƒ์šฉ ์ œํ’ˆ์˜ ๊ธฐ๋ฐ˜์ด๊ธฐ๋„ ํ•˜๊ณ , ๋ฌด์—‡๋ณด๋‹ค ์šด์˜ ์ž๋™ํ™”๊ฐ€ ๋งค๋ ฅ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฒ„์ „์„ ์˜ฌ๋ฆด ๋•Œ ์•Œ์•„์„œ ์•ˆ์ „ํ•œ ์ˆœ์„œ๋กœ ๋กค๋งํ•ด์ค€๋‹ค๋Š” ์ .
  • ํ† ํ”ฝ์„ YAML(KafkaTopic)๋กœ ์„ ์–ธํ•ด์„œ Git์— ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ . ๋งˆ์นจ ์šฐ๋ฆฌ๋Š” ArgoCD๋ฅผ ์“ฐ๋‹ˆ ๊ถํ•ฉ๋„ ์ข‹์•„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.
  • ์ธ์ฆ์„œ๋„ ์•Œ์•„์„œ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค๋Š” ์ .

๊ทธ๋•Œ ์‹ฌ์ •์€ ํ’€์˜ต์…˜ ์‹ ์ถ• ์•„ํŒŒํŠธ๋ฅผ ๊ณ„์•ฝํ•˜๋Š” ๊ธฐ๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋นŒํŠธ์ธ ๊ฐ€์ „์— ์‹œ์Šคํ…œ ์—์–ด์ปจ์— ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜๊นŒ์ง€, "์ด๊ฑฐ ํ•˜๋‚˜๋ฉด ์‚ด๋ฆผ ๊ฑฑ์ • ๋"์ด๋ผ๋Š” ์นดํƒˆ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ์•ˆ ๋Œ๋ฆด ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์จ๋ณด๋‹ˆ ๋ถˆํŽธํ–ˆ๋˜ ์ 

๋ฌธ์ œ๋Š” ์นดํƒˆ๋กœ๊ทธ์˜ ํ’€์˜ต์…˜์ด, ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋Š” ์ง‘ ๊ทœ๋ชจ์—๋Š” ๊ณผํ–ˆ๋‹ค๋Š” ๋ฐ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

1) ์ž‘์€ ํด๋Ÿฌ์Šคํ„ฐ์— ์‹๊ตฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ฐœ๋ฐœ ํด๋Ÿฌ์Šคํ„ฐ๋Š” 2์ฝ”์–ด ๋‹จ์ผ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Strimzi๋ฅผ ์˜ฌ๋ฆฌ๋‹ˆ ์˜คํผ๋ ˆ์ดํ„ฐ ํŒŒ๋“œ, ์—”ํ‹ฐํ‹ฐ ์˜คํผ๋ ˆ์ดํ„ฐ(ํ† ํ”ฝ/์œ ์ € ๊ด€๋ฆฌ) ํŒŒ๋“œ, ๊ฑฐ๊ธฐ์— ์ปจํŠธ๋กค๋Ÿฌ ํ’€๊ณผ ๋ธŒ๋กœ์ปค ํ’€ ํŒŒ๋“œ๊นŒ์ง€ ์ค„์ค„์ด ๋– ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์ž‘ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜๋ฅด๋Š” ๋ณธ์—…(๋ธŒ๋กœ์ปค)๋ณด๋‹ค ๊ทธ๊ฑธ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋” ๋ถ์ ์ด๋Š” ๋ชจ์–‘์ƒˆ๊ฐ€ ๋์Šต๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ์›๋ฃธ์— ์ง‘์‚ฌ์™€ ๊ฒฝ๋น„์›๊ณผ ๊ด€๋ฆฌ์†Œ์žฅ์„ ๋‹ค ๋“ค์ธ ๊ฒฉ์ž…๋‹ˆ๋‹ค. ํฐ ์ €ํƒ์ด๋ผ๋ฉด ์ด ์ธ๋ ฅ์ด ๋‹ค ์ œ๊ฐ’์„ ํ•˜์ง€๋งŒ, ์›๋ฃธ์—์„œ๋Š” ์ •์ž‘ ๋‚ด๊ฐ€ ์‰ด ๊ณต๊ฐ„์„ ๊ทธ๋“ค์ด ๋‹ค ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋…ธ๋“œ์—์„œ CPU๊ฐ€ ๋Š˜ ๋น ๋“ฏํ–ˆ๋˜ ์šฐ๋ฆฌ ํ™˜๊ฒฝ์—์„  ์ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ถ€๋‹ด์ด ๋์Šต๋‹ˆ๋‹ค.

2) ๊ฐ„๋‹จํ•œ ์ผ๋„ ํ•œ ๋‹จ๊ณ„๋ฅผ ๋” ๊ฑฐ์ณ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Strimzi์—์„œ๋Š” ๋‚ด๊ฐ€ StatefulSet์„ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Kafka CR์— ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ ์œผ๋ฉด ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋Œ€์‹  ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ์ž˜ ๋  ๋•Œ๋Š” ํŽธํ•œ๋ฐ, ์•ˆ ๋  ๋•Œ๊ฐ€ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ํŒŒ๋“œ๊ฐ€ ์•ˆ ๋œจ๋ฉด ์›์ธ์ด ๋‘ ๊ฒน์ž…๋‹ˆ๋‹ค. ๋‚ด ์„ค์ •์ด ํ‹€๋ฆฐ ๊ฑด์ง€, ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ทธ๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ–ˆ๋Š”์ง€๋ฅผ ์˜คํผ๋ ˆ์ดํ„ฐ ๋กœ๊ทธ๊นŒ์ง€ ๋“ค์–ด๊ฐ€์„œ ์ถ”์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ํ†ต์—ญ์‚ฌ๋ฅผ ๊ฑฐ์ณ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ‰์†Œ์—” ๋งค๋„๋Ÿฝ์ง€๋งŒ, ๋ง์ด ์ž˜๋ชป ์ „๋‹ฌ๋˜๋ฉด "๋‚ด๊ฐ€ ์ž˜๋ชป ๋งํ–ˆ๋‚˜, ํ†ต์—ญ์ด ์ž˜๋ชป ์˜ฎ๊ฒผ๋‚˜"๋ฅผ ์–‘์ชฝ ๋‹ค ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๋งํ•˜๋ฉด(์ง์ ‘ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์“ฐ๋ฉด) ์˜คํ•ดํ•  ์ผ์ด ํ•œ ๊ฒน ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

3) ์˜คํผ๋ ˆ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋˜ ์šด์˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Strimzi ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๋ฉด CRD ์Šคํ‚ค๋งˆ(apiVersion)๊ฐ€ ๋ฐ”๋€Œ์–ด ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ์ƒ๊น๋‹ˆ๋‹ค. Kafka๋ฅผ ํŽธํ•˜๊ฒŒ ์šด์˜ํ•˜๋ ค๊ณ  ๋„์ž…ํ•œ ๋„๊ตฌ์ธ๋ฐ, ๊ทธ ๋„๊ตฌ๋ฅผ ์šด์˜ํ•˜๋Š” ์ผ์ด ์ƒˆ๋กœ ์ƒ๊ธด ์…ˆ์ž…๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ์ฒญ์†Œ๋ฅผ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๋ฅผ ์ƒ€๋”๋‹ˆ, ์ด๋ฒˆ์—” ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๋ฅผ ์ฒญ์†Œํ•˜๊ณ  ํŽŒ์›จ์–ด๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ž๋™ํ™”๊ฐ€ ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฑธ ์ฒด๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

4) ์ •์ž‘ ์ž๋™ํ™”์˜ ์ง„๊ฐ€๋ฅผ ๋ˆ„๋ฆด ์ผ์ด ๋ณ„๋กœ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Strimzi์˜ ํ•ต์‹ฌ ๊ฐ€์น˜๋Š” ๋ฌด์ค‘๋‹จ ์—…๊ทธ๋ ˆ์ด๋“œ, ์ž๋™ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ, ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜ ๊ฐ™์€ "๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ" ๋น›๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๋Š” ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ์— ํ† ํ”ฝ๋„ ์†์— ๊ผฝ์„ ์ •๋„์˜€์Šต๋‹ˆ๋‹ค. 1๋…„์— ๋ช‡ ๋ฒˆ ์žˆ์„๊นŒ ํ•œ ์ผ์„ ์œ„ํ•ด, ๋งค์ผ ๋ฆฌ์†Œ์Šค์™€ ๋ณต์žก๋„๋ฅผ ์ง€๋ถˆํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, 1๋…„์— ํ•œ ๋ฒˆ ๊ฐˆ๊นŒ ๋ง๊นŒ ํ•œ ์บ ํ•‘์„ ์œ„ํ•ด ํฐ ์ฐจ๋ฅผ ์‚ฌ์„œ ๋งค์ผ ์ฃผ์ฐจ๋‚œ๊ณผ ๊ธฐ๋ฆ„๊ฐ’์— ์‹œ๋‹ฌ๋ฆฌ๋Š” ๊ฒฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

5) ๋‹ค๋ฅธ ๋ฏธ๋“ค์›จ์–ด์™€ ์šด์˜ ๋ฐฉ์‹์ด ๊ฐˆ๋ ธ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ PostgreSQL, Redis, Jenkins๋Š” ์ „๋ถ€ Bitnami Helm ์ฐจํŠธ๋กœ ๊น”๋ ค ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Kafka๋งŒ Strimzi๋ผ, ์šด์˜ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋„๊ตฌ๊ฐ€ ๋‘˜๋กœ ๋‚˜๋‰˜์—ˆ์Šต๋‹ˆ๋‹ค. "Redis๋Š” helm upgrade๋กœ, Kafka๋Š” CR ์ˆ˜์ •์œผ๋กœ" ์‹์œผ๋กœ ๋จธ๋ฆฟ์†์— ๋‘ ๊ฐœ์˜ ๋งค๋‰ด์–ผ์„ ๋“ค๊ณ  ๋‹ค๋…€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Bitnami๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค

๊ฒฐ๋ก ์€ ๋‹จ์ˆœํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ทœ๋ชจ์™€ ๋‹จ๊ณ„์—๋Š” ๊ฐ€๋ฒผ์šด ์ชฝ์ด ๋งž๋‹ค.

  • helm install ํ•œ ์ค„์ด๋ฉด ๋์ด๊ณ , ์„ค์ •์€ values.yaml ํ•˜๋‚˜๋งŒ ๋ด…๋‹ˆ๋‹ค.
  • ๋ณ„๋„ ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์—†์œผ๋‹ˆ ๋‹จ์ผ ๋…ธ๋“œ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋œ ๋จน์Šต๋‹ˆ๋‹ค.
  • PostgreSQL·Redis์™€ ๊ฐ™์€ Bitnami ์ฐจํŠธ๊ตฐ์œผ๋กœ ํ†ต์ผ๋˜์–ด, ์šด์˜ ๋งค๋‰ด์–ผ์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์กŒ์Šต๋‹ˆ๋‹ค.

ํ’€์˜ต์…˜ ์‹ ์ถ•์—์„œ ํ•„์š”ํ•œ ๊ฐ€๊ตฌ๋งŒ ์ง์ ‘ ๋“ค์ธ ๊น”๋”ํ•œ ์ž์ทจ๋ฐฉ์œผ๋กœ ์˜ฎ๊ธด ๋А๋‚Œ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ํ™”๋Š” ์ค„์—ˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์“ฐ๋Š” ๋งŒํผ๋งŒ ๋‘๋‹ˆ ์˜คํžˆ๋ ค ์†์— ์žกํ˜”์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Strimzi๊ฐ€ ๋‚˜์œ ๋„๊ตฌ๋ƒ ํ•˜๋ฉด, ์•„๋‹™๋‹ˆ๋‹ค

์˜คํ•ดํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Strimzi๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ด๊ณ , ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋‹ค์‹œ ๋Œ์•„๊ฐˆ ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๊ณ , ํ† ํ”ฝ์ด ์ˆ˜์‹ญ ๊ฐœ๋กœ ๋Š˜๊ณ , ๋ฌด์ค‘๋‹จ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์ผ์ƒ์ด ๋˜๋Š” ์ˆœ๊ฐ„ — ๊ทธ๋•Œ๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋งค์ผ ์ผํ•ด์ฃผ๋Š” ๊ฐ’์„ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ตํ›ˆ์€ "ํ‘œ์ค€์ด๋ผ์„œ"๊ฐ€ ์•„๋‹ˆ๋ผ "์ง€๊ธˆ ์šฐ๋ฆฌ ๊ทœ๋ชจ์— ๋งž์•„์„œ"๋กœ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๋„๊ตฌ์™€ ๋งž๋Š” ๋„๊ตฌ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ’€์˜ต์…˜์ด ํ•ญ์ƒ ์ •๋‹ต์€ ์•„๋‹ˆ๊ณ , ์ž์ทจ๋ฐฉ์—๋Š” ์ž์ทจ๋ฐฉ์— ๋งž๋Š” ์‚ด๋ฆผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋งค๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค๋Š” ์™œ ์ณ๋‹ค๋„ ์•ˆ ๋ดค๋‚˜

์—ฌ๊ธฐ์„œ ํ•œ ๋ฒˆ์ฏค ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. "Strimzi๊ฐ€ ๋ฌด๊ฒ๊ณ  Bitnami๊ฐ€ ๊ฐ€๋ณ๊ณ ๋ฅผ ๋”ฐ์ง€๊ธฐ ์ „์—, ๊ทธ๋ƒฅ ๋งค๋‹ˆ์ง€๋“œ Kafka(Confluent Cloud, AWS MSK ๊ฐ™์€)๋ฅผ ์“ฐ๋ฉด ์šด์˜ ์ž์ฒด๋ฅผ ์•ˆ ํ•ด๋„ ๋˜์ง€ ์•Š๋ƒ"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งž๋Š” ๋ง์ด๊ณ , ์‹ค์ œ๋กœ ๋งŽ์€ ๊ณณ์ด ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ์—๊ฒ ๊ทธ๊ฒŒ ์„ ํƒ์ง€์— ์•„์˜ˆ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ์‚ฌ๋‚ด ๋ฌผ๋ฆฌ์„œ๋ฒ„์ด๊ณ  ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งค๋‹ˆ์ง€๋“œ Kafka๋Š” ์ „๋ถ€ ํด๋ผ์šฐ๋“œ๋ฅผ ์ „์ œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ๋ฅผ ์•ˆ ์“ฐ๋Š” ์ˆœ๊ฐ„, ๊ทธ ์นดํƒˆ๋กœ๊ทธ๋Š” ํŽผ์ณ๋ณผ ์ˆ˜์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

๋” ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฑด ํด๋ผ์šฐ๋“œ์— ์˜ฌ๋ฆฌ๋Š” ๋‹จ์ผ ์•ฑ์ด ์•„๋‹ˆ๋ผ, ๊ณ ๊ฐ ํ™˜๊ฒฝ์— ํ†ต์งธ๋กœ ์„ค์น˜๋˜๋Š” ํ”Œ๋žซํผ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. ํ์‡„๋ง์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ Kafka๋ฅผ ํŠน์ • ํด๋ผ์šฐ๋“œ์˜ ๋งค๋‹ˆ์ง€๋“œ์— ๋ฌถ์–ด๋ฒ„๋ฆฌ๋ฉด, ์ œํ’ˆ์ด ๊ทธ ํด๋ผ์šฐ๋“œ์—์„œ๋งŒ ๋Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Kafka๋Š” ์ œํ’ˆ ์•ˆ์— ํฌํ•จ๋˜๋Š”, ์–ด๋””์„œ๋“  ์ž์ฒด์ ์œผ๋กœ ๋„๋Š” ์Šคํƒ์ด์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„์œ ํ•˜์ž๋ฉด, ์ด์‚ฌ ๋‹ค๋‹ ๋•Œ๋งˆ๋‹ค ๋“ค๊ณ  ๊ฐ€๋Š” ์‚ด๋ฆผ๊ณผ ๊ทธ ์ง‘์— ๋ถ™๋ฐ•์ด๋กœ ๋”ธ๋ฆฐ ์‹œ์Šคํ…œ ์—์–ด์ปจ์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๋งค๋‹ˆ์ง€๋“œ๋Š” ๊ทธ ๋™๋„ค(ํด๋ผ์šฐ๋“œ)์—๋งŒ ์žˆ๋Š” ๋ถ™๋ฐ•์ด๋ผ, ๋‹ค๋ฅธ ์ง‘(์˜จํ”„๋ ˜·ํ์‡„๋ง)์œผ๋กœ ์ด์‚ฌํ•˜๋ฉด ๋‘๊ณ  ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ œํ’ˆ์€ ์—ฌ๊ธฐ์ €๊ธฐ ์ด์‚ฌ ๋‹ค๋…€์•ผ ํ•˜๋‹ˆ, ์‚ด๋ฆผ์€ ์ง์ ‘ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋งค๋‹ˆ์ง€๋“œ๊ฐ€ ๋‚˜์œ ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋งž๋Š” ์ƒํ™ฉ์—์„  ๊ฐ€์žฅ ํŽธํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

  • ์ข‹์€ ์ : ์šด์˜ ๋ถ€๋‹ด์ด ๊ฑฐ์˜ 0์ž…๋‹ˆ๋‹ค. ํŒจ์น˜·์Šค์ผ€์ผ·์žฅ์• ๋ณต๊ตฌ๋ฅผ ๋ฒค๋”๊ฐ€ ๋‹ค ํ•ฉ๋‹ˆ๋‹ค. "Kafka ์šด์˜ํŒ€"์ด ํ•„์š” ์—†๊ณ , SLA๋กœ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅ๋ฐ›๊ณ , ๋ณด์•ˆ ํŒจ์น˜๋„ ์ž๋™์ž…๋‹ˆ๋‹ค. ๊ฑด๋ฌผ ๊ด€๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ์œ„ํƒํ•œ ์…ˆ์ž…๋‹ˆ๋‹ค.
  • ์•„์‰ฌ์šด ์ : ๊ธธ๊ฒŒ ๋ณด๋ฉด ๋น„์šฉ์ด ํฝ๋‹ˆ๋‹ค(์ฒ˜๋ฆฌ๋Ÿ‰·์ €์žฅ๋Ÿ‰·์ „์†ก๋Ÿ‰๋งˆ๋‹ค ์š”๊ธˆ). ๋ฒค๋”์— ์ข…์†๋˜๊ณ , ์„ธ๋ฐ€ํ•œ ํŠœ๋‹์˜ ์ž์œ ๊ฐ€ ์ค„๊ณ , ๋ฌด์—‡๋ณด๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์™ธ๋กœ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ๋ณด์•ˆ·๊ทœ์ œ·ํ์‡„๋ง ์š”๊ฑด์ด ์žˆ์œผ๋ฉด ์ด ์ง€์ ์—์„œ ๋ง‰ํž™๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋งค๋‹ˆ์ง€๋“œ๋Š” "ํด๋ผ์šฐ๋“œ๋ฅผ ์“ฐ๊ณ , Kafka ์šด์˜์— ์‚ฌ๋žŒ์„ ์•ˆ ์“ฐ๊ณ  ์‹ถ์€" ์กฐ์ง์— ์ตœ์ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜จํ”„๋ ˜ ํ”Œ๋žซํผ ์ œํ’ˆ์ด๋ผ ์ •๋ฐ˜๋Œ€ ์ž๋ฆฌ์— ์žˆ์—ˆ๊ณ , ๊ทธ๋ž˜์„œ ์ž์ฒด ํ˜ธ์ŠคํŒ…์ด ํƒ€ํ˜‘์ด ์•„๋‹ˆ๋ผ ํ™˜๊ฒฝ์ด ์ •ํ•ด์ค€ ๋‹ต์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด ํ˜ธ์ŠคํŒ… ์•ˆ์—์„œ Strimzi์™€ Bitnami๋ฅผ ์ €์šธ์งˆํ•œ ๊ฒŒ ์ด ๊ธ€์˜ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.


9. ๋„์ž… ํ˜„ํ™ฉ: ๋ˆ„๊ฐ€ ์–ด๋””์„œ ๋” ์“ฐ๋‚˜

์ž์ฃผ ๋ฐ›๋Š” ์งˆ๋ฌธ์ด "๊ทธ๋ž˜์„œ ๋‘˜ ์ค‘ ๋ญ˜ ๋” ๋งŽ์ด ์“ฐ๋ƒ, ๋Œ€๊ธฐ์—…์€ ๋ญ˜ ์“ฐ๋ƒ" ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์†”์งํ•˜๊ฒŒ ๋งํ•˜๋ฉด, "๋ช‡ ๋Œ€ ๋ช‡"์œผ๋กœ ๋”ฑ ๋–จ์–ด์ง€๋Š” ๊ณต๊ฐœ ์ ์œ ์œจ ํ†ต๊ณ„๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์„ 1:1๋กœ ์ค„์„ธ์šฐ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์•ฝ๊ฐ„ ์–ด๊ธ‹๋‚œ ๋น„๊ต์ž…๋‹ˆ๋‹ค. ์šฉ๋„๊ฐ€ ๋‹ค๋ฅธ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ฐฉํ–ฅ์„ฑ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ๋ฌด๋Œ€์˜ 1๋“ฑ

  • "K8s์—์„œ Kafka๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ์šด์˜" ํ•˜๋Š” ๋ฌด๋Œ€ → Strimzi๊ฐ€ ์‚ฌ์‹ค์ƒ ๋…์ ์  ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค Kafka ์˜คํผ๋ ˆ์ดํ„ฐ ์ค‘ ๊ฒฝ์Ÿ์ž๋ผ ํ•  ๋งŒํ•œ ๊ฑด ์ƒ์šฉ ์ œํ’ˆ ์ •๋„๋ฟ์ž…๋‹ˆ๋‹ค.
  • "๋น ๋ฅด๊ฒŒ Kafka ํ•˜๋‚˜ ๋„์šฐ๊ธฐ"(๊ฐœ๋ฐœ·POC·๋‚ด๋ถ€๋„๊ตฌ) ๋ฌด๋Œ€ → Bitnami Helm ์ฐจํŠธ๊ฐ€ ๊ฐ€์žฅ ํ”ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰ ๋‘˜์€ "๋ˆ„๊ฐ€ ๋” ๋งŽ์ด ์“ฐ์ด๋ƒ"๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฌด๋Œ€์—์„œ ๊ฐ๊ฐ 1๋“ฑ์ž…๋‹ˆ๋‹ค. ์šด์˜ ๋ฌด๋Œ€๋Š” Strimzi, ๊ฐ„ํŽธ ์„ค์น˜ ๋ฌด๋Œ€๋Š” Bitnami.

๋น„์œ ํ•˜์ž๋ฉด, ํŠธ๋Ÿญ๊ณผ ๊ฒฝ์ฐจ๋ฅผ "๋ญ๊ฐ€ ๋” ๋งŽ์ด ํŒ”๋ฆฌ๋ƒ"๋กœ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋‚ด ์ถœํ‡ด๊ทผ์šฉ์œผ๋กœ๋Š” ๊ฒฝ์ฐจ๊ฐ€ ์••๋„์ ์œผ๋กœ ๋งŽ์ด ๊ตด๋Ÿฌ๋‹ค๋‹ˆ๊ณ , ๋ฌผ๋ฅ˜ ํ˜„์žฅ์—์„œ๋Š” ํŠธ๋Ÿญ์ด ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ๊ธธ์—์„œ ๋” ์ž์ฃผ ๋ณด์ด๋Š” ๊ฑด ๊ฒฝ์ฐจ์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค๊ณ  ํŠธ๋Ÿญ์ด ์ธ๊ธฐ๊ฐ€ ์—†๋Š” ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌด๋Œ€๊ฐ€ ๋‹ค๋ฅผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—…์˜ ํ˜„์‹ค — ๋ฐ˜์ „์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค

์—ฌ๊ธฐ์—” ์˜์™ธ์˜ ์‚ฌ์‹ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹น์ˆ˜ ๋Œ€๊ธฐ์—…์€ Kafka๋ฅผ ์•„์˜ˆ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์˜ ๋ถ€๋‹ด์ด ์ปค์„œ ๋งค๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค(Confluent Cloud, AWS MSK, Aiven ๋“ฑ)๋ฅผ ์‚ฌ์„œ ์”๋‹ˆ๋‹ค. "์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ Kafka๋ฅผ ๋Œ๋ณด์ง€ ์•Š๊ณ , ๋ˆ ๋‚ด๊ณ  ๋‚จ์—๊ฒŒ ๋งก๊ธด๋‹ค"๋Š” ์„ ํƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ์ง์ ‘ K8s ์œ„์— Kafka๋ฅผ ๊ตด๋ฆฌ๋Š” ๋Œ€๊ธฐ์—…์ด๋ผ๋ฉด ๋ฐฉํ–ฅ์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  • ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ฐ„๋‹ค → ๊ฑฐ์˜ Strimzi. "๋Œ€๊ธฐ์—… + ์šด์˜ + ์˜คํ”ˆ์†Œ์Šค Kafka on K8s" ์กฐํ•ฉ์—์„œ Strimzi๋Š” ํ‘œ์ค€์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
  • ์ƒ์šฉ์œผ๋กœ ๊ฐ„๋‹ค → Confluent ์˜คํผ๋ ˆ์ดํ„ฐ, ๋˜๋Š” Red Hat์˜ ์ƒ์šฉ Kafka(์ด๊ฒƒ๋„ ๋‚ด๋ถ€๋Š” Strimzi ๊ธฐ๋ฐ˜).

๋ฐ˜๋Œ€๋กœ Bitnami๋กœ ๋Œ€๊ธฐ์—… ํ”„๋กœ๋•์…˜ Kafka๋ฅผ ๋ฉ”์ธ์œผ๋กœ ๊ตด๋ฆฌ๋Š” ๊ฒฝ์šฐ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋“œ๋ญ…๋‹ˆ๋‹ค. ์šด์˜ ์ž๋™ํ™”๊ฐ€ ์—†์–ด์„œ, ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์‚ฌ๋žŒ์ด ๋– ์•ˆ์„ ์ผ์ด ๊ฐ๋‹น์ด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด: ์ง„์ง€ํ•˜๊ฒŒ ์˜ค๋ž˜ ์šด์˜ํ•˜๋ฉด Strimzi(๋˜๋Š” ๋งค๋‹ˆ์ง€๋“œ) ์ชฝ, ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๊ฒŒ ์“ฐ๋ฉด Bitnami ์ชฝ. ์ž‘์€ ๋‹จ์ผ ๋…ธ๋“œ์ธ ์šฐ๋ฆฌ๊ฐ€ Bitnami๋กœ ๊ฐ„ ๊ฑด ํ•ฉ๋ฆฌ์ ์ด๊ณ , ๋Œ€๊ธฐ์—… ๊ทœ๋ชจ๋กœ ์ปค์ง„๋‹ค๋ฉด Strimzi๋‚˜ ๋งค๋‹ˆ์ง€๋“œ๋กœ ์˜ฎ๊ฒจ๊ฐ€๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ˆ˜์ˆœ์ž…๋‹ˆ๋‹ค.

์ƒ์ƒํ•œ ์žฅ๋‹จ์ , ๋‹ค์‹œ ํ•œ ๋ฒˆ

ํ‘œ(6์žฅ)๋กœ ์ •๋ฆฌํ•œ ๊ฑธ, ์ด๋ฒˆ์—” ์ฒด๊ฐ ์œ„์ฃผ๋กœ ํ’€์–ด๋ด…๋‹ˆ๋‹ค.

Strimzi๋ฅผ ์“ฐ๋ฉด ์ข‹์€ ์ˆœ๊ฐ„ - ์ƒˆ๋ฒฝ์— ๋ธŒ๋กœ์ปค ํ•œ ๋Œ€๊ฐ€ ์ฃฝ์–ด๋„, ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์•Œ์•„์„œ ๊ฐ™์€ ๋””์Šคํฌ์— ๋‹ค์‹œ ๋ถ™์—ฌ ์‚ด๋ ค๋†“์Šต๋‹ˆ๋‹ค. ์ž๋‹ค ๊นจ์„œ ์†๋Œˆ ์ผ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. - "Kafka 3.9 → 4.0 ์˜ฌ๋ ค๋ผ"๋Š” ์ง€์‹œ๊ฐ€ ๋–จ์–ด์กŒ์„ ๋•Œ, version ํ•œ ์ค„๋งŒ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋Œ€์”ฉ ์•ˆ์ „ํ•˜๊ฒŒ ๊ต์ฒดํ•˜๋Š” ๊ฑด ์˜คํผ๋ ˆ์ดํ„ฐ ๋ชซ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ฒ ํ…Œ๋ž‘ ์šด์˜์ž ํ•œ ๋ช…์„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ์ฃผ์‹œํ‚จ ๋А๋‚Œ์ž…๋‹ˆ๋‹ค. - ํ† ํ”ฝ 100๊ฐœ๋ฅผ Git์— YAML๋กœ ๋ฐ•์•„๋‘๋ฉด, ์–ด๋А ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜๋“  ๋˜‘๊ฐ™์ด ์žฌํ˜„๋ฉ๋‹ˆ๋‹ค. "์ด ํ† ํ”ฝ ๋ˆ„๊ฐ€ ์–ธ์ œ ์™œ ๋งŒ๋“ค์—ˆ์ง€"๊ฐ€ Git ํžˆ์Šคํ† ๋ฆฌ์— ๋‹ค ๋‚จ์Šต๋‹ˆ๋‹ค.

Strimzi๋ฅผ ์“ฐ๋ฉด ์•„ํ”ˆ ์ˆœ๊ฐ„ - ํŒŒ๋“œ๊ฐ€ ์•ˆ ๋œจ๋Š”๋ฐ, ๋‚ด ์„ค์ • ๋ฌธ์ œ์ธ์ง€ ์˜คํผ๋ ˆ์ดํ„ฐ ํ•ด์„ ๋ฌธ์ œ์ธ์ง€ ๋กœ๊ทธ๋ฅผ ๋‘ ๊ตฐ๋ฐ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ†ต์—ญ์‚ฌ๋ฅผ ๊ฑฐ์นœ ๋Œ€ํ™”์ฒ˜๋Ÿผ, ์˜คํ•ด์˜ ์ถœ์ฒ˜๊ฐ€ ํ•œ ๊ฒน ๋” ์ƒ๊น๋‹ˆ๋‹ค. - ์ž‘์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„  ์˜คํผ๋ ˆ์ดํ„ฐ·์—”ํ‹ฐํ‹ฐ์˜คํผ๋ ˆ์ดํ„ฐ·์ปจํŠธ๋กค๋Ÿฌ·๋ธŒ๋กœ์ปค ํŒŒ๋“œ๊ฐ€ ์ค„์ค„์ด ๋– ์„œ ์ž์›์„ ์•ผ๊ธˆ์•ผ๊ธˆ ๋จน์Šต๋‹ˆ๋‹ค. ์›๋ฃธ์— ๊ด€๋ฆฌ ์ธ๋ ฅ๋งŒ ๋ถ์ ์ด๋Š” ๊ฒฉ์ž…๋‹ˆ๋‹ค. - Strimzi ์ž์ฒด๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ CRD ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ฑ™๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฒญ์†Œ ๋กœ๋ด‡์„ ๋˜ ์ฒญ์†Œํ•˜๋Š” ์ผ์ด ์ƒ๊น๋‹ˆ๋‹ค.

Bitnami๋ฅผ ์“ฐ๋ฉด ์ข‹์€ ์ˆœ๊ฐ„ - helm install ํ•œ ์ค„๋กœ 10๋ถ„ ๋งŒ์— Kafka๊ฐ€ ๋œน๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋‹น์žฅ ๋ฉ”์‹œ์ง€๋ฅผ ํ˜๋ ค๋ณด๊ณ  ์‹ถ์„ ๋•Œ ๋ง‰ํž˜์ด ์—†์Šต๋‹ˆ๋‹ค. - values.yaml ํ•˜๋‚˜๋งŒ ๋ณด๋ฉด ๋ชจ๋“  ์„ค์ •์ด ๊ฑฐ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๋ฆฝ ์„ค๋ช…์„œ ํ•œ ์žฅ์œผ๋กœ ๋๋‚˜๋Š” ๊ฐ€๊ตฌ ๊ฐ™์€ ๋ช…๋ฃŒํ•จ์ž…๋‹ˆ๋‹ค. - Postgres·Redis์™€ ์šด์˜ ๋ฐฉ์‹์ด ๊ฐ™์•„, ๋จธ๋ฆฟ์† ๋งค๋‰ด์–ผ์ด ํ•˜๋‚˜๋กœ ํ†ต์ผ๋ฉ๋‹ˆ๋‹ค.

Bitnami๋ฅผ ์“ฐ๋ฉด ์•„ํ”ˆ ์ˆœ๊ฐ„ - ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ "ํ•œ ๋Œ€์”ฉ ์•ˆ์ „ํ•˜๊ฒŒ"๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์‹ ๊ฒฝ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชปํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์ƒ™๋‹ˆ๋‹ค. - ์ธ์ฆ์„œ ๋งŒ๋ฃŒ, ํŒŒํ‹ฐ์…˜ ์ ๋ฆผ ๊ฐ™์€ ๊ฑธ ์•„๋ฌด๋„ ๋Œ€์‹  ์•ˆ ๋ด์ค๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์—†๋Š” ์—ฌ๊ถŒ ๋งŒ๋ฃŒ์ฒ˜๋Ÿผ, ํ„ฐ์ง€๊ณ  ๋‚˜์„œ์•ผ ์••๋‹ˆ๋‹ค. - ๊ทธ๋ฆฌ๊ณ  ํ˜„์‹ค์  ํ•จ์ • ํ•˜๋‚˜ — bitnamilegacy ์ด๋ฏธ์ง€๋Š” ๋ณด์•ˆ ํŒจ์น˜๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒฝ๋กœ๋ผ, ์˜ค๋ž˜ ์šด์˜ํ•˜๋ ค๋ฉด ์ด๋ฏธ์ง€ ์ถœ์ฒ˜๋ฅผ ๊ฐˆ์•„๋ผ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


10. ์šฉ์–ด์ง‘

  • Kafka: ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ. ๋ฉ”์‹œ์ง€๋ฅผ ํ† ํ”ฝ์— ์Œ“๊ณ  ์—ฌ๋Ÿฌ ์†Œ๋น„์ž๊ฐ€ ๋‚˜๋ˆ  ์ฝ์Šต๋‹ˆ๋‹ค.
  • StatefulSet: ๊ณ ์ • ์ด๋ฆ„·๊ณ ์ • ๋””์Šคํฌ·์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” K8s ๋ฆฌ์†Œ์Šค. ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์•ฑ(Kafka, DB)์— ์”๋‹ˆ๋‹ค.
  • PVC(PersistentVolumeClaim): ํŒŒ๋“œ๊ฐ€ ์ฃฝ์–ด๋„ ์œ ์ง€๋˜๋Š” ์˜์† ๋””์Šคํฌ ์š”์ฒญ. ํŒŒ๋“œ๊ฐ€ ๋‹ค์‹œ ๋– ๋„ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋ถ™์Šต๋‹ˆ๋‹ค.
  • ZooKeeper: ๊ณผ๊ฑฐ Kafka์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์‹  ๊ด€๋ฆฌํ•˜๋˜ ๋ณ„๋„ ์‹œ์Šคํ…œ. KRaft๋กœ ๋Œ€์ฒด๋˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
  • KRaft (Kafka Raft): ZooKeeper๋ฅผ ์—†์• ๊ณ  Kafka๊ฐ€ ์ž๊ธฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“œ. Raft ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ.
  • controller / broker: KRaft์—์„œ์˜ ์—ญํ• . ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ·ํ•ฉ์˜, ๋ธŒ๋กœ์ปค๋Š” ์‹ค์ œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ.
  • Helm: K8s์šฉ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € + ํ…œํ”Œ๋ฆฟ ์—”์ง„. values.yaml๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ฐ์–ด๋ƒ…๋‹ˆ๋‹ค.
  • Operator: ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์ƒ์ฃผํ•˜๋ฉฐ CRD๋ฅผ ๋ณด๊ณ  ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ.
  • CRD(Custom Resource Definition): K8s์— ์ƒˆ ๋ฆฌ์†Œ์Šค ์ข…๋ฅ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ™•์žฅ. Strimzi์˜ Kafka, KafkaTopic ๋“ฑ.
  • ๋ฆฌ์ปจ์‹ค๋ ˆ์ด์…˜(reconciliation): ํ˜„์žฌ ์ƒํƒœ์™€ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋น„๊ตํ•ด ์ฐจ์ด๋ฅผ ๋ฉ”์šฐ๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์กฐ์ • ๋ฃจํ”„.
  • Cruise Control: Kafka ํŒŒํ‹ฐ์…˜์„ ์ž๋™์œผ๋กœ ์žฌ๋ฐฐ์น˜(๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ)ํ•ด์ฃผ๋Š” ๋„๊ตฌ. Strimzi์— ํ†ตํ•ฉ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • Apache Kafka ๊ณต์‹ ๋ฌธ์„œ (KRaft): https://kafka.apache.org/documentation/#kraft
  • Strimzi ๊ณต์‹ ๋ฌธ์„œ: https://strimzi.io/docs/operators/latest/overview
  • Bitnami Kafka ์ฐจํŠธ: https://github.com/bitnami/charts/tree/main/bitnami/kafka
  • Bitnami ์นดํƒˆ๋กœ๊ทธ ๋ณ€๊ฒฝ(legacy ์ด์ „) ๊ณต์ง€: https://github.com/bitnami/charts/issues/35164