# Apache Kafka 배포 ## 1. 배포 방법 ### 1) 배포시 주의 사항 - Apache Kafka 4.0.0은 KRaft 모드로만 동작하며 ZooKeeper가 필요하지 않습니다. - Controller-eligible 노드와 Broker-only 노드를 분리하여 배포할 수 있습니다. - SASL 인증이 기본적으로 활성화되어 있으므로 클라이언트 연결 시 인증 정보가 필요합니다. - 프로덕션 환경에서는 리소스 설정과 영속성 스토리지 설정을 반드시 확인해야 합니다. ### 2) 배포 방법 ```sh 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 파일의 예시입니다: ```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) 클라이언트 설정 예시 ```properties 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=""; ``` ### 2) 비밀번호 확인 ```sh kubectl get secret kafka-user-passwords -o jsonpath='{.data.client-passwords}' | base64 -d ``` ## 6. 트러블슈팅 ### 1) 일반적인 문제 - **Pod 시작 실패**: 리소스 부족 또는 영속성 볼륨 문제 확인 - **클라이언트 연결 실패**: SASL 인증 정보 및 네트워크 정책 확인 - **성능 문제**: 리소스 설정 및 JVM 힙 크기 조정 ### 2) 로그 확인 ```sh # Kafka 로그 확인 kubectl logs -n kafka kafka-controller-0 # 모든 Kafka 노드 상태 확인 kubectl get pods -n kafka -l app.kubernetes.io/name=kafka ``` ### 3) 토픽 관리 ```sh # 토픽 생성 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