← 학습 카테고리

Learn

Kafka

42개 모듈 · 현재 32번째

Kafka 모듈 32/42 kafka-learn-32

호환성 매트릭스와 Docker로 실행하기

Apache Kafka Official Documentation — Getting Started (v4.3) — Apache Software Foundation Section 7: Compatibility (pp.41-43), Section 8: Docker (pp.44-45)

이 모듈을 다 읽으면

  • Kafka 4.0에서 모듈별(Client/Streams/Connect/Server)로 요구되는 JDK 버전 차이를 설명할 수 있다.
  • KRaft 클러스터 버전과 4.0 서버 간 호환성이 static/dynamic voter 여부에 따라 어떻게 달라지는지 판단할 수 있다.
  • 오래된 클라이언트가 4.0 브로커와 호환되지 않는 이유를 설명할 수 있다.
  • Docker로 Kafka를 실행하는 두 가지 이미지(JVM 기반, GraalVM 네이티브)의 차이와 사용법을 설명할 수 있다.

Kafka 4.0은 모듈별로 요구하는 JDK 버전이 다르고, 기존 KRaft 클러스터나 구버전 클라이언트와의 호환성도 버전 구간·쿼럼 구성 방식에 따라 세분화되어 있다. 공식 Docker 이미지는 JVM 기반과 실험적인 GraalVM 네이티브 기반 두 종류가 제공된다.

모듈별 JDK 호환성

Kafka 4.0.0 기준으로 Java 8은 완전히 제거되어 어떤 모듈도 지원하지 않는다. 그런데 필요한 최소 버전은 모듈마다 다르다: Client와 Streams 모듈은 Java 11/17/23을 모두 지원하지만, Connect와 Server(브로커) 모듈은 Java 11을 지원하지 않고 Java 17/23만 지원한다. 즉 브로커를 4.0으로 올리려면 최소 Java 17 런타임이 필요하고, 클라이언트 애플리케이션만 있다면 Java 11로도 충분하다.

핵심 포인트

  • Java 8은 Kafka 4.0의 어떤 모듈에서도 지원되지 않는다.
  • Client/Streams 모듈: Java 11/17/23 지원. Connect/Server 모듈: Java 17/23만 지원(Java 11 불가).
  • 브로커를 올릴 때와 클라이언트만 올릴 때 요구되는 최소 JDK가 다르다는 점에 주의해야 한다.

KRaft 클러스터-서버 호환성: static/dynamic voter

기존 KRaft 클러스터를 4.0 서버로 업그레이드할 수 있는지는 기존 클러스터 버전과 쿼럼 구성 방식(static voter vs dynamic voter)에 따라 갈린다. 3.2.x 이전 버전은 static/dynamic 어느 쪽이든 4.0과 호환되지 않는다. 3.3.x~3.8.x는 static voter로 구성된 경우에만 4.0과 호환되고, dynamic voter 구성이라면 호환되지 않는다. 3.9.x부터는 static/dynamic 모두 4.0과 호환된다. 단, 이미 static voter로 구성된 클러스터를 dynamic voter로 업그레이드하는 것은 지원되지 않는다(KAFKA-16538).

핵심 포인트

  • 3.2.x 이전 KRaft 클러스터는 static/dynamic 무관하게 4.0과 호환되지 않는다.
  • 3.3.x~3.8.x는 static voter 구성일 때만 4.0과 호환된다.
  • 3.9.x 이상부터 static/dynamic voter 모두 4.0과 호환된다.
  • static voter → dynamic voter로의 업그레이드는 지원되지 않는다(KAFKA-16538).

클라이언트-브로커 하위 호환성

4.0 브로커와 통신할 수 있는 클라이언트 버전에도 등급이 있다. 0.x/1.x/2.0 클라이언트(Client/Streams/Connect 공통)는 pre-0.10.x 프로토콜이 완전히 제거된 KIP-896 때문에 4.0과 아예 호환되지 않는다. 2.1~2.8 클라이언트는 부분적으로만 호환되며(Client는 '부분 호환', Streams/Connect는 '제한적 호환'으로 더 낮은 등급), 3.x 클라이언트는 Client/Streams/Connect 모두 완전히 호환된다. 실무적으로는 4.0 클러스터를 운영한다면 클라이언트를 최소 3.x로 맞추는 것이 안전하다.

또한 AdminClient 계열 명령에서 --zookeeper 옵션이 4.0부터 완전히 제거됐다 — 이제는 무조건 --bootstrap-server로 클러스터에 접근해야 하며, 이는 KRaft 전환과 맞물린 변화다.

핵심 포인트

  • 0.x/1.x/2.0 클라이언트는 pre-0.10.x 프로토콜 제거(KIP-896)로 4.0과 완전히 비호환이다.
  • 2.1~2.8 클라이언트는 부분/제한적으로만 호환되고, 3.x 클라이언트는 완전히 호환된다.
  • AdminClient의 --zookeeper 옵션이 4.0에서 완전히 제거되어 --bootstrap-server만 사용 가능하다.

Docker로 Kafka 실행하기: JVM 이미지 vs GraalVM 네이티브 이미지

Apache Kafka는 Docker Hub에 두 종류의 공식 이미지를 제공한다.

첫째는 JVM 기반 이미지(apache/kafka)로 3.7.0부터 제공된다. `docker pull apache/kafka:4.3.1`(또는 `:latest`)로 받은 뒤 `docker run -p 9092:9092 apache/kafka:4.3.1`로 기본 설정, 기본 포트(9092)로 컨테이너를 띄울 수 있다.

둘째는 GraalVM 기반 네이티브 이미지(apache/kafka-native)로 3.8.0부터 제공된다. 실행 명령은 `docker pull apache/kafka-native:4.3.1` / `docker run -p 9092:9092 apache/kafka-native:4.3.1`로 JVM 이미지와 사용법은 동일하지만, 공식 문서는 이 이미지가 '실험적(experimental)'이며 로컬 개발/테스트 용도로만 의도된 것이고 프로덕션에는 권장하지 않는다고 명시한다.

핵심 포인트

  • JVM 기반 이미지(apache/kafka)는 3.7.0부터, GraalVM 네이티브 이미지(apache/kafka-native)는 3.8.0부터 제공된다.
  • 두 이미지 모두 docker pull → docker run -p 9092:9092 <image>:<tag> 로 동일하게 실행한다.
  • GraalVM 네이티브 이미지는 실험적 기능으로, 로컬 개발/테스트용이며 프로덕션 사용은 권장되지 않는다.