Apache Kafka 배포
1. 배포 방법
1) 배포시 주의 사항
- Apache Kafka 4.0.0은 KRaft 모드로만 동작하며 ZooKeeper가 필요하지 않습니다.
- Controller-eligible 노드와 Broker-only 노드를 분리하여 배포할 수 있습니다.
- SASL 인증이 기본적으로 활성화되어 있으므로 클라이언트 연결 시 인증 정보가 필요합니다.
- 프로덕션 환경에서는 리소스 설정과 영속성 스토리지 설정을 반드시 확인해야 합니다.
2) 배포 방법
git clone https://github.com/paasup/service-catalog.git
cd charts/kafka
helm upgrade kafka ./ -f custom-values.yaml --install -n kafka --create-namespace
2. custom-values.yaml 예시
다음은 배포 시 사용할 수 있는 custom-values.yaml 파일의 예시입니다:
# Global 설정
global:
imageRegistry: "" # paasup.io (오프라인 환경에서 설정)
imagePullSecrets: []
defaultStorageClass: ""
# Kafka 이미지 설정
image:
registry: docker.io
repository: bitnami/kafka
tag: 4.0.0-debian-12-r10
# Controller-eligible 노드 설정 (Controller + Broker 역할)
controller:
replicaCount: 3
controllerOnly: false # true로 설정하면 Controller 전용 노드
persistence:
enabled: true
size: 8Gi
storageClass: ""
logPersistence:
enabled: false
size: 8Gi
storageClass: ""
resources: {}
resourcesPreset: "small"
# Broker-only 노드 설정 (선택사항)
broker:
replicaCount: 0 # 필요시 증가
persistence:
enabled: true
size: 8Gi
storageClass: ""
logPersistence:
enabled: true
size: 8Gi
storageClass: ""
resources: {}
resourcesPreset: "small"
# 리스너 설정
listeners:
client:
containerPort: 9092
protocol: SASL_PLAINTEXT
controller:
containerPort: 9093
protocol: SASL_PLAINTEXT
interbroker:
containerPort: 9094
protocol: SASL_PLAINTEXT
# SASL 인증 설정
sasl:
enabledMechanisms: PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
client:
users: ["user1"]
passwords: "" # 자동 생성 또는 별도 설정
# 서비스 설정
service:
type: ClusterIP
ports:
client: 9092
# 메트릭 설정
metrics:
jmx:
enabled: false
3. custom-values.yaml 설정 설명
1) 전역 설정
| Name |
설명 |
기본값 |
global.imageRegistry |
오프라인 설치 시에 설정. paasup 설치시에는 "paasup.io"으로 설정 |
"" |
global.imagePullSecrets |
Docker 레지스트리 시크릿 이름 배열 |
[] |
global.defaultStorageClass |
영속성 볼륨을 위한 기본 StorageClass |
"" |
2) Kafka 이미지 설정
| Name |
설명 |
기본값 |
image.registry |
Kafka 이미지 레지스트리 |
docker.io |
image.repository |
Kafka 이미지 리포지토리 |
bitnami/kafka |
image.tag |
Kafka 이미지 태그 |
4.0.0-debian-12-r10 |
3) Controller-eligible 노드 설정
| Name |
설명 |
기본값 |
controller.replicaCount |
Controller-eligible 노드 수 |
3 |
controller.controllerOnly |
true로 설정하면 Controller 전용 노드로 동작 false면 Controller+Broker 역할 |
false |
controller.persistence.enabled |
데이터 영속성 활성화 |
true |
controller.persistence.size |
영속성 볼륨 크기 |
8Gi |
controller.persistence.storageClass |
영속성 볼륨 StorageClass |
"" |
controller.logPersistence.enabled |
로그 영속성 활성화 |
false |
controller.resourcesPreset |
리소스 프리셋 (none, nano, micro, small, medium, large, xlarge, 2xlarge) |
small |
4) Broker-only 노드 설정 (선택사항)
| Name |
설명 |
기본값 |
broker.replicaCount |
Broker 전용 노드 수 (0이면 비활성화) |
0 |
broker.persistence.enabled |
데이터 영속성 활성화 |
true |
broker.persistence.size |
영속성 볼륨 크기 |
8Gi |
broker.logPersistence.enabled |
로그 영속성 활성화 |
false |
broker.resourcesPreset |
리소스 프리셋 |
small |
5) 리스너 설정
| Name |
설명 |
기본값 |
listeners.client.containerPort |
클라이언트 연결 포트 |
9092 |
listeners.client.protocol |
클라이언트 리스너 보안 프로토콜 |
SASL_PLAINTEXT |
listeners.controller.containerPort |
Controller 통신 포트 |
9093 |
listeners.controller.protocol |
Controller 리스너 보안 프로토콜 |
SASL_PLAINTEXT |
listeners.interbroker.containerPort |
Broker 간 통신 포트 |
9094 |
listeners.interbroker.protocol |
Inter-broker 리스너 보안 프로토콜 |
SASL_PLAINTEXT |
6) SASL 인증 설정
| Name |
설명 |
기본값 |
sasl.enabledMechanisms |
활성화된 SASL 메커니즘 (쉼표로 구분) |
PLAIN,SCRAM-SHA-256,SCRAM-SHA-512 |
sasl.client.users |
클라이언트 사용자 목록 |
["user1"] |
sasl.client.passwords |
클라이언트 사용자 비밀번호 (빈 문자열이면 자동 생성) |
"" |
7) 메트릭 설정
| Name |
설명 |
기본값 |
metrics.jmx.enabled |
JMX 메트릭을 Prometheus로 노출할지 여부 |
false |
4. 배포 아키텍처
1) 기본 배포 (Controller + Broker)
controller.replicaCount: 3, controller.controllerOnly: false
- 각 노드가 Controller와 Broker 역할을 모두 수행
- 소규모 환경에 적합
2) 분리 배포 (Controller 전용 + Broker 전용)
controller.replicaCount: 3, controller.controllerOnly: true
broker.replicaCount: 3 이상
- Controller와 Broker 역할을 분리하여 성능 최적화
- 대규모 환경에 적합
5. 클라이언트 연결
1) 클라이언트 설정 예시
bootstrap.servers=kafka:9092
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="user1" password="<password>";
2) 비밀번호 확인
kubectl get secret kafka-user-passwords -o jsonpath='{.data.client-passwords}' | base64 -d
6. 트러블슈팅
1) 일반적인 문제
- Pod 시작 실패: 리소스 부족 또는 영속성 볼륨 문제 확인
- 클라이언트 연결 실패: SASL 인증 정보 및 네트워크 정책 확인
- 성능 문제: 리소스 설정 및 JVM 힙 크기 조정
2) 로그 확인
# Kafka 로그 확인
kubectl logs -n kafka kafka-controller-0
# 모든 Kafka 노드 상태 확인
kubectl get pods -n kafka -l app.kubernetes.io/name=kafka
3) 토픽 관리
# 토픽 생성
kubectl exec -it kafka-controller-0 -n kafka -- kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 3
# 토픽 목록 확인
kubectl exec -it kafka-controller-0 -n kafka -- kafka-topics.sh --list --bootstrap-server localhost:9092