https://velog.io/@gsun/kafka작성중-
이전 포스팅에선 local에서 kafka를 탐색해봤습니다. 하지만 kafka의 컨셉을 계속 보다보니 k8s 랑 어울리는 스택이더라고요. local에서 connect 1개를 테스트 해보려고 하니 …
최소 zookeeper + kafka + connect 가 필요합니다. 이걸 베어메탈에서 운영한다면 코드로 관리가 안되고 그때 그때 손으로 관리한다면... → 귀찮습니다. 더해서 에러가 갑자기 나타났을 때 당황스러운 경우가 많을 것 같고 … 여하튼 정말 많이 불편할 것 같습니다.
위와 같은 이유로 kafka 를 k8s에서 관리해보는게 어떨지 생각했습니다. 그러던 중에 Strimzi 스택을 알게되었습니다. 클러스터에 간단하게 kafka를 배포하고 운영하게 도와주는 스택입니다.
strimzi 의 다양한 컨셉이 궁금하다면 아래를 참고해주세요.
Strimzi Overview guide (0.35.0)
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kafka-operator kafka 1 2023-04-02 23:28:31.934448444 +0000 UTC deployed strimzi-kafka-operator-0.34.0 0.34.0
helm 배포도 가능합니다. (저는 helm으로 배포했습니다.)
kafka cluster 를 구현하는건 아래 내용들을 확인하여 작업해주시면 됩니다.
2번째 북마크를 따라가시면 배포하는 과정을 디테일하게 설명해주고 있습니다.
strimzi.io-Deploying and Upgrading (0.35.0)
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.4.0
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
config:
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
inter.broker.protocol.version: "3.4"
storage:
type: ephemeral
# storage:
# type: jbod
# volumes:
# - id: 0
# type: persistent-claim
# size: 100Gi
# deleteClaim: false
zookeeper:
replicas: 3
storage:
type: ephemeral
entityOperator:
topicOperator: {}
userOperator: {}
kafka 의 기본적인 컨셉을 이해하고 있다면 storage 가 왜 필요하신지 알 것입니다.
클러스터에서 운영할 땐 되도록이면 하나의 storage 에서 관리하는 것을 권고드립니다.
생각을 해보면 kafka의 특징은 클러스터로 운영된다는 겁니다. 이런 상황에서 만약 local-path 로 storage가 구성되어 있다면 다양한 문제가 생길 수 있을 것 같습니다. → 사실 저는 이런 상황이 아직까지 없었지만 그래도 .. 불안해서 말이죠 …;;
개인 클러스터 리소스와 적절하게 구성해주세요. 저는 1개로 하고 있습니다. (안쓰는 노트북으로 클러스터를 구성해서 저는 … 제한사항이 많습니다;;)
모든 필드에 대해서 설명을 하긴 힘드네 이 점 역시 문서를 참고해주세요. or 간단한 속성은 gpt 한테 물어봐도 괜찮은 답변을 해줍니다. v3.5 로서도 충분한 대답을 얻을 수 있습니다.
│ NAMESPACE↑ NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS READY WARNINGS │
│ kafka my-cluster 1 1 True │
저는 처음에 CRD를 몰랐습니다.
kubectl get kafka, kubectl get kafkaconnect 명령어를 사용하여 어떻게 조회가 되는건지 몰랐습니다. 모르는 분들이 있다면 아래 내용 참고하세요.
Strimzi Overview guide (0.35.0)
작업예정...
updated! 👍🏻
-> strimzi,debezium connector 구현
kafka connect 를 사용할 때 자기가 필요한 plug in 을 추가하여 connect 를 구현합니다. source connector 의 경우는 debezium 플러그인을 이용하여 구현할 수 있습니다. 또 다양한 벤더를 지원하고 문서가 자세히 되어 있습니다.
Deploying and Upgrading (0.35.0)
Connectors :: Debezium Documentation
CDC를 이용하여 source connector를 구현할 땐 Debezium 을 통해 모두 커버할 수 있다고 예상합니다.
💡 **CDC(Capture, Decode, Change Data Capture는 데이터베이스의 변경 사항을 감지하고, 해당 변경 사항을 캡처하여 추적하는 기술입니다)**그러나 sink connector 경우 debezium 에서 Incubating step 이라고 말해주고 있습니다. (23.06.04 기준)
물론 지금도 사용할 수 있지만 추후에 변경사항이 많아 질 수 있고 그래서 안전하지 않다고 생각했습니다. 저는 카푸카로 프로젝트를 진행하는 것이 아닌 혼자서 하는것이기 때문에 상관없지만 이를 프로젝트에 고려하고 있는 사람이라면 이 점은 많은 주의가 필요해보입니다.
다른방법들 ??!! 🧐
confluent - extending-images
confluent 의 경우는 이미지를 확장(플러그인)하여 입맛대로 만들어서 사용할 수 있습니다.
confluent connect 는 정말 많은 플러그인들이 존재합니다. debezium 역시 존재합니다. (더 보고 싶으시다면 confluent hub 를 확인해보세요.)
Docker Developer Guide for Confluent Platform | Confluent Documentation
하지만 위 방법으로 만든 이미지는 사용할 수 없었습니다. 제가 왜 그랬는지 모르겠지만 당연히 strimzi 의 KafkaConnect에서 위에서 만든 이미지를 사용할 수 있다고 생각했습니다. 그러나 아래와 비슷한 에러를 확인했습니다.
# strimzi kafkaconnect 를 만들었을 때 아래 명령을 찾지 못한다고 말합니다.
# not found 와 유사한 에러가 나왔습니다.
/opt/kafka/kafka_connect_run.sh # 이건 KafkaConnect args 필드에 존재했던 값이였습니다.
그리고 포스팅을 하나 읽고 알게되었습니다.
Changing Image
The operator is able to use your desired image instead of its default one. Thus you can add your selected artifacts and plugins by building an image manually or via CI/CD. One of the other reasons why you may want to use this method is that Strimzi uses Apache Kafka image, not the Confluent Platform. So the deployments don't have Confluent applicable packages like Confluent Avro Converter, etc. So you need to add them to your image and configure the operator to use your docker image.
For example, If you want to add your customized Debezium MySQL Connector plugin from Gitlab Generic Packages and Confluent Avro Converter to the base image, first use this Dockerfile:
Step-by-Step Guide: Deploying Kafka Connect via Strimzi Operator on Kubernetes
사용되는 베이스가 다르다는 거였습니다. (개인적인 추측
)
바로 위에 있는 포스팅에서 알려준 방법을 통해 이미지를 빌드한 후 개인 registry에서 관리하는 것입니다. 그리고 여기서 사용되는 플러그인들은 개인적으로 관리하여 사용하는 것이죠. 번거롭지만 꼭 필요한게 있다면 이렇게 사용하는 방법이 최선이지 않을까 생각합니다.
사실 저도 아직 어떤 방법을 사용하지 결정을 못했습니다.
아마도 debezium읜 인큐베이팅 단계의 플러그인을 사용하지 않을까 생각합니다. 이렇게 하는 이유는 여러가지가 있습니다.
👊오늘은 여기까지 입니다. 앞으로 kafka를 어떻게 활용할 수 있을지 모르겠지만 앞으로도 계속 같이 공유하고 싶은 내용들은 포스팅하도록 하겠습니다.
Confluent: Apache Kafka Reinvented for Multi-Cloud Data Streaming
Strimzi Kafka Operator의 kafka connect로 Mysql to Postgres migration
Step-by-Step Guide: Deploying Kafka Connect via Strimzi Operator on Kubernetes