热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s部署kafka集群方案收集

博客一 一、概述 在k8s里面部署kafka、zookeeper这种有状态的服务,不能使用deployment和RC,k8s提供了一种专门用来部署这种有状态的服务的API–

博客一


一、概述

在k8s里面部署kafka、zookeeper这种有状态的服务,不能使用deployment和RC,k8s提供了一种专门用来部署这种有状态的服务的API–statefulset,有状态简单来说就是需要持久化数据,比如日志、数据库数据、服务状态等。
statefulset应用场景:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之
  • 所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)
    statefulset组成:
  • 用于定义网络标志(DNS domain)的Headless Service
  • 用于创建PersistentVolumes的volumeClaimTemplates
  • 定义具体应用的StatefulSet
    StatefulSet中每个Pod的DNS格式为statefulSetName-{0…N-1}.serviceName.namespace.svc.cluster.local,其中
  • 0…N-1为Pod所在的序号,从0开始到N-1
  • serviceName为Headless Service的名字
  • statefulSetName为StatefulSet的名字
  • namespace为服务所在的namespace,Headless Servic和StatefulSet必须在相同的namespace
  • .cluster.local为Cluster Domain

二、部署

首先下载相关的部署文件:git clone https://github.com/cuishuaigit/k8s-kafka.git
部署前需要提前准备nfs提供动态存储,参考我之前的博客:https://www.cnblogs.com/cuishuai/p/9152277.html

cd k8s-kafka
kubectl create -f namesapce.yaml
kubectl create -f zk.yaml
kubectl create -f kafka.yaml

详细信息参考:https://github.com/cuishuaigit/k8s-kafka

博客二

如何快速部署,借助Helm,只需少量操作即可部署kafka;kafka和zookeeper对存储都有需求,若提前准备了StorageClass,存储一事则变得十分简单。本次实战涉及到的K8S、Helm、NFS、StorageClass等前置条件,它们的安装和使用请参考:
《kubespray2.11安装kubernetes1.15》
《部署和体验Helm(2.16.1版本)》
《Ubuntu16环境安装和使用NFS》
《K8S使用群晖DS218+的NFS》
《K8S的StorageClass实战(NFS)》

环境信息

本次实战的操作系统和软件的版本信息如下:
Kubernetes:1.15
Kubernetes宿主机:CentOS Linux release 7.7.1908
NFS服务:IP地址192.168.50.135,文件夹/volume1/nfs-storageclass-test
Helm:2.16.1
Kafka:2.0.1
Zookeeper:3.5.5
接下来的实战之前,请您准备好:K8S、Helm、NFS、StorageClass;

操作

添加helm仓库(该仓库中有kafka):helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
下载kafka的chart:helm fetch incubator/kafka
下载成功后当前目录有个压缩包:kafka-0.20.8.tgz,解压:tar -zxvf kafka-0.20.8.tgz
进入解压后的kafka目录,编辑values.yaml文件,下面是具体的修改点:
首先要设置在K8S之外的也能使用kafka服务,修改external.enabled的值,改为true:

找到configurationOverrides,下图两个黄框中的内容原本是注释的,请删除注释符号,另外,如果您之前设置过跨网络访问kafka,就能理解下面写入K8S宿主机IP的原因了:

接下来设置数据卷,找到persistence,按需要调整大小,再设置已准备好的storageclass的名称:

再设置zookeeper的数据卷:

设置完成,开始部署,先创建namespace,执行:kubectl create namespace kafka-test
在kafka目录下执行:helm install --name-template kafka -f values.yaml . --namespace kafka-test
如果前面的配置没有问题,控制台提示如下所示:

kafka启动依赖zookeeper,整个启动会耗时数分钟,期间可见zookeeper和kafka的pod逐渐启动:

查看服务:kubectl get services -n kafka-test,如下图红框所示,通过宿主机IP:31090、宿主机IP:31091、宿主机IP:31092即可从外部访问kafka:

查看kafka版本:kubectl exec kafka-0 -n kafka-test – sh -c ‘ls /usr/share/java/kafka/kafka_*.jar’ ,如下图红框所示,scala版本2.11,kafka版本2.0.1:

kafka启动成功后,咱们来验证服务是否正常;

对外暴露zookeeper

为了远程操作kafka,有时需要连接到zookeeper,所以需要将zookeeper也暴露出来;
创建文件zookeeper-nodeport-svc.yaml,内容如下:

apiVersion: v1
kind: Service
metadata:
name: zookeeper-nodeport
namespace: kafka-test
spec:
type: NodePort
ports:
- port: 2181
nodePort: 32181
selector:
app: zookeeper
release: kafka

执行命令:kubectl apply -f zookeeper-nodeport-svc.yaml
查看服务,发现已经可以通过宿主机IP:32181访问zookeeper了,如下图:

验证kafka服务
找一台电脑安装kafka包,就能通过里面自带的命令远程连接和操作K8S的kafka了:
访问kafka官网:http://kafka.apache.org/downloads ,刚才确定了scala版本2.11,kafka版本2.0.1,因此下载下图红框中的版本:

下载后解压,进入目录kafka_2.11-2.0.1/bin
查看当前topic:./kafka-topics.sh --list --zookeeper 192.168.50.135:32181
如下图,空空如也:

创建topic:./kafka-topics.sh --create --zookeeper 192.168.50.135:32181 --replication-factor 1 --partitions 1 --topic test001
如下图,创建成功后再查看topic终于有内容了:

查看名为test001的topic:./kafka-topics.sh --describe --zookeeper 192.168.50.135:32181 --topic test001

进入创建消息的交互模式:./kafka-console-producer.sh --broker-list 192.168.50.135:31090 --topic test001
进入交互模式后,输入任何字符串再输入回车,就会将当前内容作为一条消息发送出去:

再打开一个窗口,执行命令消费消息:./kafka-console-consumer.sh --bootstrap-server 192.168.50.135:31090 --topic test001 --from-beginning

再打开一个窗口,执行命令查看消费者group:./kafka-consumer-groups.sh --bootstrap-server 192.168.50.135:31090 --list
如下图可见groupid等于console-consumer-21022

执行命令查看groupid等于console-consumer-21022的消费情况:./kafka-consumer-groups.sh --group console-consumer-21022 --describe --bootstrap-server 192.168.50.135:31090
如下图所示:

远程连接kafka体验基本功能完毕,查看、收发消息都正常,证明本次部署成功;

kafkacat连接

kafkacat是个客户端工具,我这里是在MacBook Pro上用brew安装的;
我这里K8S服务器IP是192.168.50.135,因此执行此命令查看kafka信息:kafkacat -b 192.168.50.135:31090 -L,如下图,可以看到broker信息,以及topic信息(一个是test001,还有一个是consumer的offset),把端口换成31091和31092会连接到另外两个broker,也能得到相同信息:

清理资源

本次实战创建了很多资源:rbac、role、serviceaccount、pod、deployment、service,下面的脚本可以将这些资源清理掉(只剩NFS的文件没有被清理掉):

helm del --purge kafka
kubectl delete service zookeeper-nodeport -n kafka-test
kubectl delete storageclass managed-nfs-storage
kubectl delete deployment nfs-client-provisioner -n kafka-test
kubectl delete clusterrolebinding run-nfs-client-provisioner
kubectl delete serviceaccount nfs-client-provisioner -n kafka-test
kubectl delete role leader-locking-nfs-client-provisioner -n kafka-test
kubectl delete rolebinding leader-locking-nfs-client-provisioner -n kafka-test
kubectl delete clusterrole nfs-client-provisioner-runner
kubectl delete namespace kafka-test

详细信息参考:https://github.com/zq2599/blog_demos

在Kubernetes上运行Kafka合适吗?

Kubernetes设计的初衷是运行无状态工作负载。这些通常采用微服务架构的工作负载,是轻量级,可水平扩展,遵循十二要素应用程序,可以处理环形断路和随机Monkey测试。
另一方面,Kafka本质上是一个分布式数据库。这意味着你必须处理状态,它比微服务更重量级。Kubernetes支持有状态的工作负载,但你必须谨慎对待它,正如Kelsey Hightower在最近的两条推文中指出的那样:

现在你应该在Kubernetes上运行Kafka吗?我的反问是:没有它,Kafka会跑得更好吗?这就是为什么我要指出Kafka和Kubernetes之间的相互补充性以及你可能遇到的陷阱。

运行时

让我们先看一下基本的东西——运行时本身。

进程

Kafka brokers对CPU很友好。TLS可能会引入一些开销。如果Kafka客户端使用加密,则需要更多CPU,但这不会影响brokers。

内存

Kafka brokers是内存消耗大户。JVM堆通常可以限制为4-5 GB,但由于Kafka大量使用页面缓存,因此还需要足够的系统内存。在Kubernetes中,可以相应地设置容器资源限制和请求。

存储

容器中的存储是短暂的——重启后数据将丢失。可以对Kafka数据使用emptyDir卷,这将产生相同的效果:brokers的数据将在停机后丢失。您的消息在其他broker上作为副本还是可以使用的。因此,重新启动后,失败的broker必须得复制所有的数据,这可能是一个耗时过程。
这就是你应该使用持久存储的原因。使用XFS或ext4的非本地持久性块存储更合适。我警告你:不要使用NFS。NFS v3和v4都不会起作用。简而言之,Kafka broker会因为NFS“愚蠢重命名”问题而无法删除数据目录,自行终止。如果你仍然不相信我,那么请仔细阅读这篇博文。存储必须是非本地的,以便Kubernetes在重新启动或重新定位时可以更灵活地选择另一个节点。

网络

与大多数分布式系统一样,Kafka性能在很大程度上取决于低网络延迟和高带宽。不要试图将所有代理放在同一节点上,因为这会降低可用性。如果Kubernetes节点出现故障,那么整个Kafka集群都会出现故障。不要跨数据中心扩展Kafka集群。这同样适用于Kubernetes集群。不同的可用区域是一个很好的权衡。

配置清单

Kubernetes网站包含一个非常好的教程,介绍如何使用清单设置ZooKeeper。由于ZooKeeper是Kafka的一部分,因此可以通过这个了解哪些Kubernetes概念被应用在这里。一旦理解,您也可以对Kafka集群使用相同的概念。
Pod:Pod是Kubernetes中最小的可部署单元。它包含您的工作负载,它代表群集中的一个进程。一个Pod包含一个或多个容器。整体中的每个ZooKeeper服务器和Kafka集群中的每个Kafka broker都将在一个单独的Pod中运行。
StatefulSet:StatefulSet是一个Kubernetes对象,用于处理需要协调的多个有状态工作负载。StatefulSets保证Pod的有序性和唯一性的。
Headless Services:服务通过逻辑名称将Pod与客户端分离。Kubernetes负责负载平衡。但是,对于ZooKeeper和Kafka等有状态工作负载,客户端必须与特定实例进行通信。这就是 Headless Services发挥作用的地方:作为客户端,仍然可以获得逻辑名称,但不必直接访问Pod。
持久卷:如上所述,需要配置非本地持久块存储。
Yolean提供了一套全面的清单,可以帮助您开始使用Kubernetes上的Kafka。

Helm Charts

Helm是Kubernetes的包管理器,类似yum,apt,Homebrew或Chocolatey等OS包管理器。它允许您安装Helm Charts中描述的预定义软件包。精心设计的Helm Charts能简化所有参数正确配置的复杂任务,以便在Kubernetes上运行Kafka。有几张图表适用于Kafka的的可供选择:一个是处于演进状态的官方图表,一个来自Confluent,另一个来自Bitnami,仅举几例。

Operators

由于Helm的一些限制,另一种工具变得非常流行:Kubernetes Operators。Operators不仅可以为Kubernetes打包软件,还可以为Kubernetes部署和管理一个软件。
评价很高的Operators名单中提到Kafka有两个,其中一个是Strimzi,Strimzi使得在几分钟内启动Kafka集群变得非常容易,几乎不需要任何配置,它增加了一些漂亮的功能,如群集间点对点TLS加密。Confluent还宣布即将推出新的Operator。

性能

运行性能测试以对Kafka安装进行基准测试非常重要。在您遇到麻烦之前,它会为您提供有关可能的瓶颈的地方。幸运的是,Kafka已经提供了两个性能测试工具:kafka-producer-perf-test.sh和kafka-consumer-perf-test.sh。记得经常使用它们。作为参考,可以使用Jay Kreps的博客结果,或者 Stéphane Maarek在 Amazon MSK的评论。

运维监控

可见性非常重要,否则您将不知道发生了什么。如今,有一种不错的工具可以用云原生方式监控指标。Prometheus和Grafana是两种流行的工具。Prometheus可以直接从JMX导出器收集所有Java进程(Kafka,ZooKeeper,Kafka Connect)的指标。添加cAdvisor指标可为提供有关Kubernetes资源使用情况的其他信息。
Strimzi为Kafka提供了一个优雅的Grafana仪表板示例。它以非常直观的方式可视化关键指标,如未复制的和离线分区。它通过资源使用和性能以及稳定性指标来补充这些指标。因此,可以免费获得基本的Kafka集群监控!
可以通过客户端监控(消费者和生产者指标),使用Burrow滞后监控,使用Kafka Monitor进行端到端监控,来完成这个任务

日志记录

日志记录是另一个关键部分。确保Kafka安装中的所有容器都记录到标准输出(stdout)和标准错误输出(stderr),并确保Kubernetes集群将所有日志聚合到中央日志记录设施中如Elasticsearch中。

健康检查

Kubernetes使用活跃度和就绪探测器来确定Pod是否健康。如果活跃度探测失败,Kubernetes将终止容器并在相应设置重启策略时自动重启。如果准备就绪探测失败,那么Kubernetes将通过服务从服务请求中删除该Pod。这意味着在这种情况下不再需要人工干预,这是一大优点。

滚动更新

StatefulSets支持自动更新:滚动更新策略将一次更新一个Kafka Pod。通过这种方式,可以实现零停机时间,这是Kubernetes带来的另一大优势。

扩展

扩展Kafka集群并非易事。但是,Kubernetes可以很容易地将Pod缩放到一定数量的副本,这意味着可以声明式地定义所需数量的Kafka brokers。困难的部分是在放大或缩小之前重新分配部分。同样,Kubernetes可以帮助您完成这项任务。

管理

通过在Pod中打开shell,可以使用现有的shell脚本完成Kafka群集的管理任务,例如创建主题和重新分配分区。这不是一个很好的解决方案。Strimzi支持与另一个Operator管理主题。这还有改进的余地。

备份和还原

现在Kafka的可用性还取决于Kubernetes的可用性。如果Kubernetes群集出现故障,那么在最坏的情况下Kafka群集也会故障。墨菲定律告诉我们,这也会发生在你身上,你会丢失数据。要降低此风险,请确保您具有备份想法。MirrorMaker是一种可选方案,另一种可能是利用S3进行连接备份,如Zalando的博客文章所述。

结论

对于中小型Kafka集群,我肯定会选择Kubernetes,因为它提供了更大的灵活性并简化了操作。如果您在延迟和/或吞吐量方面具有非常高的非功能性要求,则不同的部署选项可能更有益。

https://github.com/kubernetes-retired/contrib/tree/master/statefulsets/kafka
https://cloud.tencent.com/developer/article/1005492
https://www.kubernetes.org.cn/5032.html


推荐阅读
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • 我正在使用sql-serverkafka-connect和debezium监视sqlserver数据库,但是当我发布并运行我的wo ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • 由于同源策略的限制,满足同源的脚本才可以获取资源。虽然这样有助于保障网络安全,但另一方面也限制了资源的使用。那么如何实现跨域呢,以下是实现跨域的一些方法。 ... [详细]
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • python zookeeeper 学习和操作
    1.zookeeeper介绍ZooKeeper是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的 ... [详细]
  • Zookeeper为分布式环境提供灵活的协调基础架构。ZooKeeper框架支持许多当今最好的工业应用程序。我们将在本章中讨论ZooKeeper的一些最显着的应用。雅虎ZooKee ... [详细]
  • 原创 | 大数据入门基础系列之ClouderaManager版本的Hive安装部署
    添加服务,一 ... [详细]
  • #python没有类似于java和C#的接口类(interface),需要使用抽象类和抽象方法来实现接口功能#!usrbinenvpython#_*_coding ... [详细]
author-avatar
亲爱的jackvan叔叔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有