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
相关推荐
陌言不会python34 分钟前
谷粒微服务高级篇学习笔记整理---thymeleaf
笔记·学习·微服务
Y1nhl3 小时前
Pyspark学习一:概述
数据库·人工智能·深度学习·学习·spark·pyspark·大数据技术
GodGump3 小时前
dbgpt7.0 docker部署
运维·docker·容器
能来帮帮蒟蒻吗3 小时前
Go语言学习(15)结构体标签与反射机制
开发语言·笔记·学习·golang
Aphelios3806 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
日暮南城故里6 小时前
Java学习------源码解析之StringBuilder
java·开发语言·学习·源码
安全方案9 小时前
精心整理-2024最新网络安全-信息安全全套资料(学习路线、教程笔记、工具软件、面试文档).zip
笔记·学习·web安全
士别三日&&当刮目相看9 小时前
JAVA学习*Object类
java·开发语言·学习
序属秋秋秋10 小时前
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
c语言·c++·学习·算法
爱吃馒头爱吃鱼10 小时前
QML编程中的性能优化二
开发语言·qt·学习·性能优化