本来认为部署kafka很简单,没想到也折腾了2-3天,这水平没治了~

kafka从3.4.0版本之后,可以不依赖zookeeper直接使用KRaft模式部署,也就是说部署kafka可以不安装zookeeper直接部署。

在官网上没有找到如何使用yaml文件在k8s上部署,捣鼓了2-3天终于稳定部署了,把步骤记录下来以备后查。

yaml文件内容:

---
apiVersion: v1
kind: Service
metadata:name: kafka-hsnamespace: kafka
spec:clusterIP: Noneselector:app: kafkaports:- port: 9092targetPort: 9092name: kafka-server
---
apiVersion: v1
kind: Service
metadata:name: kafka-svcnamespace: kafka
spec:type: ClusterIPselector:app: kafkaports:- port: 9092targetPort: 9092name: server
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: kafkanamespace: kafkalabels:app: kafka
spec:serviceName: "kafka-hs" # 指向内部无头服务replicas: 3selector:matchLabels:app: kafkatemplate:metadata:labels:app: kafkaspec:initContainers:- name: create-data-dirimage: docker.m.daocloud.io/library/busybox:latestimagePullPolicy: IfNotPresentcommand: ['sh', '-c', 'mkdir -p /host-data/$(POD_NAME) && chmod 755 /host-data/$(POD_NAME) && chown -R 1000:1000 /host-data']env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.namevolumeMounts:- name: datamountPath: /host-datacontainers:- name: kafkaimage: docker.m.daocloud.io/apache/kafka:4.1.0imagePullPolicy: IfNotPresentports:- containerPort: 9092protocol: TCP- containerPort: 9093protocol: TCPsecurityContext:runAsUser: 1000runAsGroup: 1000env:- name: KAFKA_ENABLE_KRAFTvalue: "yes"- name: KAFKA_PROCESS_ROLESvalue: "broker,controller"  # 节点同时担任 broker 和 controller- name: KAFKA_NODE_IDvalueFrom:fieldRef:fieldPath: metadata.labels['apps.kubernetes.io/pod-index']- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: KAFKA_CONTROLLER_QUORUM_VOTERSvalue: "0@kafka-0.kafka-hs.kafka.svc.cluster.local:9093,1@kafka-1.kafka-hs.kafka.svc.cluster.local:9093,2@kafka-2.kafka-hs.kafka.svc.cluster.local:9093"- name: KAFKA_LISTENERSvalue: "PLAINTEXT://:9092,CONTROLLER://:9093"- name: KAFKA_ADVERTISED_LISTENERSvalue: "PLAINTEXT://$(POD_NAME).kafka-hs.kafka.svc.cluster.local:9092"- name: KAFKA_LOG_DIRSvalue: "/bitnami/kafka/log"- name: KAFKA_CLUSTER_IDvalue: "oUp8pYCCRTKwXIc8KiQ2Uw"- name: ALLOW_PLAINTEXT_LISTENERvalue: "yes"# 添加存储初始化命令command: ["sh", "-c"]args:- |# 首次启动时格式化存储目录# KAFKA_CLUSTER_ID="$(/opt/kafka/bin/kafka-storage.sh random-uuid)"if [ ! -f /bitnami/kafka/log ]; thenecho "创建log目录"mkdir -p /bitnami/kafka/logecho "初始化配置文件"sed -i 's/^log.dirs=.*//g' /opt/kafka/config/server.propertiessed -i 's/^node.id=.*/node.id=$(KAFKA_NODE_ID)/' /opt/kafka/config/server.propertiessed -i 's/localhost/$(POD_NAME).kafka-hs.kafka.svc.cluster.local/g' /opt/kafka/config/server.propertiesecho 'controller.quorum.voters=$(KAFKA_CONTROLLER_QUORUM_VOTERS)' >> /opt/kafka/config/server.propertiesecho 'log.dirs=$(KAFKA_LOG_DIRS)' >> /opt/kafka/config/server.propertiessleep 1echo "配置文件初始化完毕..."echo "cluster.id=$(KAFKA_CLUSTER_ID)" > /bitnami/kafka/cluster.idcat /opt/kafka/config/server.properties/opt/kafka/bin/kafka-storage.sh format \-c /opt/kafka/config/server.properties \-t $(KAFKA_CLUSTER_ID) \--no-initial-controllersecho "格式化log存储目录"fisleep 1            # 启动 Kafkaecho "启动 kafka"/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.propertiesvolumeMounts:- name: datamountPath: /bitnami/kafkasubPathExpr: $(POD_NAME)volumes:- name: datahostPath:path: /data/juicefs-mnt/kafkatype: DirectoryOrCreate

这里面有几个关键知识点是以前我所没有涉及的:

1. 通过metadata.labels['apps.kubernetes.io/pod-index']  可以获取使用statefulset部署pod的索引;

2. 在volumeMounts:
        - name: data
          mountPath: /bitnami/kafka
          subPathExpr: $(POD_NAME) 中,可以使用subPathExpr获取环境变量

3. kafka部署是先要进行格式化存储目录的,并且在部署过程中设置传入pod中的环境变量对初始化命令没有直接影响,必须通过更改配置文件server.properties来修改格式化过程。官网只提供了单机模式部署,初始化过程中的kafka-storage format 命令提供了三种模式:[--standalone |
                     --no-initial-controllers |
                     --initial-controllers INITIAL_CONTROLLERS] 其帮助文档如下:

usage: kafka-storage format [-h] --config CONFIG --cluster-id CLUSTER_ID[--add-scram ADD_SCRAM] [--ignore-formatted][--release-version RELEASE_VERSION][--feature FEATURE] [--standalone |--no-initial-controllers |--initial-controllers INITIAL_CONTROLLERS]optional arguments:-h, --help             show this help message and exit--config CONFIG, -c CONFIGThe Kafka configuration file to use.--cluster-id CLUSTER_ID, -t CLUSTER_IDThe cluster ID to use.--add-scram ADD_SCRAM, -S ADD_SCRAMA    SCRAM_CREDENTIAL     to     add     to    the__cluster_metadata log e.g.'SCRAM-SHA-256=[name=alice,password=alice-secret]''SCRAM-SHA-512=[name=alice,iterations=8192,salt="N3E=",saltedpassword="YCE="]'--ignore-formatted, -gWhen this option  is  passed,  the  format commandwill  skip  over   already  formatted  directoriesrather than failing.--release-version RELEASE_VERSION, -r RELEASE_VERSIONThe  release  version  to   use  for  the  initialfeature settings.  The  minimum  is  3.3-IV3;  thedefault is 4.1-IV1--feature FEATURE, -f FEATUREThe setting to  use  for  a  specific  feature, infeature=level   format.   For   example:   `kraft.version=1`.--standalone, -s       Used to initialize a  controller  as a single-nodedynamic quorum.--no-initial-controllers, -NUsed to  initialize  a  server  without  a dynamicquorum topology.--initial-controllers INITIAL_CONTROLLERS, -I INITIAL_CONTROLLERSUsed  to  initialize  a  server  with  a  specificdynamic quorum topology. The  argument is a comma-separated list of  id@hostname:port:directory. Thesame values must be used  to format all nodes. Forexample:0@example.com:8082:JEXY6aqzQY-32P5TStzaFg,1@example.com:8083:MvDxzVmcRsaTz33bUuRU6A,2@example.com:8084:07R5amHmR32VDA6jHkGbTA

你若用initial-controllers模式需要先转换directory.id 比较费劲,所以我选择了在部署过程中直接修改/opt/kafka/config/server.properties ,按照设置传递进来的环境变量修改配置文件后,再启动kafka就可以三节点稳定运行了。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在公用同一公网IP和端口的K8S环境中,不同域名实现不同访问需求的解决方案

目录 1. 访问需求 2. 解决方案 3. 具体配置 3.1 允许互联网访问的域名(a.lmzf.com) 3.2 需IP白名单访问的域名(b.lmzf.com) 3.3 关键参数说明 3.4 测试验证 1. 访问需求 在腾讯云TKE环境中,多个域名解析到同一…

FlinkCDC 达梦数据库实时同步

一、Flink部署 1.1、JAVA环境 vi /etc/profile export JAVA_HOME/data/flinkcdc/jdk1.8.0_181 export CLASSPATH$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH$JAVA_HOME/bin:$PATHsource /etc/profilevi ~/.bash_profileexport FLINK_HOME/data/flinkcdc/fli…

Eip开源主站EIPScanner在Linux上的调试记录(二 多生产者连接)

目录 一、背景 二、可行性验证 三、开发调试 一、背景 在一般场景下,只需一路IO连接,但稍微复杂的场景,就需要不同通讯周期的连接,这就需要有多组IO连接。 而大于一组的连接调试方法是一样的,因此主要解决2组连接的…

Oracle APEX 利用卡片实现翻转(方法二)

目录 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 1. 创建卡片区域 (Cards Region) 2. 定义卡片的 HTML 结构 3. 添加 CSS 实现样式和翻转动画 4. 创建动态操作触发翻转 5. 运行效果 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 目标如…

低代码拖拽实现与bpmn-js详解

低代码平台中的可视化拖拽功能是其核心魅力所在,它让构建应用变得像搭积木一样直观。下面我将为你梳理其实现原理,并详细介绍 vue-draggable 这个常用工具。 🧱 一、核心架构:三大区域与数据驱动 低代码编辑器界面通常分为三个核心…

【科研绘图系列】R语言绘制模型预测与数据可视化

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 加载R包 数据下载 函数 导入数据 数据预处理 画图 总结 系统信息 介绍 本文介绍了一种利用R语言进行海洋微生物群落动态分析的方法,该方法通过构建多个统计模型来预测不同环境…

TODO的面试(dw三面、sqb二面、ks二面)

得物的前端三面(通常是技术终面)会深入考察你的技术深度、项目经验、解决问题的思路以及职业素养。下面我结合搜索结果,为你梳理一份得物前端三面的常问问题及详解,希望能助你一臂之力。 🧠 得物前端三面常问问题及详解…

开发 PHP 扩展新途径 通过 FrankenPHP 用 Go 语言编写 PHP 扩展

通过 FrankenPHP 用 Go 语言编写 PHP 扩展 在 PHPVerse 2025 大会上(JetBrains 为纪念 PHP 语言 30 周年而组织的会议),FrankenPHP 开发者 Kvin Dunglas 做了一个开创性的宣布:通过 FrankenPHP,可以使用 Go 语言创建 …

完美解决:应用版本更新,增加字段导致 Redis 旧数据反序列化报错

完美解决:应用版本更新,增加字段导致 Redis 旧数据反序列化报错 前言 在敏捷开发和快速迭代的今天,我们经常需要为现有的业务模型增加新的字段。但一个看似简单的操作,却可能给正在稳定运行的系统埋下“地雷”。 一个典型的场景是…

66-python中的文件操作

1. 文件的编码 UTF-8 GBK GB2312 Big5 GB18030 2. 文件读取 文件操作步骤: 打开文件 读\写文件 关闭文件 open(name,mode,encoding) name:文件名字符串 “D:/haha.txt” mode: 只读、写入、追加 r:以只读方式打开 w: 只用于写 a :用于追加 encoding:编码方式 # -*- coding: utf…

FPGA实例源代码集锦:27个实战项目

本文还有配套的精品资源,点击获取 简介:FPGA是一种可编程逻辑器件,允许用户根据需求配置硬件功能。本压缩包提供27个不同的FPGA应用实例源代码,旨在帮助初学者深入学习FPGA设计,并为专业工程师提供灵感。内容涵盖了…

基于 Vue+Mapbox 的智慧矿山可视化功能的技术拆解

01、项目背景 在全球矿业加速向 “高端化、智能化、绿色化” 转型的浪潮下,传统矿业面临的深地开采难题、效率瓶颈与安全隐患日益凸显。 在矿业转型的迫切需求与政策、技术支撑的背景下依托 GIS 技术,开展了 “中国智矿” GIS 开发项目,旨在…

进程状态(Linux)

进程状态Linux进程状态Linux进程状态进程描述R运行状态S睡眠状态D磁盘休眠状态T停止状态t被追踪状态(调试状态)X死亡状态Z僵死状态其实大致也就可以分为三种运行,阻塞,挂起。运行状态每个cpu里都有一个运行队列,进程在运行队列里,…

物联网领域中PHP框架的最佳选择有哪些?

物联网(IoT)作为近年来快速发展的技术领域,已经渗透到智能家居、工业自动化、智慧城市等方方面面。作为Web开发中广泛使用的语言,PHP凭借其易学易用、开发效率高和生态丰富的特点,也在物联网领域找到了用武之地。 本文…

java反射(详细教程)

我们平常创建类的实例并调用类中成员需要建立在一个前提下,就是已经知道类名和类中成员的信息,灵活性大大降低。甚至在一些项目中还需要修改源码来满足使用条件,大大降低了操作的灵活性。Java 反射(Reflection)是 Java…

消息队列-初识kafka

优缺点 消息队列的优点: 实现系统解耦: :::color5 系统解耦解释 有 MQ 时是 “服务 A 发消息到队列,其他服务从队列拿消息,新增服务接队列就行”;无 MQ 时是 “服务 A 直接调其他服务的接口 / 依赖,新增 / …

实践《数字图像处理》之Canny边缘检测、霍夫变换与主动二值化处理在短线段清除应用中的实践

在最近的图像处理项目中,其中一个环节:图片中大量短线(不是噪声),需要在下一步处理前进行清除。在确定具体实现时,碰到了Canny边缘检测、霍夫变换与主动二值化处理的辩证使用,相关逻辑从图片灰度…

vue3与ue5通信-工具类

工具 ue5-simple.js /*** UE5 通信工具* 两个核心方法:发送消息和接收消息*/// 确保全局对象存在 if (typeof window ! undefined) {window.ue window.ue || {};window.ue.interface window.ue.interface || {}; }/*** 生成 UUID*/ function generateUUID() {retu…

在kotlin中如何使用像java中的static

在 Kotlin 中,没有直接的 static 关键字,但有几种等效的方式来实现 Java 中静态成员的功能: 1. 伴生对象 (Companion Object) - 最常用 class MyClass {companion object {// 静态常量const val STATIC_CONSTANT "constant value"…

如何在 Spring Boot 中指定不同的配置文件?

介绍 Spring Boot 提供了多种方式来管理和加载配置文件,特别是在多环境配置下,比如开发、测试和生产环境。通过指定不同的配置文件,可以灵活地调整应用程序的行为,以适应不同的需求。本文将介绍在 Spring Boot 中如何指定使用不同…