k8s学习--k8s集群部署kafka详细过程

文章目录


前言

kafka简介

kafka是什么

Kafka 是一个由 Apache 软件基金会开发的分布式流处理平台,主要用于实时数据流的处理和传输。它最初由 LinkedIn 开发,并于 2011 年开源。

kafka主要特点

1高吞吐量: Kafka 能够处理大量的数据流,适用于需要高吞吐量的场景。

2.分布式: Kafka 具有分布式架构,能够在多个节点上运行,提供高可用性和容错性。

3.持久化: Kafka 使用磁盘存储消息,确保数据的持久性。

4.高可靠性: 通过复制机制,Kafka 可以在节点故障时保持数据的完整性。

5可扩展性: Kafka 可以通过增加节点来轻松扩展其处理能力。

kafka主要组件

1.Producer(生产者): 负责将数据发布到 Kafka 的 topic 中。

2.Consumer(消费者): 负责从 Kafka 的 topic 中读取数据。

3.Broker(代理): Kafka 集群中的每个节点称为 broker,负责存储和转发数据。

4.Topic(主题): 消息的分类和组织单元,每个 topic 可以分成多个 partition(分区),每个分区存储部分数据。

5.Zookeeper: Kafka 使用 Zookeeper 进行分布式协调和管理集群状态。

kafka使用场景

**1.日志聚合:**集中收集和管理应用程序的日志。

**2.实时数据流处理:**用于实时分析和处理数据流。

**3.事件源驱动架构:**支持事件源驱动的应用程序架构。

**4.消息队列:**作为高吞吐量的消息队列系统,用于跨系统的数据传输。

kafka工作流程

1.生产者 将消息发送到指定的 topic。

2.Broker 接收到消息后,将其存储在磁盘上,并按照 topic 和 partition 进行组织。

3.消费者 从指定的 topic 和 partition 中读取消息。

小结

Kafka 的高吞吐量、低延迟、高可用性和扩展性使其成为处理大规模数据流的理想选择,广泛应用于数据管道、实时分析、日志聚合等领域。

k8s集群部署kafka

环境

虚拟机

Ip 主机名 cpu 内存 硬盘
192.168.10.11 master01 2cpu双核 4G 100G
192.168.10.12 worker01 2cpu双核 4G 100G
192.168.10.13 worker02 2cpu双核 4G 100G
192.168.10.18 nfs 1cpu一核 2G 40G

版本 centos7.9

已部署k8s-1.27

需要做的前置配置

storageclass

详情请看

链接: k8s练习--StorageClass详细解释与应用

区别仅有ip不一致,按本次ip来

本章不再过多叙述

kafka部署过程

master配置

编写yaml文件

vim kafka.yaml
\ 复制代码
apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
  labels:
    app: kafka-app
spec:
  clusterIP: None
  ports:
    - name: '9092'
      port: 9092
      protocol: TCP
      targetPort: 9092
  selector:
    app: kafka-app
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka
  labels:
    app: kafka-app
spec:
  serviceName: kafka-svc
  replicas: 3
  selector:
    matchLabels:
      app: kafka-app
  template:
    metadata:
      labels:
        app: kafka-app
    spec:
      containers:
        - name: kafka-container
          image: doughgle/kafka-kraft
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9092
            - containerPort: 9093
          env:
            - name: REPLICAS
              value: '3'
            - name: SERVICE
              value: kafka-svc
            - name: NAMESPACE
              value: default
            - name: SHARE_DIR
              value: /mnt/kafka
            - name: CLUSTER_ID
              value: oh-sxaDRTcyAr6pFRbXyzA
            - name: DEFAULT_REPLICATION_FACTOR
              value: '3'
            - name: DEFAULT_MIN_INSYNC_REPLICAS
              value: '2'
          volumeMounts:
            - name: data
              mountPath: /mnt/kafka
            - name: localtime
              mountPath: /etc/localtime
      volumes:
      - name: localtime
        hostPath:
          path: /etc/localtime
          type: ''

  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
          - "ReadWriteOnce"
        storageClassName: nfs-client
        resources:
          requests:
            storage: "1Gi"

yaml文件拆分解释

这个 YAML 文件定义了一个 Kafka 服务和一个有状态集合 (StatefulSet)。以下是对每个部分的解释:
service部分

\ 复制代码
apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
  labels:
    app: kafka-app
spec:
  clusterIP: None
  ports:
    - name: '9092'
      port: 9092
      protocol: TCP
      targetPort: 9092
  selector:
    app: kafka-app

解释

apiVersion: v1: 指定 API 版本。

kind: Service: 资源类型为服务 (Service)。

metadata: 元数据,包括名称和标签。

name: kafka-svc: 服务的名称。

labels: 服务的标签,用于标识和选择服务。

app: kafka-app: 应用标签。

spec: 服务的规格。

clusterIP: None: 指定服务为无头服务(Headless Service),没有单一的 ClusterIP。

ports: 服务暴露的端口。

name: '9092': 端口名称。

port: 9092: 服务端口号。

protocol: TCP: 协议为 TCP。

targetPort: 9092: 目标容器的端口号。

selector: 服务选择器,用于选择匹配的 Pod。

app: kafka-app: 应用标签。

StatefulSet部分

\ 复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka
  labels:
    app: kafka-app
spec:
  serviceName: kafka-svc
  replicas: 3
  selector:
    matchLabels:
      app: kafka-app
  template:
    metadata:
      labels:
        app: kafka-app
    spec:
      containers:
        - name: kafka-container
          image: doughgle/kafka-kraft
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9092
            - containerPort: 9093
          env:
            - name: REPLICAS
              value: '3'
            - name: SERVICE
              value: kafka-svc
            - name: NAMESPACE
              value: default
            - name: SHARE_DIR
              value: /mnt/kafka
            - name: CLUSTER_ID
              value: oh-sxaDRTcyAr6pFRbXyzA
            - name: DEFAULT_REPLICATION_FACTOR
              value: '3'
            - name: DEFAULT_MIN_INSYNC_REPLICAS
              value: '2'
          volumeMounts:
            - name: data
              mountPath: /mnt/kafka
            - name: localtime
              mountPath: /etc/localtime
      volumes:
      - name: localtime
        hostPath:
          path: /etc/localtime
          type: ''
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
          - "ReadWriteOnce"
        storageClassName: nfs-client
        resources:
          requests:
            storage: "1Gi"

解释

apiVersion: apps/v1: 指定 API 版本。

kind: StatefulSet: 资源类型为有状态集合 (StatefulSet)。

metadata: 元数据,包括名称和标签。

name: kafka: StatefulSet 的名称。

labels: StatefulSet 的标签。

app: kafka-app: 应用标签。

spec: StatefulSet 的规格。

serviceName: kafka-svc: 关联的服务名称。

replicas: 3: 副本数。

selector: 选择器,用于选择匹配的 Pod。

matchLabels:

app: kafka-app: 应用标签。

template: Pod 模板定义。

metadata: 模板的元数据,包括标签。

labels:

app: kafka-app: 应用标签。

spec: Pod 的规格。

containers: 容器定义。

name: kafka-container: 容器名称。

image: doughgle/kafka-kraft: 使用的镜像。

imagePullPolicy: IfNotPresent: 拉取镜像策略。

ports: 容器暴露的端口。

containerPort: 9092

containerPort: 9093

env: 环境变量。

REPLICAS: 副本数量。

SERVICE: 服务名称。

NAMESPACE: 命名空间。

SHARE_DIR: 共享目录。

CLUSTER_ID: 集群 ID。

DEFAULT_REPLICATION_FACTOR: 默认副本因子。

DEFAULT_MIN_INSYNC_REPLICAS: 默认最小同步副本数。

volumeMounts: 挂载卷。

name: data: 挂载的卷名称。

mountPath: /mnt/kafka: 挂载路径。

name: localtime: 挂载的本地时间卷。

mountPath: /etc/localtime: 挂载路径。

volumes: 卷定义。

name: localtime: 卷名称。

hostPath:

path: /etc/localtime: 主机路径。

type: '': 类型为空。

volumeClaimTemplates: 卷声明模板。

metadata: 元数据,包括名称。

name: data: 卷名称。

spec: 卷规格。

accessModes:

"ReadWriteOnce": 访问模式。

storageClassName: nfs-client: 存储类名称。

resources: 资源请求。

requests:

storage: "1Gi": 存储请求大小。

这个定义确保了 Kafka 集群的高可用性和持久化存储,通过 StatefulSet 管理 Kafka 实例,并使用无头服务来保证每个实例都有一个固定的网络标识。

应用yaml文件

kubectl apply -f kafka.yaml

下载需要vpn

速度较慢,耐心等待

查看service

kubectl get svc

kafka应用测试

创建客户端pod

kubectl run kafka-client --rm -it --image bitnami/kafka:3.1.0 -- bash

过程较慢,稍等

报错

等半分钟,重试即可

查看默认存在的topic(Topic,即消息主题。)

 kafka-topics.sh --list --bootstrap-server kafka-svc.default.svc.cluster.local:9092

创建topic

kafka-topics.sh --bootstrap-server kafka-svc.default.svc.cluster.local:9092 --topic test01 --create --partitions 3 --replication-factor 2
kafka-topics.sh --list --bootstrap-server kafka-svc.default.svc.cluster.local:9092

创建数据生产者,添加数据

kafka-console-producer.sh --topic test1 --request-required-acks all --bootstrap-server kafka-svc.default.svc.cluster.local:9092
hello world

ctrl +c 退出

在当前终端或另一个终端中创建数据消费者,消费数据

 kafka-console-consumer.sh --topic test1 --from-beginning --bootstrap-server kafka-svc.default.svc.cluster.local:9092

查看默认test topic相关描述信息

kafka-topics.sh --describe --topic test1 --bootstrap-server kafka-svc.default.svc.cluster.local:9092

查看test01 topic相关描述信息

kafka-topics.sh --describe --topic test01  --bootstrap-server kafka-svc.default.svc.cluster.local:9092
相关推荐
码上有前21 分钟前
解析后端框架学习:从单体应用到微服务架构的进阶之路
学习·微服务·架构
岳不谢1 小时前
VPN技术-VPN简介学习笔记
网络·笔记·学习·华为
海害嗨1 小时前
阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!
学习·开源
一名路过的小码农2 小时前
ceph 18.2.4二次开发,docker镜像制作
ceph·docker·容器
AI_小站2 小时前
RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答
人工智能·程序人生·langchain·kubernetes·llama·知识库·rag
小A1592 小时前
STM32完全学习——使用SysTick精确延时(阻塞式)
stm32·嵌入式硬件·学习
天冬忘忧2 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
小A1592 小时前
STM32完全学习——使用标准库点亮LED
stm32·嵌入式硬件·学习
朝九晚五ฺ3 小时前
【Linux探索学习】第十五弹——环境变量:深入解析操作系统中的进程环境变量
linux·运维·学习
心怀梦想的咸鱼3 小时前
UE5 第一人称射击项目学习(二)
学习·ue5