strimzi logo

STRIMZI 개요

Strimzi 는 kubernetes 에서 Apache Kafka Cluster 를 쉽게 운영하기 위한 오픈소스이다. On-Premise 에서 Apache Kafka Cluster를 설치하고, 구성하고, 업그레이드 하는 것은 쉽지 않으며 더욱이 kubernetes 위에 StatefulSet 과 같은 표준 리소스를 통해 배포하게 되면 오류가 발생하기 쉽고 시간도 굉장히 많이 소요된다. Strimzi는 Kubernetes 클러스터 내에서 Apache Kafka Cluster 운영을 단순화 할 수 있게 지원해준다.

STRIMZI 의 이점

  1. kafka, kafkaTopic, kafkaUser 같은 Custom Resource 를 통해 카프카를 kubernetes-native 하게 관리한다. strimzi operator 들이 자동으로 kubernetes 리소스를 관리해주게 된다. (*kubernetes operator pattern)
  2. 선언적 클러스터 관리를 통해 리소스를 yaml 에서 선언적으로 직접 관리할 수 있다.
  3. strimzi operator 를 통해 kafka의 롤링 업그레이드, 확장, 복구 를 자동화하고 node pool 통한 cluster 확장이나 cruise control 통한 자동 파티션 재할당 등을 통해 워크로드 균형을 유지하고 strimzi drain cleaner 통해 노드를 안전하게 제거한다.
  4. kafka connect, mirrormaker2, kafka bridge 등 데이터 스트리밍 파이프라인을 통합 지원한다.
  5. 세분화된 엑세스 제어를 가능하게 한다.

STRIMZI Operator

strimzi operator 는 kubernetes API 를 확장하여 어플리케이션을 패키징, 배포, 관리한다.

  1. cluster operator : kafka cluster 및 구성요소를 관리한다.
  2. entity operator : kafka cluster 내의 topic, user 를 관리한다.
    • user operator :  리소스를 통해 카프카 클러스터의 사용자를 관리하는 방법을 제공한다.
    • topic operator : 리소스를 통해 카프카 클러스터의 토픽을 관리하는 방법을 제공한다.
strimzi logo

Node Pools

Strimzi는 node pools 를 사용하여 Kafka 노드를 관리한다. 노드 풀은 클러스터 내 Kafka 노드의 개별 그룹이고, KafkaNodePool 리소스를 사용하여 node pools 를 정의한다. kafka 버전이나 리스터 구성 등은 kafka 사용자 지정 리소스에 정의되고 node pools 에 정의되지 않은 모든 구성은 리소스의 클러스터 구성에 상속된다.

STRIMZI 맛보기

STRIMZI 는 기존에 설치해둔 kubernetes cluster 에 아래와 같이 실행해 주었다. Quick Start 에서 안내하는 내용과 거의 동일하나, 기본 파일에서 가지고 있는 storage size 가 100G여서 나는 storage type 을 ephemeral 로 변경해 주었다.

  • strimzi 통해 apache kafka 설치하기
# 1. [Strimzi](https://strimzi.io/) 배포
  # 네임스페이스 생성 
kubectl create namespace kafka
 
  # strimzi 샘플 설치파일 적용
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
 
  # 배포 확인
kubectl get pod -n kafka --watch
kubectl logs deployment/strimzi-cluster-operator -n kafka -f
 
 
# 2. Apache Kafka Cluster 생성
  # 단일 노드 Apache Kafka 클러스터
kubectl apply -f ./new/kafka-single-node.yaml -n kafka 
 
  # Pod, 서비스 시작 대기
kubectl wait kafka/my-cluster --for=condition=Ready --timeout=300s -n kafka 
 
 
# 3. 메시지 보내기 및 받기
  # 간단한 프로듀서를 실행하여 Kafka topic으로 메시지 produce
kubectl -n kafka run kafka-producer -ti --image=quay.io/strimzi/kafka:0.48.0-kafka-4.1.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic
 
  # 다른 터미널에서 consume
kubectl -n kafka run kafka-consumer -ti --image=quay.io/strimzi/kafka:0.48.0-kafka-4.1.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic --from-beginning
 
# 4. 삭제
  # Apache Kafka 클러스터 삭제
kubectl -n kafka delete $(kubectl get strimzi -o name -n kafka)
  # PVC 삭제
kubectl delete pvc -l strimzi.io/name=my-cluster-kafka -n kafka
  # Strimzi 클러스터 연산자 삭제
kubectl -n kafka delete -f 'https://strimzi.io/install/latest?namespace=kafka'
  # kafka 네임스페이스 삭제
kubectl delete namespace kafka
  • kafka-single-node.yaml
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: dual-role
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 1
  roles:
    - controller
    - broker
  storage:
    type: ephemeral
    
---
 
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 4.1.0
    metadataVersion: 4.1-IV1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
      default.replication.factor: 1
      min.insync.replicas: 1
  entityOperator:
    topicOperator: {}
    userOperator: {}

Reference

사용후기

kubernetes 위에 apache kafka cluster 를 굉장히 쉽게 배포하고 관리할 수 있는(?) STRIMZI 를 한번 사용해 보았다. 실제로 프로젝트에 적용해본 것이 아니라 얼마나 유용한지 아직 감은 안오지만 설치가 굉장히 쉽다는 것과 운용 개념이 kubernetes-native 하다는 것은 느낄 수 있었다. 개인 프로젝트에서 한 번 운영해보고 구체적인 기록으로 남겨둬야겠다. 👋