How to install Kafka on k8s?

SquidEngineer·2024년 5월 20일
0

Kafka

목록 보기
2/4

Kafka를 쿠버네티스에 올려야하는 상황이 주어졌다. 여러 가지를 리서치해봤는데 최종적으로 찾은 방법들은 다음과 같다.
1. kafka image를 직접 사용하는 법
2. K8s operator를 사용하는 법(strimzi)

1번의 방법은 직접 제어하고 커스터마이징할 수 있지만 클러스터의 관리나 운영을 수동으로 처리해야한다.
2번은 초기에 operator를 설치하고 구성하는 방법이 다소 복잡하고 커스터마이징 또한 1번에 비해 상대적으로 제한이 있는데(Operator의 기능에 따라가기 때문에) 클러스터의 설치, 업그레이드 등의 작업이 자동화되고 관리하기 편하다고 하여 2번으로 결정했다.

이제 요구 조건들을 살펴보겠다.
1. strimzi 0.41.0(몇일 전에 0.40.0을 설치했는데 지금 몇가지 이슈가 있어서 새로 구축할 겸 최신 버전으로 다시 구축해보려고 한다.)
2. Kafka 3.7(KRaft mode. None ZK)

전제 조건
1. k8s과 helm이 이미 설치되어 있다.
2. ZK와 KRaft mode에 대해 이미 알고 있다.


Zookeeper

  • 클러스터 조정 서비스를 제공해 브로커와 컨슈머의 상태를 저장하고 추적함.
  • KRaft mode에서는 컨트롤러로 작동하는 Kafka node에 의해 Kafka 클러스터에서 조정이 관리되어 zk가 필요하지 않다.

Exporter

1. Strimzi Kafka Operator 설치

helm repo add strimzi https://strimzi.io/charts/
helm repo update

# namespace를 kafka로
k create ns kafka

helm install strimzi-kafka-operator strimzi/strimzi-kafka-operator --namespace kafka --version 0.41.0

여기서 KRaft mode를 적용하는 것이 아닌 3번에서 kafka 클러스터를 배포할때 KRaft mode를 적용한다.

2. CRD 적용

kubectl apply -f https://strimzi.io/install/latest?namespace=kafka -n kafka

2. kafka object 생성

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: dual-role
  namespace: kafka
  labels:
    strimzi.io/cluster: test-kafka
spec:
  replicas: 3
  roles:
    - controller
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
        class: nfs-client
        kraftMetadata: shared
---
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: test-kafka
  namespace: kafka
  annotations:
    strimzi.io/node-pools: enabled
    strimzi.io/kraft: enabled
spec:
  kafka:
    version: 3.7.0
    metadataVersion: 3.7-IV4
    replicas: 3
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
      - name: external
        port: 9094
        type: nodeport
        tls: false
    config:
      process.roles: broker,controller
      node.id: 1
      controller.quorum.voters: 1@test-kafka-kafka-0.test-kafka-kafka-brokers.kafka.svc:9093,2@test-kafka-kafka-1.test-kafka-kafka-brokers.kafka.svc:9093,3@test-kafka-kafka-2.test-kafka-kafka-brokers.kafka.svc:9093
      inter.broker.listener.name: EXTERNAL
      offsets.topic.replication.factor: 3
      transaction.state.log.replication.factor: 3
      transaction.state.log.min.isr: 2
      default.replication.factor: 3
      min.insync.replicas: 2
  entityOperator:
    topicOperator: {}
    userOperator: {}
  kafkaExporter:
    groupRegex: ".*"
    topicRegex: ".*"

k apply -f kafka-cluster.yaml으로 적용하면 된다.

profile
유연한 사고의 데이터 엔지니어입니다

0개의 댓글