Kubernetes 이야기

Strimzi로 Kubernetes에 Apache Kafka 설치 본문

Kubernetes/일반

Strimzi로 Kubernetes에 Apache Kafka 설치

kmaster 2023. 12. 10. 16:16
반응형

 

Strimzi는 다양한 배포 구성으로 Kubernetes에서 Apache Kafka 클러스터를 실행하는 프로세스를 단순화 할 수 있다.

 

개발을 위해서는 몇 분 안에 Minikube에 클러스터를 쉽게 설정할 수 있고, 프로덕션의 경우 가용성 영역 전체 노드에 브로커를 분산시키거나 Kubernetes taints 와 tolerations과 같은 기능을 사용하여 전용 노드에서 Kafka를 실행하여 필요에 맞게 클러스터를 맞춤화할 수 있다.

 

Kafka

 

우선 Kafka 에 대해 알아보자.

 

주요 용어

  • Producer : Kafka에 데이터를 보낸다. 이는 애플리케이션, 데이터베이스, 장치 등에서 발생할 수 있다.
  • Consumer : Kafka에서 데이터를 읽는다. 분석 도구, 데이터베이스 또는 기타 애플리케이션이 될 수 있다.
  • Broker : 데이터를 저장하고 클라이언트 요청을 처리하는 Kafka 서버
  • Topic : 생산자가 데이터를 전송하고 소비자가 데이터를 소비하는 카테고리 또는 피드
  • Partitions : Kafka 주제는 병렬성과 확장성을 위해 파티션으로 분할된다. 각 파티션은 별도의 시스템에 배치될 수 있다.
  • Offsets : 파티션의 각 메시지에 할당된 고유 ID입니다. 소비된 내용을 추적하는 데 도움이 됩니다.

 

주요특징

  • 매우 높은 처리량과 짧은 대기 시간으로 데이터를 공유하는 마이크로서비스 및 기타 애플리케이션
  • 메시지 순서 보장
  • 애플리케이션 상태를 재구성하기 위해 데이터 저장소에서 메시지 되감기/재생
  • 키-값 로그를 사용할 때 오래된 레코드를 제거하기 위한 메시지 압축
  • 클러스터 구성의 수평적 확장성
  • 내결함성을 제어하기 위한 데이터 복제
  • 즉각적인 액세스를 위해 대용량 데이터 보존

주요 사용 용도

  • 이벤트 중심 아키텍처
  • 애플리케이션 상태의 변경 사항을 이벤트 로그로 캡처하는 이벤트 소싱
  • 메시지 중개
  • 웹사이트 활동 추적
  • 측정항목을 통한 운영 모니터링
  • 로그 수집 및 집계
  • 분산 시스템에 대한 커밋 로그
  • 애플리케이션이 실시간으로 데이터에 응답할 수 있도록 스트리밍 처리

 

구성 요소 아키텍처

 

  • Apache ZooKeeper

       Apache ZooKeeper는 클러스터 조정 서비스를 제공하고 브로커와 소비자의 상태를 저장하고 추적하는 Kafka의 핵심

      기능.  ZooKeeper는 컨트롤러 선택에도 사용한다.

 

  • Kafka Connector

       Kafka Connector 는 커넥터 플러그인을 사용하여 Kafka 브로커와 다른 시스템 간의 데이터 스트리밍을 위한 통합 툴

       킷이다. Kafka Connector 는 커넥터를 사용하여 데이터를 가져오거나 내보내기 위해 Kafka를 데이터베이스와 같은 외

       부 데이터 소스 또는 대상과 통합하기 위한 프레임워크를 제공한다.

 

  • Kafka MirrorMaker

       Kafka MirrorMaker는 데이터 센터 내 또는 데이터 센터 간에 두 Kafka 클러스터 간에 데이터를 복제한다.

       MirrorMaker는 소스 Kafka 클러스터에서 메시지를 가져와 대상 Kafka 클러스터에 쓴다.

 

  • Kafka Bridge

       Kafka Bridge는 HTTP 기반 클라이언트를 Kafka 클러스터와 통합하기 위한 API를 제공한다.

 

  • Kafka  Exporter

       Kafka Exporter는 주로 오프셋, 소비자 그룹, 소비자 지연 및 주제와 관련된 데이터인 Prometheus 지표로 분석할 데이

       터를 추출한다. 

 

메시지 브로커와 토픽

 

Kafka 클러스터는 여러 브로커로 구성된다. 브로커에는 데이터를 수신하고 저장하는 Topic 포함되어 있다. Topic은 데이터가 기록되는 파티션으로 분할된다. 내결함성을 위해 파티션은 주제 전체에 복제된다.

 

Producers and consumers

 

생산자와 소비자는 브로커를 통해 메시지를 보내고 받는다. ( publish and subscribe )

 

Kafka Connector

 

Kafka Connector는 커넥터 인스턴스를 사용하여 다른 시스템과 통합하여 데이터를 스트리밍한다. Connector는 다음 유형 중 하나일 수 있다.

  • Kafka에 데이터를 푸시하는 소스 커넥터
  • Kafka에서 데이터를 추출하는 싱크 커넥터

Kafka로 데이터를 스트리밍하는 소스 커넥터

 

Kafka에서 데이터를 추출하는 싱크 커넥터

 

Kafka Bridge

 

Kafka Bridge는 HTTP 기반 클라이언트가 Kafka 클러스터와 상호 작용할 수 있도록 하는 RESTful 인터페이스를 제공한다.

 

Strimzi Operators

Strimzi Operator는 Kafka 배포와 관련된 작업을 지원한다.

 

  • Cluster Operator : Apache Kafka 클러스터, Kafka Connect, Kafka MirrorMaker, Kafka Bridge, Kafka 내보내기, Cruise Control 및 Entity Operator를 배포하고 관리
  • Entity Operator : Topic OperatorUser Operator 로 구성
  • Topic Operator : Kafka topic들을 관리
  • User Operator : Kafka 사용자를 관리합니다.

 

설치

Strimzi cluster operator를 설치 전 먼저 kafka namespace를 만든다.

kubectl create namespace kafka

 

Strimzi cluster operator 설치

 

이제 operator를 설치해 보자.

# kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
rolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator created
configmap/strimzi-cluster-operator created
clusterrole.rbac.authorization.k8s.io/strimzi-kafka-broker created
customresourcedefinition.apiextensions.k8s.io/kafkaconnects.kafka.strimzi.io created
clusterrole.rbac.authorization.k8s.io/strimzi-entity-operator created
customresourcedefinition.apiextensions.k8s.io/kafkatopics.kafka.strimzi.io created
clusterrole.rbac.authorization.k8s.io/strimzi-cluster-operator-leader-election created
customresourcedefinition.apiextensions.k8s.io/kafkamirrormaker2s.kafka.strimzi.io created
rolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator-entity-operator-delegation created
clusterrole.rbac.authorization.k8s.io/strimzi-cluster-operator-global created
customresourcedefinition.apiextensions.k8s.io/kafkabridges.kafka.strimzi.io created
serviceaccount/strimzi-cluster-operator created
clusterrolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator created
clusterrole.rbac.authorization.k8s.io/strimzi-kafka-client created
customresourcedefinition.apiextensions.k8s.io/kafkausers.kafka.strimzi.io created
clusterrolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator-kafka-broker-delegation created
customresourcedefinition.apiextensions.k8s.io/kafkaconnectors.kafka.strimzi.io created
clusterrole.rbac.authorization.k8s.io/strimzi-cluster-operator-watched created
customresourcedefinition.apiextensions.k8s.io/kafkas.kafka.strimzi.io created
rolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator-watched created
customresourcedefinition.apiextensions.k8s.io/kafkarebalances.kafka.strimzi.io created
rolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator-leader-election created
clusterrole.rbac.authorization.k8s.io/strimzi-cluster-operator-namespaced created
customresourcedefinition.apiextensions.k8s.io/kafkamirrormakers.kafka.strimzi.io created
customresourcedefinition.apiextensions.k8s.io/kafkanodepools.kafka.strimzi.io created
customresourcedefinition.apiextensions.k8s.io/strimzipodsets.core.strimzi.io created
clusterrolebinding.rbac.authorization.k8s.io/strimzi-cluster-operator-kafka-client-delegation created
deployment.apps/strimzi-cluster-operator created

 

정상적으로 설치되어 있는지 확인해 보자.

# kubectl get pod -n kafka --watch
NAME                                        READY   STATUS    RESTARTS   AGE
strimzi-cluster-operator-56fb857f7c-5sdvl   1/1     Running   0          93s

# kubectl logs deployment/strimzi-cluster-operator -n kafka -f
Auto-detected KUBERNETES_SERVICE_DNS_DOMAIN: cluster.local
+ exec /usr/bin/tini -w -e 143 -- java -Dlog4j2.configurationFile=file:/opt/strimzi/custom-config/log4j2.properties -Dvertx.cacheDirBase=/tmp/vertx-cache -Djava.security.egd=file:/dev/./urandom -XX:+ExitOnOutOfMemoryError -XX:MinRAMPercentage=15 -XX:MaxRAMPercentage=20 -classpath :lib/io.strimzi.cluster-operator-0.38.0.jar:lib/io.strimzi.api-0.38.0.jar:lib/io.fabric8.kubernetes-model-apiextensions-6.9.0.jar:lib/io.strimzi.config-model-0.38.0.jar:lib/io.strimzi.operator-common-0.38.0.jar:lib/io.strimzi.crd-annotations-0.38.0.jar:lib/org.quartz-scheduler.quartz-2.3.2.jar:lib/org.eclipse.jetty.jetty-server-9.4.53.v20231009.jar:lib/org.eclipse.jetty.jetty-http-9.4.53.v20231009.jar:lib/org.eclipse.jetty.jetty-io-9.4.53.v20231009.jar:lib/javax.servlet.javax.servlet-api-3.1.0.jar:lib/io.fabric8.openshift-client-6.9.0.jar:lib/com.github.mifmif.generex-1.0.2.jar:lib/dk.brics.automaton.automaton-1.11-8.jar:lib/io.fabric8.openshift-client-api-6.9.0.jar:lib/io.fabric8.openshift-model-clusterautoscaling-6.9.0.jar:lib/io.fabric8.openshift-model-operator-6.9.0.jar:lib/io.fabric8.openshift-model-operatorhub-6.9.0.jar:lib/io.fabric8.openshift-model-machine-6.9.0.jar:lib/io.fabric8.openshift-model-whereabouts-6.9.0.jar:lib/io.fabric8.openshift-model-monitoring-6.9.0.jar:lib/io.fabric8.openshift-model-storageversionmigrator-6.9.0.jar:lib/io.fabric8.openshift-model-tuned-6.9.0.jar:lib/io.fabric8.openshift-model-console-6.9.0.jar:lib/io.fabric8.openshift-model-config-6.9.0.jar:lib/io.fabric8.openshift-model-machineconfig-6.9.0.jar:lib/io.fabric8.openshift-model-miscellaneous-6.9.0.jar:lib/io.fabric8.openshift-model-hive-6.9.0.jar:lib/io.fabric8.openshift-model-installer-6.9.0.jar:lib/io.fabric8.kubernetes-client-6.9.0.jar:lib/io.fabric8.kubernetes-httpclient-jdk-6.9.0.jar:lib/io.fabric8.kubernetes-client-api-6.9.0.jar:lib/io.fabric8.kubernetes-model-gatewayapi-6.9.0.jar:lib/io.fabric8.kubernetes-model-resource-6.9.0.jar:lib/io.fabric8.kubernetes-model-admissionregistration-6.9.0.jar:lib/io.fabric8.kubernetes-model-autoscaling-6.9.0.jar:lib/io.fabric8.kubernetes-model-batch-6.9.0.jar:lib/io.fabric8.kubernetes-model-certificates-6.9.0.jar:lib/io.fabric8.kubernetes-model-discovery-6.9.0.jar:lib/io.fabric8.kubernetes-model-extensions-6.9.0.jar:lib/io.fabric8.kubernetes-model-flowcontrol-6.9.0.jar:lib/io.fabric8.kubernetes-model-metrics-6.9.0.jar:lib/io.fabric8.kubernetes-model-scheduling-6.9.0.jar:lib/io.fabric8.kubernetes-model-node-6.9.0.jar:lib/org.slf4j.slf4j-api-1.7.36.jar:lib/org.snakeyaml.snakeyaml-engine-2.7.jar:lib/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.15.2.jar:lib/io.fabric8.kubernetes-model-core-6.9.0.jar:lib/io.fabric8.kubernetes-model-common-6.9.0.jar:lib/io.fabric8.kubernetes-model-events-6.9.0.jar:lib/io.fabric8.kubernetes-model-policy-6.9.0.jar:lib/io.fabric8.kubernetes-model-rbac-6.9.0.jar:lib/io.fabric8.kubernetes-model-apps-6.9.0.jar:lib/io.fabric8.kubernetes-model-storageclass-6.9.0.jar:lib/io.fabric8.kubernetes-model-networking-6.9.0.jar:lib/io.fabric8.kubernetes-model-coordination-6.9.0.jar:lib/io.fabric8.openshift-model-6.9.0.jar:lib/io.fabric8.zjsonpatch-0.3.0.jar:lib/com.fasterxml.jackson.core.jackson-core-2.15.2.jar:lib/com.fasterxml.jackson.core.jackson-databind-2.15.2.jar:lib/com.fasterxml.jackson.core.jackson-annotations-2.15.2.jar:lib/com.fasterxml.jackson.dataformat.jackson-dataformat-yaml-2.15.2.jar:lib/org.yaml.snakeyaml-2.0.jar:lib/io.vertx.vertx-core-4.4.6.jar:lib/io.netty.netty-common-4.1.100.Final.jar:lib/io.netty.netty-buffer-4.1.100.Final.jar:lib/io.netty.netty-handler-4.1.100.Final.jar:lib/io.netty.netty-handler-proxy-4.1.100.Final.jar:lib/io.netty.netty-codec-http-4.1.100.Final.jar:lib/io.netty.netty-codec-http2-4.1.100.Final.jar:lib/io.netty.netty-resolver-4.1.100.Final.jar:lib/io.netty.netty-resolver-dns-4.1.100.Final.jar:lib/io.netty.netty-codec-dns-4.1.100.Final.jar:lib/io.strimzi.certificate-manager-0.38.0.jar:lib/org.apache.logging.log4j.log4j-core-2.17.2.jar:lib/org.apache.logging.log4j.log4j-api-2.17.2.jar:lib/org.apache.logging.log4j.log4j-slf4j-impl-2.17.2.jar:lib/io.strimzi.kafka-oauth-server-0.14.0.jar:lib/io.strimzi.kafka-oauth-server-plain-0.14.0.jar:lib/io.strimzi.kafka-oauth-client-0.14.0.jar:lib/io.strimzi.kafka-oauth-common-0.14.0.jar:lib/com.nimbusds.nimbus-jose-jwt-9.31.jar:lib/com.github.stephenc.jcip.jcip-annotations-1.0-1.jar:lib/com.jayway.jsonpath.json-path-2.8.0.jar:lib/net.minidev.json-smart-2.4.10.jar:lib/net.minidev.accessors-smart-2.4.9.jar:lib/org.eclipse.jetty.jetty-util-9.4.53.v20231009.jar:lib/org.apache.kafka.kafka-clients-3.6.0.jar:lib/com.github.luben.zstd-jni-1.5.5-1.jar:lib/org.lz4.lz4-java-1.8.0.jar:lib/org.xerial.snappy.snappy-java-1.1.10.4.jar:lib/org.apache.zookeeper.zookeeper-3.8.3.jar:lib/org.apache.yetus.audience-annotations-0.12.0.jar:lib/commons-io.commons-io-2.11.0.jar:lib/org.apache.zookeeper.zookeeper-jute-3.8.3.jar:lib/io.netty.netty-transport-4.1.100.Final.jar:lib/io.netty.netty-transport-native-epoll-4.1.100.Final-linux-x86_64.jar:lib/io.netty.netty-transport-native-unix-common-4.1.100.Final.jar:lib/io.netty.netty-transport-classes-epoll-4.1.100.Final.jar:lib/io.micrometer.micrometer-core-1.9.5.jar:lib/org.hdrhistogram.HdrHistogram-2.1.12.jar:lib/org.latencyutils.LatencyUtils-2.0.3.jar:lib/io.micrometer.micrometer-registry-prometheus-1.9.5.jar:lib/io.prometheus.simpleclient_common-0.15.0.jar:lib/io.prometheus.simpleclient-0.15.0.jar:lib/io.prometheus.simpleclient_tracer_otel-0.15.0.jar:lib/io.prometheus.simpleclient_tracer_common-0.15.0.jar:lib/io.prometheus.simpleclient_tracer_otel_agent-0.15.0.jar:lib/io.vertx.vertx-micrometer-metrics-4.4.6.jar:lib/io.netty.netty-codec-4.1.100.Final.jar:lib/io.netty.netty-codec-socks-4.1.100.Final.jar io.strimzi.operator.cluster.Main
2023-12-10 06:15:50 INFO  Main:72 - ClusterOperator 0.38.0 is starting
2023-12-10 06:15:50 INFO  Util:224 - Using config:
        PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        container: oci
        STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE: quay.io/strimzi/operator:0.38.0
        JAVA_OPTS:  -Dlog4j2.configurationFile=file:/opt/strimzi/custom-config/log4j2.properties -Dvertx.cacheDirBase=/tmp/vertx-cache -Djava.security.egd=file:/dev/./urandom  -XX:+ExitOnOutOfMemoryError -XX:MinRAMPercentage=15 -XX:MaxRAMPercentage=20
        STRIMZI_HOME: /opt/strimzi
        PWD: /opt/strimzi
...

 

 

Apache Kafka Cluster 만들기

 

kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka

 

k get all -n kafka
NAME                                              READY   STATUS    RESTARTS   AGE
pod/my-cluster-entity-operator-7f98fd7d9b-vbrn5   3/3     Running   0          91s
pod/my-cluster-kafka-0                            1/1     Running   0          114s
pod/my-cluster-zookeeper-0                        1/1     Running   0          2m18s
pod/strimzi-cluster-operator-56fb857f7c-bl8bw     1/1     Running   0          10m

NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                        AGE
service/my-cluster-kafka-bootstrap    ClusterIP   10.108.69.6     <none>        9091/TCP,9092/TCP,9093/TCP                     115s
service/my-cluster-kafka-brokers      ClusterIP   None            <none>        9090/TCP,9091/TCP,8443/TCP,9092/TCP,9093/TCP   115s
service/my-cluster-zookeeper-client   ClusterIP   10.102.90.166   <none>        2181/TCP                                       2m18s
service/my-cluster-zookeeper-nodes    ClusterIP   None            <none>        2181/TCP,2888/TCP,3888/TCP                     2m18s

NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-cluster-entity-operator   1/1     1            1           91s
deployment.apps/strimzi-cluster-operator     1/1     1            1           45m

NAME                                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/my-cluster-entity-operator-7f98fd7d9b   1         1         1       91s
replicaset.apps/strimzi-cluster-operator-56fb857f7c     1         1         1       45m

 

Apacke Kafka Cluster 삭제

 

kubectl -n kafka delete $(kubectl get strimzi -o name -n kafka)

 

Strimzi cluster operator 삭제

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

 

Send / Receive 테스트

# kubectl -n kafka run kafka-producer -ti --image=quay.io/strimzi/kafka:0.38.0-kafka-3.6.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic
If you don't see a command prompt, try pressing enter.
>Hello

 

# kubectl -n kafka run kafka-consumer -ti --image=quay.io/strimzi/kafka:0.38.0-kafka-3.6.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic --from-beginning
If you don't see a command prompt, try pressing enter.


Hello

 

 

참고

https://strimzi.io/

반응형
Comments