如何在 Docker 和 DigitalOcean Kubernetes 上部署 Kafka

Apache Kafka 是一个开源的分布式事件和流处理平台,使用 Java 编写,旨在处理要求严苛的实时数据流。它被设计为具有容错能力,并支持每个集群拥有数百个节点。高效运行更多数量的节点需要容器化和编排流程以实现最优资源使用,例如使用 Kubernetes。

在本教程中,你将学习如何使用 Docker Compose 部署 Kafka。你还将学习如何在 DigitalOcean Kubernetes上使用 Strimzi 部署 Kafka,Strimzi 能够集成到 Kubernetes 中,并允许你使用常规 Kubernetes 清单配置和维护 Kafka 集群,无需手动操作。

准备工作

要想跟着本教程后续的步骤,你需要:

  • 在你的电脑上安装 Docker。至于 Ubuntu,可以阅读我们写的 如何在 Ubuntu 上安装和使用 Docker。你只需要完成其中的第1步和第2步。
  • 在你的电脑上安装 Docker Compose。
  • 一个配置了kubectl默认连接的DigitalOcean Kubernetes v1.23+集群。创建集群时,可以在“连接到你的集群”步骤下找到如何配置kubectl的说明。要在 DigitalOcean 上创建 Kubernetes集群,请阅读 Kubernetes 快速入门。
  • 在你的本地电脑上安装 Helm 3 包管理器。完成 如何使用 Helm 3 包管理器在 Kubernetes 集群上安装软件 教程的第1步即可。
  • 理解 Kafka ,包括主题、生产者和消费者。了解更多信息,可访问 Kafka 介绍。

步骤1 - 使用 Docker Compose 运行 Kafka

在本节中,你将学习如何在 KRaft 模式下使用 Docker Compose 运行 Kafka。使用 KRaft 可以简化整体配置和资源使用,因为不需要 ZooKeeper 实例。

首先,定义一个包含已解压 Kafka 发布版的 Docker 镜像。之后会使用它来测试与 Kafka 容器的连接,通过使用包含的脚本。

在 Dockerfile 中存储所需的命令。创建并打开它进行编辑:

nano Dockerfile

添加以下行:

FROM ubuntu:latest AS build
RUN apt-get update
RUN apt-get install curl default-jre -y
WORKDIR /kafka-test
RUN curl -o kafka.tgz https://dlcdn.apache.org/kafka/3.7.0/kafka_2.13-3.7.0.tgz
RUN tar -xzf kafka.tgz --strip-components=1

容器基于最新的 Ubuntu 版本。在更新包缓存和安装 curl 及 Java 之后,下载一个 Kafka 发布包。在我们写这篇文章教程时,Kafka 的最新版本是 3.7.0。你可以在官方下载页面查找最新版本。

然后,你设置工作目录(WORKDIR)为 /kafka-test,在该目录下下载并解压 Kafka 发布包。在 tar 命令中传递 --strip-components=1 参数,以跳过存档中的第一个目录,该目录以存档本身的名称命名。

保存并关闭文件。

接下来,你将在名为 kafka-compose.yaml 的文件中定义 Docker Compose 配置。通过运行以下命令创建并打开它进行编辑:

nano kafka-compose.yaml

在这个 yaml 文件中添加以下内容:

version: '3'

services:
  kafka:
    image: 'bitnami/kafka:latest'
    environment:
      - KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  kafka-test:
    build:
      dockerfile: Dockerfile
      context: .
    tty: true

在这里,你定义了两个服务,kafka 和 kafka-test。kafka 服务基于最新的 Bitnami Kafka 镜像。在环境变量部分,你传入必要的环境变量及其值,这些变量和值会降 Kafka 节点配置为独立模式,并设置 ID 为 0。

对于 kafka-test,传入刚刚创建的 Dockerfile 作为构建容器镜像的基础。通过设置 tty 为 true(卡其虚拟终端),保持与容器的会话。这一步很重要,因为容器在启动后如果没有进一步的命令,将会立即退出。

保存并关闭文件,然后运行以下命令在后台启动服务:

docker-compose -f kafka-compose.yaml up -d

因为 kafka-test 是第一次构建,输出将会很长。输出将如下所示::

Output...
Creating docker_kafka_1      ... done
Creating docker_kafka-test_1 ... done

你可以使用以下命令列出正在运行的容器:

docker ps

输出将如下所示:

Output
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS      NAMES
3ce3e3190f6e   bitnami/kafka:latest   "/opt/bitnami/script…"   4 seconds ago   Up 3 seconds   9092/tcp   docker_kafka_1
2a0cd13859e3   docker_kafka-test      "/bin/bash"              4 seconds ago   Up 3 seconds              docker_kafka-test_1

通过运行以下命令在 kafka-test 容器中打开一个 shell:

docker exec -it docker_kafka-test_1 bash

Shell 将已经定位在 /kafka-test 目录中:

root@2a0cd13859e3:/kafka-test#

然后,尝试使用 kafka-topics.sh 创建一个主题:

bin/kafka-topics.sh --create --topic first-topic --bootstrap-server kafka:9092

请注意,在 Docker Compose 配置中,你可以通过其名称(kafka)引用 Kafka。

输出将如下所示:

Output

Created topic first-topic.

你已经成功地从 Docker Compose 服务内部连接到 Kafka 部署。输入 exit 并按 Enter 键以关闭 shell。

要想停止 Docker Compose 部署,请运行以下命令:

docker-compose -f kafka-compose.yaml down

在这一步中,你已经使用 Docker Compose 部署了 Kafka。你还通过部署一个包含用于连接到 Kafka 的 shell 脚本的自定义镜像,测试了 Kafka 是否可以从其他容器内部访问。接下来,你将学习如何在 DigitalOcean Kubernetes上部署 Kafka。

步骤2 - 将 Strimzi 安装到 Kubernetes

在本节中,你将了解如何把 Strimzi 安装到你的 Kubernetes 集群中。这包括将其仓库添加到 Helm 并创建一个 Helm release。

首先,你需要将 Strimzi Helm 仓库添加到 Helm,该仓库包含 Strimzi 图表:

​
helm repo add strimzi https://strimzi.io/charts

输出将如下所示:

Output
"strimzi" has been added to your repositories

然后,刷新 Helm 的缓存以下载其内容:

helm repo update

输出将如下所示:

Output

...Successfully got an update from the "strimzi" chart repository

Update Complete. ⎈Happy Helming!⎈

最后,通过运行以下命令将 Strimzi 安装到您的集群:

helm install strimzi strimzi/strimzi-kafka-operator

输出将如下所示:

Output

NAME: strimzi

LAST DEPLOYED: ...

NAMESPACE: default

STATUS: deployed

REVISION: 1

TEST SUITE: None

NOTES:

Thank you for installing strimzi-kafka-operator-0.40.0

To create a Kafka cluster refer to the following documentation.

https://strimzi.io/docs/operators/latest/deploying.html#deploying-cluster-operator-helm-chart-str

你现在已经在您的 Kubernetes 集群中安装了 Strimzi。在下一节中,你将学习使用它来将 Kafka 部署到你的集群。

步骤3 - 向 Kubernetes 部署 Kafka 集群

在这一节中,你将向你的 Kubernetes 集群部署一个带有 ZooKeeper 的单节点 Kafka 集群。在撰写本文时,Strimzi 中通常还不支持使用 KRaft 部署 Kafka。

你将把部署的 Kubernetes 清单存储在一个名为 kafka.yaml 的文件中。创建并打开它进行编辑:

nano kafka.yaml

在你的文件中添加以下行内容:

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 3.7.0
    replicas: 1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
      default.replication.factor: 1
      min.insync.replicas: 1
      inter.broker.protocol.version: "3.7"
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  zookeeper:
    replicas: 1
    storage:
      type: persistent-claim
      size: 100Gi
      deleteClaim: false
  entityOperator:
    topicOperator: {}
    userOperator: {}

spec的第一部分与 Kafka 本身相关。你设置了版本以及副本数量。然后,你定义了两个监听器,这些是 Kafka 部署将用来通信的端口。第二个监听器因为你设置了 tls 为 true 而加密。由于监听器不能冲突,你为第二个指定了 9093 作为端口号。

由于你在 config 部分只部署了一个 Kafka 节点,那么将各种副本因子(主题、事件和副本)设置为1。对于 storage,将 type 设置为 jbod(意为“仅仅一堆磁盘”),这让你可以指定多个 volumes。在这里,你定义了一个类型为 persistent-claim 的 volume,大小为 100GB。这将创建一个 DigitalOcean Volume 并将其分配给 Kafka。你还设置了 deleteClaim 为 false,以确保在销毁 Kafka 集群时数据不会被删除。

为了配置 zookeeper 部署,将其 replicas 数量设置为 1,并为其提供一个 100GB 的单一 persistent-claim,因为只有 Kafka 支持 jbod storage type。在 entityOperator 下的两个定义指示 Strimzi 创建用于处理 Kafka topics 和 users 的集群范围 operators。

保存并关闭文件,然后通过运行以下命令应用它:

kubectl apply -f kafka.yaml

kubectl 将显示以下输出:

Output
kafka.kafka.strimzi.io/my-cluster created

你可以通过运行以下命令观察部署变得可用:

kubectl get strimzipodset -w

几分钟后,Kafka 和 Zookeeper 的 pod 将变得可用并准备就绪:

OutputNAME                   PODS   READY PODS   CURRENT PODS   AGE
...
my-cluster-kafka       1      1            1              28s
my-cluster-zookeeper   1      1            1              61s

要列出 Kafka 部署,请运行以下命令:

kubectl get kafka

输出将如下所示:

Output
NAME         DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS   READY   METADATA STATE   WARNINGS
my-cluster   1                        1

现在 Kafka 正在运行,下面我们在其中创建一个主题。打开一个名为 kafka-topic.yaml 的文件进行编辑:

nano kafka-topic.yaml

添加以下内容:

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
  name: my-topic
  labels:
    strimzi.io/cluster: "my-cluster"
spec:
  partitions: 1
  replicas: 1

这个 KafkaTopic 定义了一个名为 my-topic 的主题,在你刚刚部署的集群(my-cluster)中。

保存并关闭文件,然后通过运行以下命令应用它:

kubectl apply -f kafka-topic.yaml

输出将如下所示:

Output

kafkatopic.kafka.strimzi.io/my-topic created

然后,列出集群中的所有 Kafka 主题:

kubectl get kafkatopic

kubectl 输出将如下所示:

Output
NAME       CLUSTER      PARTITIONS   REPLICATION FACTOR   READY
my-topic   my-cluster   1            1                    True

在这一步中,你已经通过Strimzi将Kafka部署到您的Kubernetes集群中,Strimzi负责管理实际资源和ZooKeeper实例。您还创建了一个主题,您将在下一步连接Kafka时使用它。

步骤4 - 在Kubernetes中连接到Kafka

在这一部分,你将学习如何从Kubernetes集群内部连接到部署在Kubernetes上的Kafka集群。

多亏了Strimzi,你的Kafka部署已经可以供集群内的pods访问。集群内的任何应用都可以连接到 my-cluster-kafka-bootstrap 端点,该端点会自动解析到 my-cluster 集群。

你现在将基于Strimzi提供的Docker镜像,向Kubernetes部署一个临时的pod。这个镜像包含了一个Kafka安装和一些shell脚本,用于生产和消费文本消息(kafka-console-producer.sh 和 kafka-console-consumer.sh)。

运行以下命令在集群内运行生产者脚本:

kubectl run kafka-producer -ti \
--image=quay.io/strimzi/kafka:0.40.0-kafka-3.7.0 --rm=true --restart=Never \
-- bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic

临时pod将被命名为kafka-producer,并将使用Strimzi项目的镜像。命令执行完后,它将被删除(--rm=true),并且不会重启,因为它是一次性任务。然后,您将传入运行kafka-console-producer.sh脚本的命令。如前所述,您将使用my-cluster-kafka-bootstrap作为服务器的指定符,以及my-topic作为主题名称。

输出将如下所示:

Output
If you don't see a command prompt, try pressing enter.
>

你可以输入任何文本消息并按 Enter 键发送到主题:

Output
If you don't see a command prompt, try pressing enter.
>Hello World!
>

要退出,请按 CTRL+C 并按 Enter 确认。然后,运行以下命令在集群内运行消费者脚本:

kubectl run kafka-consumer -ti \
--image=quay.io/strimzi/kafka:0.40.0-kafka-3.7.0 --rm=true --restart=Never \
-- bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic --from-beginning

你可能需要按 Enter 键以继续执行命令。输出将类似于如下这样:

Output
Hello World!
...

你已经学会了如何从集群内部连接到您的Kafka部署。现在,你将把Kafka暴露给外部世界。

步骤5 - 在Kubernetes外部暴露Kafka

在这一步中你将通过使用负载均衡器来向外部暴露你的Kafka部署。

Strimzi内置了为Kafka创建和配置负载均衡器的方法。通过运行以下命令来打开 kafka.yaml 文件进行编辑:

nano kafka.yaml

在 listeners 部分添加以下内容:

...
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
      - name: external
        port: 9094
        type: loadbalancer
        tls: false
...

高亮部分定义了一个新的监听器,类型为 loadbalancer,它将在端口 9094 接受不使用 TLS 加密的连接。

保存并关闭文件,然后通过运行以下命令应用新的配置文件:

kubectl apply -f kafka.yaml

输出将会是:

Output
kafka.kafka.strimzi.io/my-cluster configured

运行以下命令以观察其可用性:

kubectl get service my-cluster-kafka-external-bootstrap -w -o=jsonpath='{.status.loadBalancer.ingress[0].ip}{"\n"}'

当为Kafka提供前端流量的负载均衡器变得可用时,输出将是其IP地址。

作为先决条件的一部分,你已经下载并解压了最新的Kafka版本到您的机器。导航到该目录并运行控制台消费者,将your_lb_ip替换为前一个命令输出的IP地址:

bin/kafka-console-consumer.sh --bootstrap-server your_lb_ip:9094 --topic my-topic --from-beginning

你很快就会看到从主题中读取的消息,这意味着你已经成功连接了:

Output
Hello World!
...

要从你的集群中删除所有与Strimzi相关的资源(如Kafka部署和主题),运行以下命令:

kubectl delete $(kubectl get strimzi -o name)

总结

在本文中,你已经使用 Docker Compose 部署了 Kafka,并验证了你可以连接到它。你还学习了如何将 Strimzi 安装到你的 DigitalOcean Kubernetes 集群,并使用提供的清单部署了一个 Kafka 集群。

如果在 DigitalOcean Kubernetes 使用过程中遇到问题,或需要咨询DigitalOcean 云服务解决方案,可联系 DigitalOcean 中国区独家战略合作伙伴卓普云 AI Droplet

教程:点击访问DigitalOcean相关教程与博客

阅读原文:How To Deploy Kafka on Docker and DigitalOcean Kubernetes | DigitalOcean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/568331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习/复习30--结构体的声明/初始化/typedef改名/内存对齐大小计算

一、自定义数据类型 二、结构体 1.结构体的定义(与数组相对比) 2.结构体全局/局部变量的定义 3.typedef对结构体改名 4.匿名结构体类型的声明 注意事项1: 匿名后必须立即创建结构体变量 、 5.结构体与链表节点定义 注意事项1&…

Python基础07-高级列表推导式和Lambda函数

在Python中,列表推导式和Lambda函数是处理数据的强大工具。本文将介绍如何使用嵌套列表推导式、带有条件的列表推导式、多可迭代对象的列表推导式、Lambda函数、在列表推导式中使用Lambda函数、用于展平嵌套列表的列表推导式、对元素应用函数、使用Lambda函数与Map和…

Arena-Hard:开源高质量大模型评估基准

开发一个安全、准确的大模型评估基准通常需要包含三个重要内容:1)稳定识别模型的能力;2)反映真实世界使用情况中的人类偏好;3)经常更新以避免过拟合或测试集泄漏。 但传统的基准测试通常是静态的或闭源的&…

程序员缓解工作压力小技巧

文章目录 1. 规划时间和任务2. 学会放松和调节情绪3. 培养兴趣爱好4. 保持健康的生活方式总结 当面对程序员这样需要高度精神集中和持续创新的工作时,缓解工作压力是至关重要的。下面分享一些我个人的经验和方法,希望能对大家有所帮助: 1. 规…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇 日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐(AI写歌)的时候,你是不是有这样的困惑: &…

线性模型算法

简介 本文章介绍机器学习中的线性模型有关内容,我将尽可能做到详细得介绍线性模型的所有相关内容 前置 什么是回归 回归的就是整合+预测 回归处理的问题可以预测: 预测房价 销售额的预测 设定贷款额度 可以根据事物的相关特征预测出对…

模型部署的艺术:让深度学习模型跃入生产现实

模型部署的艺术:让深度学习模型跃入生产现实 1 引言 1.1 部署的意义:为何部署是项目成功的关键 在深度学习项目的生命周期中,模型的部署是其成败的关键之一。通常,一个模型从概念构思、数据收集、训练到优化,最终目的…

【UML建模】用例图

1 参与者 参与者的概念: 指系统以外的、需要使用系统或与系统交互的外部实体 可以分为:人、外部设备、外部系统 参与者的图形符号: 例 3.1 在一个银行业务系统中,可能会有以下参与者 客户 :在银行业务系统中办理…

详细分析MySQL中的distinct函数(附Demo)

目录 前言1. 基本知识2. 基础Demo3. 进阶Demo 前言 该函数主要用于去重,对于细节知识,此文详细补充说明 1. 基本知识 DISTINCT 是一种用于查询结果中去除重复行的关键字 在查询数据库时,可能会得到重复的结果行,但有时只需要这…

奇妙的探索——偶然发现的bug

今天想在腾讯招聘官网找几个前端的岗位投一下,最近自己也在找工作,结果简历还没有投出去,就发现了腾旭招聘官网的3个前端bug。 1.有时候鼠标hover还没有滑倒下拉选框的菜单上,就消失了,消失的太快了,根本点…

揭秘App广告变现,如何轻松赚取额外收入?

揭秘App广告变现,如何轻松赚取额外收入? 在移动互联网高速发展的今天,APP广告变现已经成为了众多开发者和公司的主要盈利方式。但是,如何让一个APP实现高效的广告变现呢?这是一门大学问,需要我们用心去揣摩…

聚观早报 | TCL召开电视新品发布会;OceanBase 4.3发布

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月22日消息 TCL召开电视新品发布会 OceanBase 4.3发布 科大讯飞推出耳背式助听器 F1联想中国大奖赛开赛 蔚来展…

个人博客建设必备:精选域名和主机的终极攻略

本文目录 🌏引言🌏域名的选择🌕域名的重要性品牌识别营销和宣传可访问性和易记性信任和权威感搜索引擎优化(SEO)未来的灵活性和扩展性保护品牌 🌕如何选择域名🌕工具与资源分享国内的主流域名注…

C++ 性能分析的实战指南(gperftools工具)[建议收藏]

文章目录 使用gperftools进行 C 性能分析的实战指南一、编译安装 gperftools1. 下载源代码:2. 编译和安装: 二、编写测试程序三、使用 gperftools 代码示例四、查看分析结果五、一份实际代码实例及实操1.代码实例2.操作命令3.结果分析根据上述数据&#…

我有一种不完美的完美主义,必须要有缺点,没有缺点就是不完美的

《程客有话说》是我们最新推出的一个访谈栏目,邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事,我们尝试建立一个程序员交流与学习的平台,也欢迎大家推荐朋友或自己来参加我们的节目,一起加油。 本期我们邀请的程…

App Inventor 2 如何预览PDF文档?

预览PDF文档的方式 你可以使用Activity启动器查看已存储在你的设备上的 pdf 文档,也可以使用Web客户端通过网址URL打开 pdf 文档。 App Inventor 2 可以使用 .pdf 扩展名从程序包资产中查看 pdf 文件,不再需要外部 pdf 查看器! 代码如下&a…

二进制,八进制,十六进制 开头的标识符号

1、引言 每个进制开头的标识符号容易忘,写篇小小博客,拯救一下俺的小脑袋瓜子。 2、进制开头标识符号

Ts类型体操详讲 之 extends infer (下)

目录 1、函数 (1)提取参数类型 (2)提取返回值类型 2、构造器 (1)提取构造器返回值 (2)提取构造器参数类型 3、索引类型 本章我们继续上节的内容继续,展示我们对ex…

干货教程【AI篇】| 文字生成视频工具图文详细使用教程及整合包下载

需要这个工具整合包的小伙伴可以关注一下文章底部公众号,回复关键词【wzsp】即可获取,双击即可使用无需本地部署。 使用教程 首先我们从链接下载到这个zip压缩文件: 然后我们解压之后进入文件夹,出现下面的界面: 我…

自然语言处理: 第二十八章大模型基底之llama3

项目地址: meta-llama/llama3: The official Meta Llama 3 GitHub site 前言 LLaMa系列一直是人们关注的焦点,Meta在4月18日发布了其最新大型语言模型 LLaMA 3。该模型将被集成到其虚拟助手Meta AI中。Meta自称8B和70B的LLaMA 3是当今 8B 和 70B 参数规模的最佳模…
最新文章