Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Running Apache Kafka on Kubernetes

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Running Apache Kafka on Kubernetes

2020년 4월 25일, Global Azure Virtual 2020 에서 발표. (https://festa.io/events/976)

Presented at Global Azure Virtual 2020, April 25th, 2020.

* The slides have been slightly updated to adapt to the changes.
* For configuring Kafka cluster without helm chart with minimal effort, see: https://gist.github.com/dongjinleekr/fcadc20063553935cfb6536185421ca2

Slides: Korean. Presentation: Korean.

Avatar for Lee Dongjin

Lee Dongjin

April 25, 2020
Tweet

More Decks by Lee Dongjin

Other Decks in Technology

Transcript

  1. 오늘 할 이야기는... • 오늘의 주제 ◦ Apache Kafka를 어떻게

    Kubernetes + Docker 환경에서 띄울 것인가? • 좀 더 구체적으로는... ◦ 장점, 단점 ◦ 사용 방법
  2. • 단점 ◦ Resource 문제 ◦ Monitoring 문제 ◦ Troubleshooting

    문제 ▪ “뭔가 잘못됐는데, Kubernetes도 Kafka도 잘 아는 사람이 없어!” • 장점 ◦ 쉽고 간편함 ▪ 방법만 안다면. ◦ 표준화된 배포 환경 ◦ 빠른 전개 + Scale-up Kafka on Kubernetes: 장단점
  3. Kafka on Kubernetes: 왜 어렵지? (1) • Zookeeper ◦ zookeeper

    (Official) ◦ wurstmeister/zookeeper • Kafka ◦ confluentinc/cp-kafka ◦ wurstmeister/kafka ◦ solsson/kafka ◦ bitnami/kafka ◦ spotify/kafka
  4. Kafka on Kubernetes: 왜 어렵지? (2) • ‘상태가 있는' Application

    ◦ StatefulSet • Not-interchangeable ◦ Broker A와 Broker B는 완전히 다르다. ▪ 쥐고 있는 Topic ▪ 쥐고 있는 Partition ▪ 쥐고 있는 Partition의 내용: Leader vs. Follower ◦ Client는 원하는 (Topic, Partition)의 Leader Partition을 쥔 Broker와만 직접 커뮤니케이션한다. ▪ cf. MySQL
  5. Kafka on Kubernetes: 왜 어렵지? (3) • Kafka 까지 설치했다고

    끝이 아님 ◦ 이제 절반 ◦ 같은 kubernetes namespace 안에서 돌려야 하는 다른 요소들이 많음 • 설치 대상 ◦ 각종 테스트/운영용 Kafka client ▪ 공식 client (kafka-topics.sh, ...) ▪ kafkacat: 테스트 및 관리용 유틸리티 ◦ 기타 Ecosystem 툴 ▪ Schema Registry ▪ Kafka Connect ▪ ...
  6. Kafka on Kubernetes: 그러면 어떻게? • Stateful Application (Zookeeper, Kafka)

    ◦ Helm Chart (incubator) ▪ incubator/zookeeper ▪ incubator/kafka ◦ 약간의 요령만 알면 쓸 수 있다. • Stateless Application (clients, ecosystem tools) ◦ 단순 Deploy
  7. Apache Zookeeper w/ Helm (1) • Zookeeper (Based on Official

    Docker Image) ◦ incubator/zookeeper ◦ 이름하고 개수(default: 3) 정해 주면 OK! # Deploy Helm Chart w/ name = djlee-zookeeper $ helm install djlee-zookeeper incubator/zookeeper # ls $ kubectl -n default exec -it djlee-zookeeper-0 -- bin/zkCli.sh -server djlee-zookeeper-0.djlee-zookeeper-headless:2181,djlee-zookeeper-1.djlee- zookeeper-headless:2181 ls /
  8. Apache Zookeeper w/ Helm (2) # create: /foo => bar

    (from node 0) $ kubectl -n default exec -it djlee-zookeeper-0 -- bin/zkCli.sh -server djlee-zookeeper-0.djlee-zookeeper-headless:2181,djlee-zookeeper-1.djlee- zookeeper-headless:2181 create /foo bar # Success: exit w/ 0 # get: /foo (from node 2) $ kubectl -n default exec -it djlee-zookeeper-2 -- bin/zkCli.sh -server djlee-zookeeper-0.djlee-zookeeper-headless:2181,djlee-zookeeper-1.djlee- zookeeper-headless:2181 get /foo # Success: returns ‘bar’
  9. Apache Kafka w/ Helm (1) • Kafka (Based on solsson/kafka)

    ◦ incubator/kafka ◦ 이름, Zookeeper 설정, 사용할 Docker Image, Replica 개수 등 • Zookeeper 설정 ◦ zookeeper.enabled, zookeeper.url ◦ default: "Broker 별로 Zookeeper Instance를 하나씩 띄운다."
  10. Apache Kafka w/ Helm (2) # broker.yaml replicas: 4 #

    Kafka Cluster의 크기 (3+1) image: "solsson/kafka" imageTag: "2.3.0" # 현재 default: 2.0.1 zookeeper: enabled: false # 자동 Zookeeper 생성 기능을 사용하지 않음 url: "djlee-zookeeper-0.djlee-zookeeper-headless:2181,djlee-zookeeper-1.djlee -zookeeper-headless:2181" # 아까 설치한 Zookeeper Cluster의 위치 # Deploy Helm Chart w/ name = djlee-kafka $ helm install djlee-kafka -f broker.yaml incubator/kafka
  11. 테스트 툴 설치: Kafka 공식 clients (1) # clients.yaml apiVersion:

    v1 kind: Pod metadata: name: clients namespace: default spec: containers: - name: clients image: confluentinc/cp-kafka:5.3.1 # Apache Kafka 2.3.1 command: - sh - -c - "exec tail -f /dev/null"
  12. 테스트 툴 설치: Kafka 공식 clients (2) # Deploy $

    kubectl apply -f clients.yaml # Topic 생성: test (partition = 3, replication factor = 3) $ kubectl -n default exec -it clients -- kafka-topics --zookeeper djlee-zookeeper-0.djlee-zookeeper-headless:2181,djlee-zookeeper-1.djlee- zookeeper-headless:2181 --topic test --create --partitions 3 --replication-factor 3 # Topic 안에 저장된 Records를 (맨 처음부터) 확인 $ kubectl -n default exec -it clients -- kafka-console-consumer --bootstrap-server djlee-kafka-0.djlee-kafka-headless:9092 --topic test --from-beginning
  13. 테스트 툴 설치: Kafkacat (1) • Kafkacat ◦ edenhill/kafkacat ◦

    Non-JVM Kafka Producer / Consumer ◦ netcat의 Kafka 판 • Produce, Consume, Metadata Listing 기능만 있음 ◦ 관리, 테스트용
  14. 테스트 툴 설치: Kafkacat (2) # kafkacat.yaml apiVersion: v1 kind:

    Pod metadata: name: kafkacat namespace: default spec: containers: - name: kafkacat image: confluentinc/cp-kafkacat:latest command: - sh - -c - "exec tail -f /dev/null"
  15. 테스트 툴 설치: Kafkacat (3) # Deploy $ kubectl apply

    -f kafkacat.yaml # Topic Metadata 확인 $ kubectl -n default exec -it kafkacat -- kafkacat \ -b djlee-kafka-0.djlee-kafka-headless:9092 -L # Text File 내용을 ‘test’ Topic으로 Produce $ cat test.txt | kubectl -n default exec -it kafkacat -- kafkacat \ -b djlee-kafka-0.djlee-kafka-headless:9092 -t test -P
  16. 정리 • Kafka on Kubernetes ◦ 장점도, 단점도 있음. ◦

    빠르고 간편하게 표준화된 배포 환경에 전개할 수 있다는 점은 확실한 장점. • 사용법 ◦ Zookeeper w/ Helm ◦ Kafka w/ Helm ◦ etc (e.g. Kafka Clients): 단순 Deploy