主要参考了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: v1
kind: Service
metadata:labels:app: zookeeper-servicename: zookeeper-service
spec:ports:- name: zookeeper-portport: 2181targetPort: 2181selector:app: zookeeper
apiVersion: extensions/v1beta1
kind: Deployment
metadata:labels:app: zookeepername: zookeeper
spec:replicas: 1template:metadata:labels:app: zookeeperspec:containers:- image: wurstmeister/zookeeperimagePullPolicy: IfNotPresentname: zookeeperports:- containerPort: 2181

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

apiVersion: v1
kind: Service
metadata:name: kafka-servicelabels:app: kafka
spec:type: NodePortports:- port: 9092name: kafka-porttargetPort: 9092nodePort: 30092protocol: TCPselector:app: kafka
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: kafka-deployment
spec:replicas: 1selector:matchLabels:name: kafkatemplate:metadata:labels:name: kafkaapp: kafkaspec:containers:- name: kafkaimage: wurstmeister/kafkaimagePullPolicy: IfNotPresentports:- containerPort: 9092env:- name: KAFKA_ADVERTISED_PORTvalue: "9092"- name: KAFKA_ADVERTISED_HOST_NAMEvalue: "[kafka的service的clusterIP]"- name: KAFKA_ZOOKEEPER_CONNECTvalue: [zookeeper的service的clusterIP]:2181- name: KAFKA_BROKER_IDvalue: "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个节点,分别运行在三台机器上。

我这里采用了3个Deployment来运行Kafka和Zookeeper,其实更优雅的方式是使用StatefulSet。Kubernetes的官方文档上有使用StatefulSet搭建Zookeeper集群的范例。

但是使用StatefulSet搭建Zookeeper和Kafka时,Zookeeper的myid和Kafka的brokerID就不能预先设置了,因此需要在镜像构建过程中加入相关的操作,而Docker Hub中的绝大多数镜像都不包含这一逻辑。而Deployment虽然不够优雅,但是可以对各节点预先配置,运行起来相对简单,可以说各有所长。

1.搭建Zookeeper集群

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

apiVersion: v1
kind: Service
metadata:name: zoo1labels:app: zookeeper-1
spec:ports:- name: clientport: 2181protocol: TCP- name: followerport: 2888protocol: TCP- name: leaderport: 3888protocol: TCPselector:app: zookeeper-1
---
apiVersion: v1
kind: Service
metadata:name: zoo2labels:app: zookeeper-2
spec:ports:- name: clientport: 2181protocol: TCP- name: followerport: 2888protocol: TCP- name: leaderport: 3888protocol: TCPselector:app: zookeeper-2
---
apiVersion: v1
kind: Service
metadata:name: zoo3labels:app: zookeeper-3
spec:ports:- name: clientport: 2181protocol: TCP- name: followerport: 2888protocol: TCP- name: leaderport: 3888protocol: TCPselector:app: zookeeper-3
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: zookeeper-deployment-1
spec:replicas: 1selector:matchLabels:app: zookeeper-1name: zookeeper-1template:metadata:labels:app: zookeeper-1name: zookeeper-1spec:containers:- name: zoo1image: digitalwonderland/zookeeperimagePullPolicy: IfNotPresentports:- containerPort: 2181env:- name: ZOOKEEPER_IDvalue: "1"- name: ZOOKEEPER_SERVER_1value: zoo1- name: ZOOKEEPER_SERVER_2value: zoo2- name: ZOOKEEPER_SERVER_3value: zoo3
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: zookeeper-deployment-2
spec:replicas: 1selector:matchLabels:app: zookeeper-2name: zookeeper-2template:metadata:labels:app: zookeeper-2name: zookeeper-2spec:containers:- name: zoo2image: digitalwonderland/zookeeperimagePullPolicy: IfNotPresentports:- containerPort: 2181env:- name: ZOOKEEPER_IDvalue: "2"- name: ZOOKEEPER_SERVER_1value: zoo1- name: ZOOKEEPER_SERVER_2value: zoo2- name: ZOOKEEPER_SERVER_3value: zoo3
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: zookeeper-deployment-3
spec:replicas: 1selector:matchLabels:app: zookeeper-3name: zookeeper-3template:metadata:labels:app: zookeeper-3name: zookeeper-3spec:containers:- name: zoo3image: digitalwonderland/zookeeperimagePullPolicy: IfNotPresentports:- containerPort: 2181env:- name: ZOOKEEPER_IDvalue: "3"- name: ZOOKEEPER_SERVER_1value: zoo1- name: ZOOKEEPER_SERVER_2value: zoo2- name: ZOOKEEPER_SERVER_3value: zoo3

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

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

2020-06-16 00:00:05,904 [myid:2] - INFO [QuorumPeer[myid=2]/0:0:0:0:0:0:0:0:2181:Leader@358] - LEADING - <br>LEADER ELECTION TOOK - 2613

2.搭建Kafka集群

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

apiVersion: v1
kind: Service
metadata:name: kafka-service-1labels:app: kafka-service-1
spec:type: NodePortports:- port: 9092name: kafka-service-1targetPort: 9092nodePort: 30901protocol: TCPselector:app: kafka-service-1
---
apiVersion: v1
kind: Service
metadata:name: kafka-service-2labels:app: kafka-service-2
spec:type: NodePortports:- port: 9092name: kafka-service-2targetPort: 9092nodePort: 30902protocol: TCPselector:app: kafka-service-2
---
apiVersion: v1
kind: Service
metadata:name: kafka-service-3labels:app: kafka-service-3
spec:type: NodePortports:- port: 9092name: kafka-service-3targetPort: 9092nodePort: 30903protocol: TCPselector:app: kafka-service-3
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: kafka-deployment-1
spec:replicas: 1selector:matchLabels:name: kafka-service-1template:metadata:labels:name: kafka-service-1app: kafka-service-1spec:containers:- name: kafka-1image: wurstmeister/kafkaimagePullPolicy: IfNotPresentports:- containerPort: 9092env:- name: KAFKA_ADVERTISED_PORTvalue: "9092"- name: KAFKA_ADVERTISED_HOST_NAMEvalue: [kafka-service1的clusterIP]- name: KAFKA_ZOOKEEPER_CONNECTvalue: zoo1:2181,zoo2:2181,zoo3:2181- name: KAFKA_BROKER_IDvalue: "1"- name: KAFKA_CREATE_TOPICSvalue: mytopic:2:1
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: kafka-deployment-2
spec:replicas: 1selector:selector:matchLabels:name: kafka-service-2template:metadata:labels:name: kafka-service-2app: kafka-service-2spec:containers:- name: kafka-2image: wurstmeister/kafkaimagePullPolicy: IfNotPresentports:- containerPort: 9092env:- name: KAFKA_ADVERTISED_PORTvalue: "9092"- name: KAFKA_ADVERTISED_HOST_NAMEvalue: [kafka-service2的clusterIP]- name: KAFKA_ZOOKEEPER_CONNECTvalue: zoo1:2181,zoo2:2181,zoo3:2181- name: KAFKA_BROKER_IDvalue: "2"
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: kafka-deployment-3
spec:replicas: 1selector:selector:matchLabels:name: kafka-service-3template:metadata:labels:name: kafka-service-3app: kafka-service-3spec:containers:- name: kafka-3image: wurstmeister/kafkaimagePullPolicy: IfNotPresentports:- containerPort: 9092env:- name: KAFKA_ADVERTISED_PORTvalue: "9092"- name: KAFKA_ADVERTISED_HOST_NAMEvalue: [kafka-service3的clusterIP]- name: KAFKA_ZOOKEEPER_CONNECTvalue: zoo1:2181,zoo2:2181,zoo3:2181- name: KAFKA_BROKER_IDvalue: "3"

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

3.测试

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

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

【K8S】 基于Kubernetes部署Kafka集群相关推荐

  1. k8s部署kafka集群

    前言 环境:centos 7.9 k8s集群.zookeeper集群 本篇将在k8s中部署kafka集群,kafka依赖zookeeper集群,zookeeper集群我们已经搭建好了,可以参考http ...

  2. k8s 中部署kafka集群

    由于开发过程中使用到了kafka,又不想自己部署kafka,索性采用k8s 部署kafka集群,以求做到随时插拔. 创建命名空间 apiVersion: v1 kind: Namespace meta ...

  3. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

  4. Kafka:Docker Compose部署Kafka集群

    创建目录用于存放Docker Compose部署Kafka集群的yaml文件: mkdir -p /root/composefile/kafka/ 写入该yaml文件: vim /root/compo ...

  5. Linux部署 kafka集群

    目录 问题现象: 解决方法: 0.环境 环境: 1.下载 地址: 拓展:Scala是什么? 2.部署 2.1 linux服务器上新建目录 2.2 上传kafka压缩包到服务器 2.3 解压 2.4 重 ...

  6. 现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群

    最近遇到的疑难现场问题层出不穷,本次遭遇的挑战是在4台windows Server 服务器上部署Kafka集群.这是一种比较少见的操作,原因是有些依赖的驱动对虚拟化支持不好,只能运行在实体win机上. ...

  7. 基于 Kubernetes 构建多集群的流水线

    基于Kubefed的多集群管理实践 多集群场景 主要分以下几个方面: 1)高可用低延时:应用部署到不同的集群去做高可用 2)容灾备份:特别是针对于数据库这类的应用 在a集群对外提供服务的同时给b集群做 ...

  8. k8s使用StatefulSet部署MongoDB集群

    1.1 前提准备 制作MongoDB 镜像,可从 Docker Hub 官网 下载镜像,目的是解决提示权限mongo-sidecar提示权限错误问题(官方镜像基础上添加了密码认证) 生成 keyfil ...

  9. k8s容器化部署及集群搭建笔记

    kubeadm部署k8s 将此文章写给我最心爱的女孩 目录 kubeadm部署k8s 1.部署准备工作 小知识 2.安装具体步骤 1.安装docker 2.配置国内镜像加速器 3.添加k8s的阿里云y ...

最新文章

  1. 解题报告(二)C、(darkBZOJ 2194) 快速傅立叶之二(FFT、卷积的概念、常用变换)
  2. .condarc文件是什么
  3. BZOJ 3211 弗洛拉前往国家 树阵+并检查集合
  4. 在程序中集成地址簿、电子邮件和地图功能
  5. [elixir! #0037] Agent 小传
  6. django 的form登录 注册
  7. 从 25 倍稀释下的蘑菇街期权说起
  8. linux启动redis_Redis简介
  9. 【面经】蚂蚁金服一二三面的面经总结(内推实习方面)
  10. 一个复杂系统的拆分改造实践
  11. SAP CRM WebClient UI cross component跳转的一个具体例子
  12. 力扣1523.在区间范围内统计奇数数目Count Odd Numbers in an Interval Range
  13. mac android通知中心,有什么软件可以把安卓通知栏变成苹果通知栏
  14. java 获取jboss路径_java中获取文件路径的几种方式
  15. 大数据Spark面试题
  16. JavaScript的20个工具函数助力H5高效开发
  17. rocketMQ系列(1) rocketMQ入门
  18. 居家也可以减肥?懒人瘦身也能行-987减肥网
  19. python .txt文件转.csv文件-ok
  20. cmd静默运行_如何在Win10上静默运行批处理文件

热门文章

  1. 在线公开课】基于MDM9206的GoKit4(G)在线公开课
  2. 基于惯性权重与柯西混沌变异的改进正余弦算法
  3. CST STUDIO SUITE 2021.04 SP4
  4. 推荐 :用归纳偏置来增强你的模型性能
  5. 质量:“PM,你怎么可以放弃我?!”
  6. esp8266下使用sh1106 的1.3寸 oled 屏幕
  7. 为什么被黑的总是易到?
  8. The APK file D:\xxxxxx\app\build\outputs\apk\xxxx.apk does not exist on disk
  9. elasticsearch数据类型--nested
  10. 发现一个有趣的小程序,可以控制系统声音播放音乐