Slide 1

Slide 1 text

Running Apache Kafka on Kubernetes Lee Dongjin | [email protected]

Slide 2

Slide 2 text

오늘 할 이야기는... ● 오늘의 주제 ○ Apache Kafka를 어떻게 Kubernetes + Docker 환경에서 띄울 것인가? ● 좀 더 구체적으로는... ○ 장점, 단점 ○ 사용 방법

Slide 3

Slide 3 text

● 단점 ○ Resource 문제 ○ Monitoring 문제 ○ Troubleshooting 문제 ■ “뭔가 잘못됐는데, Kubernetes도 Kafka도 잘 아는 사람이 없어!” ● 장점 ○ 쉽고 간편함 ■ 방법만 안다면. ○ 표준화된 배포 환경 ○ 빠른 전개 + Scale-up Kafka on Kubernetes: 장단점

Slide 4

Slide 4 text

Kafka on Kubernetes: 왜 어렵지? (1) ● Zookeeper ○ zookeeper (Official) ○ wurstmeister/zookeeper ● Kafka ○ confluentinc/cp-kafka ○ wurstmeister/kafka ○ solsson/kafka ○ bitnami/kafka ○ spotify/kafka

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Kafka on Kubernetes: 왜 어렵지? (3) ● Kafka 까지 설치했다고 끝이 아님 ○ 이제 절반 ○ 같은 kubernetes namespace 안에서 돌려야 하는 다른 요소들이 많음 ● 설치 대상 ○ 각종 테스트/운영용 Kafka client ■ 공식 client (kafka-topics.sh, ...) ■ kafkacat: 테스트 및 관리용 유틸리티 ○ 기타 Ecosystem 툴 ■ Schema Registry ■ Kafka Connect ■ ...

Slide 7

Slide 7 text

Kafka on Kubernetes: 그러면 어떻게? ● Stateful Application (Zookeeper, Kafka) ○ Helm Chart (incubator) ■ incubator/zookeeper ■ incubator/kafka ○ 약간의 요령만 알면 쓸 수 있다. ● Stateless Application (clients, ecosystem tools) ○ 단순 Deploy

Slide 8

Slide 8 text

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 /

Slide 9

Slide 9 text

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’

Slide 10

Slide 10 text

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를 하나씩 띄운다."

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

테스트 툴 설치: 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"

Slide 13

Slide 13 text

테스트 툴 설치: 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

Slide 14

Slide 14 text

테스트 툴 설치: Kafkacat (1) ● Kafkacat ○ edenhill/kafkacat ○ Non-JVM Kafka Producer / Consumer ○ netcat의 Kafka 판 ● Produce, Consume, Metadata Listing 기능만 있음 ○ 관리, 테스트용

Slide 15

Slide 15 text

테스트 툴 설치: 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"

Slide 16

Slide 16 text

테스트 툴 설치: 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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

질문?