일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- mlops
- seldon core
- Litmus
- Pulumi
- tekton
- serving
- CI/CD
- MLflow
- Argo
- opensearch
- eBPF
- Kubernetes 인증
- blue/green
- kubernetes operator
- Model Serving
- keda
- 오퍼레이터
- 카오스 엔지니어링
- Continuous Deployment
- operator
- CANARY
- gitops
- argocd
- opentelemetry
- nginx ingress
- Kopf
- xdp
- knative
- Kubernetes
- Kubeflow
- Today
- Total
Kubernetes 이야기
Strimzi로 Kubernetes에 Apache Kafka 설치 본문
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 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 Operator 와 User 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
참고
'Kubernetes > 일반' 카테고리의 다른 글
kr8s - Kubernetes용 Python 클라이언트 라이브러리 (0) | 2023.12.31 |
---|---|
kubernetes apiserver 를 통해 Cluster 정보 조회 (1) | 2023.12.25 |
Kubernetes Gateway API (0) | 2023.12.10 |
Dex와 OIDC 인증 (0) | 2023.02.13 |
OAuth2 Proxy와 Keycloak 연동 (0) | 2023.02.11 |