外部访问K8S集群内部的kafka集群服务
不许转载
kafka 部署
把 kafka 部署到 k8s 后,我们肯定是通过 service 从 k8s 外部访问 kafaka。这里的 service 要么是 NodePort, 要么是 LoadBalancer 类型。我们使用的方式是 LoadBalancer。
我们先看下面这张图,这是 kafka 在集群中的网络拓扑。当我们通过地址 12.345.67:31090 访问到 kafka 后,kafka 返回的访问地址是类似这样的 endpoint jettopro-kafka.jettopro-poc.svc.cluster.local:9092。这是 k8s 集群内部能访问的 headless service endpoint 地址,从集群外部自然使用这个地址是访问不通的。

所以,我们需要解决两个问题:
- kafka 不同的 pod 需要不通的对外能访问的地址
- 不能使用 kafka 默认的
advertised.listeners
解决方案
问题1,我们为每个 pod 创建类型是 LoadBalancer 的 service 并且监听不同的端口。这样通过 LB IP + port 就能找到特定的 kafka broker。
service 示例如下:
apiVersion: v1
kind: Service
metadata:name: kafka-{index}
spec:externalTrafficPolicy: Localtype: LoadBalancerselector:statefulset.kubernetes.io/pod-name: kafka-{index}ports:- protocol: TCPport: {9092+index}targetPort: 9092
这里如果不是云主机,也可以使用NodePort类型来暴露kafka服务。
问题2,我们在容器启动的时候,执行脚本动态获取 pod 编号,生成容器需要的环境变量 KAFKA_CFG_ADVERTISED_LISTENERS(对应 kafka broker 的配置 advertised.listener)
HOSTNAME=`hostname -s`
if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; thenORD=${BASH_REMATCH[2]}PORT=$((ORD + 9092))#12.345.67.8 是 LB 的 ipexport KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://12.345.67.8:$PORT"
elseecho "Failed to get index from hostname $HOST"exit 1
fi
apiVersion: apps/v1
kind: StatefulSet
metadata:name: kafka
spec:selector:matchLabels:app: kafkaserviceName: kafkareplicas: 3updateStrategy:type: RollingUpdatepodManagementPolicy: OrderedReadytemplate:metadata:labels:app: kafkaspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- kafkatopologyKey: "kubernetes.io/hostname"containers:- name: kafkacommand:- bash- -ec- |HOSTNAME=`hostname -s`if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; thenORD=${BASH_REMATCH[2]}PORT=$((ORD + 9092))export KAFKA_CFG_ADVERTISED_LISTENERS="PLAINTEXT://12.345.67.8:$PORT"elseecho "Failed to get index from hostname $HOST"exit 1fiexec /entrypoint.sh /run.shimagePullPolicy: Alwaysimage: "bitnami/kafka:2"env:- name: ALLOW_PLAINTEXT_LISTENERvalue: "yes"- name: KAFKA_CFG_ZOOKEEPER_CONNECTvalue: "zookeeper-0.zookeeper-hs:2181,zookeeper-1.zookeeper-hs:2181,zookeeper-2.zookeeper-hs:2181"- name: KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTORvalue: "3"- name: KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISRvalue: "3"- name: KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTORvalue: "3"ports:- containerPort: 9092volumeMounts:- name: kafka-datamountPath: /bitnamisecurityContext:runAsUser: 1000fsGroup: 1000volumeClaimTemplates:- metadata:name: kafka-dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: alicloud-disk-efficiencyresources:requests:storage: 20Gi
相关文章:
外部访问K8S集群内部的kafka集群服务
不许转载 kafka 部署 把 kafka 部署到 k8s 后,我们肯定是通过 service 从 k8s 外部访问 kafaka。这里的 service 要么是 NodePort, 要么是 LoadBalancer 类型。我们使用的方式是 LoadBalancer。 我们先看下面这张图,这是 kafka 在集群中的网…...
AttributeError: module ‘tensorflow‘ has no attribute ‘contrib‘解决办法
在TensorFlow2环境下执行1.X版本的代码时报错: AttributeError: module ‘tensorflow‘ has no attribute ‘contrib‘ 当然第一时间想到的是利用 如下代码 来解决问题(大部分情况都是这样), tf.compat.v1但是又出现以下报错 Att…...
物奇平台耳机恢复出厂设置功能实现
是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙音频,DSP音频项目核心开发资料, 物奇平台耳机恢复出厂设置功能实现 一 需求 1 耳机接收到充电盒长按12S指令后触发, 2 接收到…...
RFID携手制造业升级,为锂电池生产带来前所未有的可靠性
应用背景 随着科技的发展和全球化的推进,产品的生产过程越来越复杂,且对品质的要求也越来越高。在锂电池生产领域,由于其高能量密度、长寿命和环保特性,已被广泛应用于电动汽车、储能系统等领域。然而,锂电池的安全性和…...
【星海出品】flask (四) 三方工具使用
学习的灵魂是公社,学习的目标是人民自治.学习是非暴力革命方式的社会改革.学习是人民对抗资本剥夺的文明方式.学习失败了,就如同巴黎公社失败了一样.但是它为今后进行成功的社会改革指明了正确的方向.学习的逻辑并不复杂,一句话,必须让知识数量与知识价值基本吻合.管理学习也不…...
MongoDB 索引
类似关系型数据库,mongodb也建立自己的一套索引机制和查询优化方法。本文简单介绍mongodb的索引。后续文章讲详细介绍索引的操作,监控和查询优化方法等。 索引 索引,是一组按照特殊结构排列的,方便检索的数据。索引中保存了集合…...
[Hive] INSERT OVERWRITE DIRECTORY要注意的问题
在使用Hive的INSERT OVERWRITE语句时,需要注意以下问题: 数据覆盖:INSERT OVERWRITE语句会覆盖目标目录中的数据。因此,在执行该语句之前,请确保目标目录为空或者你希望覆盖的数据已经不再需要。数据格式:…...
刚柔相济铸伟业 ——访湖南顺新金属制品科技有限公司董事长张顺新
时代在变,唯初心不改。 精致、谦虚、谨慎、儒雅、温和——他就是张顺新,湖南顺新金属制品科技有限公司、湖南顺新供应链管理有限公司董事长,民建长沙市委常委,民建湖南省环资委副主任,省、市民建企联会常务副会长&…...
DHorse(K8S的CICD平台)的实现原理
综述 首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里。 在微服务、DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情。虽然市面上目前已经存在了比较成熟的自动化构建工具,比如…...
类图复习:类图简单介绍
入职新公司在看新项目的代码,所以借助类图梳理各个类之间的关系,奈何知识已经还给了老师,不得不重新学习下类图的相关知识,此处将相关内容记录下方便后续使用。 文章目录 类图语法类与类的关系画类图 类图语法 语法描述public-pr…...
【字符串】【双指针翻转字符串+快慢指针】Leetcode 151 反转字符串中单词【好】
【字符串】【双指针翻转字符串快慢指针】Leetcode 151 反转字符串中单词 解法1 双指针翻转字符串快慢指针更新数组大小 ---------------🎈🎈题目链接🎈🎈------------------- ---------------🎈🎈解答链接…...
3D Gaussian Splatting:用于实时的辐射场渲染
Kerbl B, Kopanas G, Leimkhler T, et al. 3d gaussian splatting for real-time radiance field rendering[J]. ACM Transactions on Graphics (ToG), 2023, 42(4): 1-14. 3D Gaussian Splatting 是 Siggraph 2023 的 Best Paper,法国团队在会议上展示了其实现的最…...
【nlp】文本处理的基本方法
文本处理的基本方法 1 什么是分词2 什么是命名实体识别3 什么是词性标准1 什么是分词 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形…...
C++17 std::filesystem
std::filesystem 是 C17 标准引入的文件系统库,提供了一套用于处理文件和目录的 API。它主要包括以下几个核心类: std::filesystem::path:用于表示文件系统路径。它提供了一系列方法,允许你对路径进行各种操作,如拼接…...
JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)
1. jinfo (base) PS C:\Users\zishi\Desktop> jinfo Usage:jinfo <option> <pid>(to connect to a running process)where <option> is one of:-flag <name> to print the value of the named VM flag #输出对应名称的参数-flag [|-]<n…...
[深度学习]不平衡样本的loss
不平衡样本的loss ”softmax“、”weighted softmax“、”focal“、”class-balanced“ 和 ”balanced softmax“ 都是用于多类分类任务的损失函数。它们之间的区别在于如何处理类别不均衡的问题。 Softmax 是常用的多类分类损失函数。它将输出分布转换为概率分布,…...
【MySQL】表的增删改查(强化)
作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《MySQL》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&a…...
MyBatis-Plus--在xml中使用wrapper的方法
原文网址:MyBatis-Plus--在xml中使用wrapper的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MyBatis-Plus如何在xml中使用wrapper。 Service QueryWrapper<T> wrapper new QueryWrapper<T>(); wrapper.eq("r.room_id", vo.getRoomId())…...
Oracle RAC是啥?
Oracle RAC,全称是Oracle Real Application Cluster,翻译过来为Oracle真正的应用集群,它是Oracle提供的一个并行集群系统,由 Oracle Clusterware(集群就绪软件) 和 Real Application Cluster(RA…...
springboot中定时任务cron不生效,fixedRate指定间隔失效,只执行一次的问题
在调试计算任务的时候,手动重置任务为初始状态,但是并没有重新开始计算,检查定时任务代码: 从Scheduled(fixedRate 120000)可以看到,应该是间隔120秒执行一次该定时任务,查看后台日志,并没有重…...
深入浅出:从硬件原理图到DTS节点,图解RK3588外挂WiFi/蓝牙模块的驱动适配流程
从电路图到内核配置:RK3588外设驱动的硬件映射实战 当我们拿到一块RK3588开发板时,那些密密麻麻的电路图符号和内核中的设备树配置之间,到底存在着怎样的联系?这个问题困扰着许多从软件转向硬件开发的工程师。本文将以WiFi/蓝牙模…...
Hypnos-i1-8B惊艳效果:抽象代数概念解释+具体群论实例生成
Hypnos-i1-8B惊艳效果:抽象代数概念解释具体群论实例生成 1. 模型能力概览 Hypnos-i1-8B是一款基于量子噪声注入训练的8B参数开源大模型,专注于复杂逻辑推理和数学问题求解。该模型在抽象代数、群论等高等数学领域展现出令人惊艳的理解和生成能力。 1…...
多摩川编码器通信避坑指南:STM32 RS485接线、供电不稳、通信失败的排查与修复
多摩川编码器与STM32的RS485通信实战:从硬件设计到故障排查的完整指南 当你在深夜的实验室里盯着示波器上杂乱的波形,反复检查代码却依然无法与多摩川编码器建立通信时,那种挫败感每个嵌入式工程师都深有体会。RS485通信看似简单,…...
JetBrains IDE试用期重置终极指南:2026年最简30天重置方案
JetBrains IDE试用期重置终极指南:2026年最简30天重置方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 对于每一位JetBrains IDE开发者来说,试用期到期是常见困扰。无论是IntelliJ IDEA…...
从MATLAB到Vivado:Xilinx FIR滤波器IP核的端到端设计验证
1. 从MATLAB滤波器设计到COE文件生成 FIR滤波器的硬件实现通常始于算法设计阶段,而MATLAB的Filter Designer工具正是这个过程的理想起点。我最近在做一个音频信号处理项目时,就遇到了需要滤除10MHz高频噪声同时保留5kHz有用信号的需求。下面分享我的完整…...
BililiveRecorder录播引擎深度解析:3大核心架构与5项企业级部署策略
BililiveRecorder录播引擎深度解析:3大核心架构与5项企业级部署策略 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder BililiveRecorder作为一款专注于B站直播录制的开源工具…...
如何快速掌握NDS游戏文件解析:面向初学者的完整Tinke使用指南
如何快速掌握NDS游戏文件解析:面向初学者的完整Tinke使用指南 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke Tinke是一款功能强大的NDS游戏文件解析工具,专为任天堂DS游戏…...
Reference Extractor:如何从已丢失的文档中找回宝贵参考文献?
Reference Extractor:如何从已丢失的文档中找回宝贵参考文献? 【免费下载链接】ref-extractor Reference Extractor - Extract Zotero/Mendeley references from Microsoft Word files 项目地址: https://gitcode.com/gh_mirrors/re/ref-extractor …...
real-anime-z在跨媒体叙事中的应用:小说文本→角色图→分镜图→动态预告片链路
real-anime-z在跨媒体叙事中的应用:小说文本→角色图→分镜图→动态预告片链路 1. 跨媒体叙事的新工具 在内容创作领域,跨媒体叙事正变得越来越重要。从小说文本到视觉呈现,再到动态视频的完整创作链路,能够帮助创作者将想法快速…...
避坑指南:ESP32 MicroPython读写SD卡,为什么你的代码总报错?
ESP32 MicroPython SD卡读写避坑实战:从报错到稳定运行的深度解析 当你在ESP32上尝试用MicroPython操作SD卡时,是否遇到过这些令人抓狂的场景?明明按照教程连接了硬件,代码却抛出OSError: no SD card;或者文件系统挂载…...
