# Apache Kafka 배포 (Strimzi Operator 기반) ## 1. 배포 방법 ### 1) 배포시 주의 사항 - Apache Kafka 4.0.0은 KRaft 모드로만 동작하며 ZooKeeper가 필요하지 않습니다. - Controller와 Broker 노드를 분리하여 배포합니다. - OAuth 2.0 인증이 활성화되어 있으므로 Keycloak 설정이 필요합니다. - Kafka Connect가 기본적으로 활성화되어 있습니다. - 프로덕션 환경에서는 리소스 설정과 영속성 스토리지 설정을 반드시 확인해야 합니다. ### 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 kafka: version: "4.0.0" metadataVersion: "4.0" timezone: "Asia/Seoul" controller: replicas: 3 storage: size: 50Gi class: longhorn resources: {} broker: replicas: 3 storage: size: 50Gi class: longhorn resources: {} config: offsetsTopicReplicationFactor: 3 transactionStateLogReplicationFactor: 3 transactionStateLogMinIsr: 2 defaultReplicationFactor: 3 minInsyncReplicas: 2 autoCreateTopicsEnable: false numPartitions: 3 deleteTopicEnable: true oauth: enabled: true keycloakUrl: "https://keycloak.example.com" keycloakRealm: "your-realm" keycloakClientId: "kafka-client" kafkaConnect: enabled: true image: paasup/kafka-connect:0.2 replicas: 1 entityOperator: topicOperator: {} userOperator: {} connectTopics: partitions: 1 replicas: 3 config: cleanupPolicy: compact retentionMs: 604800000 segmentBytes: 1073741824 logging: kafka: rootLoggerLevel: INFO connect: rootLoggerLevel: INFO ``` ## 3. custom-values.yaml 설정 설명 ### 1) Kafka 기본 설정 | Name | 설명 | 기본값 | | ----------------------- | --------------------- | ------------ | | `kafka.version` | Kafka 버전 | `4.0.0` | | `kafka.metadataVersion` | Kafka 메타데이터 버전 | `4.0` | | `kafka.timezone` | Kafka 클러스터 타임존 | `Asia/Seoul` | ### 2) Controller 노드 설정 | Name | 설명 | 기본값 | | -------------------------- | ----------------------------------- | ---------- | | `controller.replicas` | Controller 노드 수 | `3` | | `controller.storage.size` | Controller 영속성 볼륨 크기 | `50Gi` | | `controller.storage.class` | Controller 영속성 볼륨 StorageClass | `longhorn` | | `controller.resources` | Controller 리소스 제한 설정 | `{}` | ### 3) Broker 노드 설정 | Name | 설명 | 기본값 | | ---------------------- | ------------------------------- | ---------- | | `broker.replicas` | Broker 노드 수 | `3` | | `broker.storage.size` | Broker 영속성 볼륨 크기 | `50Gi` | | `broker.storage.class` | Broker 영속성 볼륨 StorageClass | `longhorn` | | `broker.resources` | Broker 리소스 제한 설정 | `{}` | ### 4) Kafka 클러스터 설정 | Name | 설명 | 기본값 | | --------------------------------------------- | ------------------------------------------ | ------- | | `config.offsetsTopicReplicationFactor` | \_\_consumer_offsets 토픽의 복제 팩터 | `3` | | `config.transactionStateLogReplicationFactor` | 트랜잭션 상태 로그의 복제 팩터 | `3` | | `config.transactionStateLogMinIsr` | 트랜잭션 상태 로그의 최소 동기화 복제본 수 | `2` | | `config.defaultReplicationFactor` | 새 토픽의 기본 복제 팩터 | `3` | | `config.minInsyncReplicas` | 쓰기 작업에 필요한 최소 동기화 복제본 수 | `2` | | `config.autoCreateTopicsEnable` | 토픽 자동 생성 활성화 여부 | `false` | | `config.numPartitions` | 새 토픽의 기본 파티션 수 | `3` | | `config.deleteTopicEnable` | 토픽 삭제 활성화 여부 | `true` | ### 5) OAuth 2.0 인증 설정 | Name | 설명 | 기본값 | | ------------------------ | -------------------------- | ------------------------------ | | `oauth.keycloakUrl` | Keycloak 서버 URL | `https://keycloak.example.com` | | `oauth.keycloakRealm` | Keycloak Realm 이름 | `your-realm` | | `oauth.keycloakClientId` | Keycloak Client ID | `kafka-client` | ### 6) Kafka Connect 설정 | Name | 설명 | 기본값 | | ----------------------- | ------------------------- | -------------------------- | | `kafkaConnect.image` | Kafka Connect 이미지 | `paasup/kafka-connect:0.2` | | `kafkaConnect.replicas` | Kafka Connect 워커 수 | `1` | ### 7) Entity Operator 설정 | Name | 설명 | 기본값 | | ------------------------------ | ------------------- | ------ | | `entityOperator.topicOperator` | Topic Operator 설정 | `{}` | | `entityOperator.userOperator` | User Operator 설정 | `{}` | ### 8) Kafka Connect 내부 토픽 설정 | Name | 설명 | 기본값 | | ------------------------------------ | -------------------------------- | ------------ | | `connectTopics.partitions` | Connect 내부 토픽의 파티션 수 | `1` | | `connectTopics.replicas` | Connect 내부 토픽의 복제 팩터 | `3` | | `connectTopics.config.cleanupPolicy` | 로그 정리 정책 (compact/delete) | `compact` | | `connectTopics.config.retentionMs` | 로그 보관 기간 (밀리초, 7일) | `604800000` | | `connectTopics.config.segmentBytes` | 로그 세그먼트 크기 (바이트, 1GB) | `1073741824` | ### 9) 로깅 설정 | Name | 설명 | 기본값 | | --------------------------------- | ---------------------------- | ------ | | `logging.kafka.rootLoggerLevel` | Kafka 루트 로거 레벨 | `INFO` | | `logging.connect.rootLoggerLevel` | Kafka Connect 루트 로거 레벨 | `INFO` | ## 4. 배포 아키텍처 ### 1) Controller와 Broker 분리 배포 - `controller.replicas: 3` - Controller 전용 노드 3개 - `broker.replicas: 3` - Broker 전용 노드 3개 - Controller와 Broker 역할을 분리하여 성능 최적화 - 대규모 프로덕션 환경에 적합 ### 2) 고가용성 설정 - 복제 팩터 3으로 데이터 손실 방지 - 최소 동기화 복제본 2로 일관성 보장 - 각 노드에 50Gi 영속성 스토리지 할당 ## 5. 클라이언트 연결 ### 1) OAuth 2.0 인증을 사용한 클라이언트 설정 예시 ```properties bootstrap.servers=kafka-kafka-bootstrap:9092 security.protocol=SASL_PLAINTEXT sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.client.id="kafka-client" \ oauth.client.secret="" \ oauth.token.endpoint.uri="https://keycloak.example.com/realms/your-realm/protocol/openid-connect/token"; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler ``` ### 2) Keycloak 설정 확인 Keycloak에서 다음 설정을 확인하세요: - Realm: `your-realm` - Client ID: `kafka-client` - Client Secret 생성 및 확인 - Service Account 활성화 ## 6. Kafka Connect 사용 ### 1) Connector 상태 확인 ```sh # Kafka Connect 로그 확인 kubectl logs -n kafka -l strimzi.io/cluster=kafka-connect # Connector 목록 확인 kubectl get kafkaconnectors -n kafka ``` ## 7. 트러블슈팅 ### 1) 일반적인 문제 - **Pod 시작 실패**: Longhorn 스토리지 클래스 확인 및 리소스 부족 여부 확인 - **OAuth 인증 실패**: Keycloak URL, Realm, Client ID 설정 확인 - **Kafka Connect 연결 실패**: Connect 내부 토픽 생성 및 권한 확인 - **성능 문제**: 리소스 설정 및 파티션 수 조정 ### 2) 로그 확인 ```sh # Kafka Controller 로그 확인 kubectl logs -n kafka kafka-kafka-controller-0 # Kafka Broker 로그 확인 kubectl logs -n kafka kafka-kafka-broker-0 # Kafka Connect 로그 확인 kubectl logs -n kafka -l strimzi.io/cluster=kafka-connect ``` ### 3) 토픽 관리 ```sh # 토픽 목록 확인 kubectl get kafkatopics -n kafka # 토픽 상세 정보 확인 kubectl describe kafkatopic test-topic -n kafka ``` ### 4) 사용자 관리 ```sh # 사용자 목록 확인 kubectl get kafkausers -n kafka ```