分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

Kubernetes部署Kafka集群

发布时间:2023-09-06 02:12责任编辑:傅花花关键词:暂无标签

主要参考了https://stackoverflow.com/questions/44651219/kafka-deployment-on-minikube和https://github.com/ramhiser/kafka-kubernetes两个项目,但是这两个项目都是单节点的Kafka,我这里尝试将单节点Kafka扩展为多节点的Kafka集群。

一、单节点Kafka

要搭建Kafka集群,还是要从单节点开始。

1.创建Zookeeper服务zookeeper-svc.yaml和zookeeper-deployment.yaml,用kubectl create -f创建:

apiVersion: v1kind: Servicemetadata: ?labels: ???app: zookeeper-service ?name: zookeeper-servicespec: ?ports: ?- name: zookeeper-port ???port: 2181 ???targetPort: 2181 ?selector: ???app: zookeeper
apiVersion: extensions/v1beta1kind: Deploymentmetadata: ?labels: ???app: zookeeper ?name: zookeeperspec: ?replicas: 1 ?template: ???metadata: ?????labels: ???????app: zookeeper ???spec: ?????containers: ?????- image: wurstmeister/zookeeper ???????imagePullPolicy: IfNotPresent ???????name: zookeeper ???????ports: ???????- containerPort: 2181

2.等pod跑起来,service的endpoint配置成功后,就可以继续创建kafka的kafka-svc.yaml和kafka-deployment.yaml了:

apiVersion: v1kind: Servicemetadata: ?name: kafka-service ?labels: ???app: kafkaspec: ?type: NodePort ?ports: ?- port: 9092 ???name: kafka-port ???targetPort: 9092 ???nodePort: 30092 ???protocol: TCP ?selector: ???app: kafka
kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: kafka-deploymentspec: ?replicas: 1 ?selector: ???matchLabels: ?????name: kafka ?template: ???metadata: ?????labels: ???????name: kafka ???????app: kafka ???spec: ?????containers: ?????- name: kafka ???????image: wurstmeister/kafka ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 9092 ???????env: ???????- name: KAFKA_ADVERTISED_PORT ?????????value: "9092" ???????- name: KAFKA_ADVERTISED_HOST_NAME ?????????value: "[kafka的service的clusterIP]" ???????- name: KAFKA_ZOOKEEPER_CONNECT ?????????value: [zookeeper的service的clusterIP]:2181 ???????- name: KAFKA_BROKER_ID ?????????value: "1"

clusterIP通过kubectl get svc进行查看。KAFKA_ZOOKEEPER_CONNECT的值也可以改为zookeeper-service:2181。

3.创建后,需要对服务进行测试。参考了https://blog.csdn.net/boling_cavalry/article/details/78309050的方法。

在此之前,针对虚拟化的Kafka,需要先执行下面的命令以进入容器:

kubectl exec -it [Kafka的pod名称] /bin/bash

进入容器后,Kafka的命令存储在opt/kafka/bin目录下,用cd命令进入:

cd opt/kafka/bin

后面的操作就跟上面的博客中写的类似了。针对单节点Kafka,需要将同一个节点作为生产者和消费者。执行命令如下:

kafka-console-producer.sh --broker-list [kafka的service的clusterIP]:9092 --topic test

运行正常的话,下方会出现>标记以提示输入消息。这样这个终端就成为了生产者。

另外打开一个linux终端,执行相同的命令进入容器。这次将这个终端作为消费者。注意,上面的博客中写的创建消费者的方法在新版的Kafka中已经改变,需要执行下面的命令:

kafka-console-consumer.sh --bootstrap-server [kafka的service的clusterIP]:9092 --topic test --from-beginning

之后,在生产者输入信息,查看消费者是否能够接收到。如果接收到,说明运行成功。

最后,还可以执行下面的命令以测试列出所有的消息主题:

kafka-topics.sh --list --zookeeper [zookeeper的service的clusterIP]:2181

注意,有时需要用Kafka的端口,有时需要用Zookeeper的端口,应注意区分。

二、多节点Kafka集群

单节点服务运行成功后,就可以尝试增加Kafka的节点以建立集群。我的Kubernetes集群包含3个节点,所以我搭建的Kafka集群也包含3个节点,分别运行在三台机器上。

1.搭建Zookeeper集群

创建zookeeper的yaml文件zookeeper-svc2.yaml和zookeeper-deployment2.yaml如下:

apiVersion: v1kind: Servicemetadata: ?name: zoo1 ?labels: ???app: zookeeper-1spec: ?ports: ?- name: client ???port: 2181 ???protocol: TCP ?- name: follower ???port: 2888 ???protocol: TCP ?- name: leader ???port: 3888 ???protocol: TCP ?selector: ???app: zookeeper-1---apiVersion: v1kind: Servicemetadata: ?name: zoo2 ?labels: ???app: zookeeper-2spec: ?ports: ?- name: client ???port: 2181 ???protocol: TCP ?- name: follower ???port: 2888 ???protocol: TCP ?- name: leader ???port: 3888 ???protocol: TCP ?selector: ???app: zookeeper-2---apiVersion: v1kind: Servicemetadata: ?name: zoo3 ?labels: ???app: zookeeper-3spec: ?ports: ?- name: client ???port: 2181 ???protocol: TCP ?- name: follower ???port: 2888 ???protocol: TCP ?- name: leader ???port: 3888 ???protocol: TCP ?selector: ???app: zookeeper-3
kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: zookeeper-deployment-1spec: ?replicas: 1 ?selector: ???matchLabels: ?????app: zookeeper-1 ?????name: zookeeper-1 ?template: ???metadata: ?????labels: ???????app: zookeeper-1 ???????name: zookeeper-1 ???spec: ?????containers: ?????- name: zoo1 ???????image: digitalwonderland/zookeeper ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 2181 ???????env: ???????- name: ZOOKEEPER_ID ?????????value: "1" ???????- name: ZOOKEEPER_SERVER_1 ?????????value: zoo1 ???????- name: ZOOKEEPER_SERVER_2 ?????????value: zoo2 ???????- name: ZOOKEEPER_SERVER_3 ?????????value: zoo3---kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: zookeeper-deployment-2spec: ?replicas: 1 ?selector: ???matchLabels: ?????app: zookeeper-2 ?????name: zookeeper-2 ?template: ???metadata: ?????labels: ???????app: zookeeper-2 ???????name: zookeeper-2 ???spec: ?????containers: ?????- name: zoo2 ???????image: digitalwonderland/zookeeper ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 2181 ???????env: ???????- name: ZOOKEEPER_ID ?????????value: "2" ???????- name: ZOOKEEPER_SERVER_1 ?????????value: zoo1 ???????- name: ZOOKEEPER_SERVER_2 ?????????value: zoo2 ???????- name: ZOOKEEPER_SERVER_3 ?????????value: zoo3---kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: zookeeper-deployment-3spec: ?replicas: 1 ?selector: ???matchLabels: ?????app: zookeeper-3 ?????name: zookeeper-3 ?template: ???metadata: ?????labels: ???????app: zookeeper-3 ???????name: zookeeper-3 ???spec: ?????containers: ?????- name: zoo3 ???????image: digitalwonderland/zookeeper ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 2181 ???????env: ???????- name: ZOOKEEPER_ID ?????????value: "3" ???????- name: ZOOKEEPER_SERVER_1 ?????????value: zoo1 ???????- name: ZOOKEEPER_SERVER_2 ?????????value: zoo2 ???????- name: ZOOKEEPER_SERVER_3 ?????????value: zoo3

这里创建了3个deployment和3个service,一一对应。这样,三个实例都可以对外提供服务。

创建完成后,需要用kubectl logs查看一下三个Zookeeper的pod的日志,确保没有错误发生,并且在3个节点的日志中,有类似下面的语句,则表明Zookeeper集群已顺利搭建成功。

2016-10-06 14:04:05,904 [myid:2] - INFO [QuorumPeer[myid=2]/0:0:0:0:0:0:0:0:2181:Leader@358] - LEADING - 
LEADER ELECTION TOOK - 2613

2.搭建Kafka集群

同样创建3个deployment和3个service,编写kafka-svc2.yaml和kafka-deployment2.yaml如下:

apiVersion: v1kind: Servicemetadata: ?name: kafka-service-1 ?labels: ???app: kafka-service-1spec: ?type: NodePort ?ports: ?- port: 9092 ???name: kafka-service-1 ???targetPort: 9092 ???nodePort: 30901 ???protocol: TCP ?selector: ???app: kafka-service-1---apiVersion: v1kind: Servicemetadata: ?name: kafka-service-2 ?labels: ???app: kafka-service-2spec: ?type: NodePort ?ports: ?- port: 9092 ???name: kafka-service-2 ???targetPort: 9092 ???nodePort: 30902 ???protocol: TCP ?selector: ???app: kafka-service-2---apiVersion: v1kind: Servicemetadata: ?name: kafka-service-3 ?labels: ???app: kafka-service-3spec: ?type: NodePort ?ports: ?- port: 9092 ???name: kafka-service-3 ???targetPort: 9092 ???nodePort: 30903 ???protocol: TCP ?selector: ???app: kafka-service-3
kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: kafka-deployment-1spec: ?replicas: 1 ?selector: ???matchLabels: ?????name: kafka-service-1 ?template: ???metadata: ?????labels: ???????name: kafka-service-1 ???????app: kafka-service-1 ???spec: ?????containers: ?????- name: kafka-1 ???????image: wurstmeister/kafka ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 9092 ???????env: ???????- name: KAFKA_ADVERTISED_PORT ?????????value: "9092" ???????- name: KAFKA_ADVERTISED_HOST_NAME ?????????value: [kafka-service1的clusterIP] ???????- name: KAFKA_ZOOKEEPER_CONNECT ?????????value: zoo1:2181,zoo2:2181,zoo3:2181 ???????- name: KAFKA_BROKER_ID ?????????value: "1" ???????- name: KAFKA_CREATE_TOPICS ?????????value: mytopic:2:1---kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: kafka-deployment-2spec: ?replicas: 1 ?selector: ?selector: ???matchLabels: ?????name: kafka-service-2 ?template: ???metadata: ?????labels: ???????name: kafka-service-2 ???????app: kafka-service-2 ???spec: ?????containers: ?????- name: kafka-2 ???????image: wurstmeister/kafka ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 9092 ???????env: ???????- name: KAFKA_ADVERTISED_PORT ?????????value: "9092" ???????- name: KAFKA_ADVERTISED_HOST_NAME ?????????value: [kafka-service2的clusterIP] ???????- name: KAFKA_ZOOKEEPER_CONNECT ?????????value: zoo1:2181,zoo2:2181,zoo3:2181 ???????- name: KAFKA_BROKER_ID ?????????value: "2"---kind: DeploymentapiVersion: extensions/v1beta1metadata: ?name: kafka-deployment-3spec: ?replicas: 1 ?selector: ?selector: ???matchLabels: ?????name: kafka-service-3 ?template: ???metadata: ?????labels: ???????name: kafka-service-3 ???????app: kafka-service-3 ???spec: ?????containers: ?????- name: kafka-3 ???????image: wurstmeister/kafka ???????imagePullPolicy: IfNotPresent ???????ports: ???????- containerPort: 9092 ???????env: ???????- name: KAFKA_ADVERTISED_PORT ?????????value: "9092" ???????- name: KAFKA_ADVERTISED_HOST_NAME ?????????value: [kafka-service3的clusterIP] ???????- name: KAFKA_ZOOKEEPER_CONNECT ?????????value: zoo1:2181,zoo2:2181,zoo3:2181 ???????- name: KAFKA_BROKER_ID ?????????value: "3"

在deployment1中执行了创建一个新topic的操作。

3.测试

测试方法基本同单集群的情况,这里就不赘述了。不同的是,这次可以将不同的节点作为生产者和消费者。

至此,Kubernetes的Kafka集群搭建就大功告成了!

Kubernetes部署Kafka集群

原文地址:https://www.cnblogs.com/00986014w/p/9561901.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved