k8s部署kafka三節點集群

本來認為部署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 中如何指定使用不同…