k8s部署Kafka集群

1.1、Kafka (消息队列)

是一个分布式消息中间件, 支持分区的、多副本的、多订阅者的、基于 zookeeper 协调的分布式消息系统。通俗来说: kafka 就是一个存储系统,存储的数据形式为 “消息";

1.2、常用的消息系统有哪些以及各自的特点

有 activemq ,rabbitmq, rocketmq, kafka

1.3、为什么使用消息队列

1)、提高扩展性:因为消息队列解耦了处理过程,有新增需求时只要另外增加处理过程即可。
2)、提高峰值处理能力:在访问量剧增的情况下,应用仍然需要继续发挥作用。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷请求而完全崩溃;
3)、提高系统的可恢复性:消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统回复后被处理

1.4、kafka设计的目的

(1) 高吞吐率 在廉价的商用机器上单机可支持每秒100万条消息的读写
(2) 消息持久化 所有消息均被持久化到磁盘(kafka支持多个节点之间的消息复制),无消息丢失,支持消息重放
(3) 完全分布式 Producer,Broker,Consumer均支持水平扩展
(4) 同时适应在线流处理(storm、spark streaming)和离线批处理(hadoop、hive、hdfs)
将kafka的数据导入hadoop的方式:使用flume的kafka-source取出kafka的数据,再使用flume的hdfs-sink或者hive-sink将数据导入hdfs,或者导入hive做离线批处理

1.5、kafka 的使用场景

1)、主要用于数据处理系统中的缓冲!(尤其是实时流式数据处理)
2)、日志收集:可以用 kafka 可以收集各种服务的 log,通过 kafka 以统一接口服务的方式开放给各种 consumer,例如 hadoop、HBase、Solr 等。
3)、消息系统:解耦和生产者和消费者、缓存消息等。
4)、用户活动跟踪:kafka 经常被用来记录 web 用户或者 app 用户的各种活动
5)、来做实时的监控分析,或者装载到 hadoop、数据仓库中做离线分析和挖掘。
6)、运营指标:kafka经常用来记录运维监控数据。包括收集各种分布式应用的数据,各种操作的集中反馈,比如报警和报告。
7)、流式数据处理:比如 spark streaming 和 Flink

2.1、install Helm 部署 Zookeeper 集群

# 添加bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 查询chart
helm search repo bitnami
# 拉取zookeeper
helm pull bitnami/zookeeper
# 解压
tar zxvf  zookeeper-13.4.3.tgz 
#进入Zookeeper
cd zookeeper
2.2、修改参数,对 zookeeper 进行时区、持久化存储、副本数等配置
extraEnvVars: 
  - name: TZ
    value: "Asia/Shanghai"
# 允许任意用户连接(默认开启)
allowAnonymousLogin: true
---
# 关闭认证(默认关闭)
auth:
  enable: false 
---
# 修改副本数
replicaCount: 3 
---
# 4. 配置持久化,按需使用
persistence:
  enabled: true
  storageClass: "xxxx"  # storageClass 如果有默认存储可以不写
  accessModes:
    - ReadWriteOnce
2.3、创建 Kafka namespace
kubectl create ns kafka
helm 创建 Zookeeper 集群
helm install zookeeper -n kafka .
NAME: zookeeper
LAST DEPLOYED: Wed Jun 12 17:33:35 2024
NAMESPACE: kafka
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: zookeeper
CHART VERSION: 13.4.3
APP VERSION: 3.9.2

** Please be patient while the chart is being deployed **

ZooKeeper can be accessed via port 2181 on the following DNS name from within your cluster:

    zookeeper.kafka.svc.cluster.local

To connect to your ZooKeeper server run the following commands:

    export POD_NAME=$(kubectl get pods --namespace kafka -l "app.kubernetes.io/name=zookeeper,app.kubernetes.io/instance=zookeeper,app.kubernetes.io/component=zookeeper" -o jsonpath="{.items[0].metadata.name}")
    kubectl exec -it $POD_NAME -- zkCli.sh

To connect to your ZooKeeper server from outside the cluster execute the following commands:

    kubectl port-forward --namespace kafka svc/zookeeper 2181:2181 &
    zkCli.sh 127.0.0.1:2181

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
  - resources
  - tls.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

#查看pod,pvc
kubectl get pod -n kafka
NAME          READY   STATUS    RESTARTS   AGE
zookeeper-0   1/1     Running   0          4m12s
zookeeper-1   1/1     Running   0          4m12s
zookeeper-2   1/1     Running   0          4m12s

kubectl get pvc -n kafka
NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
data-zookeeper-0   Bound    pvc-b1f085bf-5c34-4eb1-9826-9e6437e63167   8Gi        RWO            rook-ceph-block   6m32s
data-zookeeper-1   Bound    pvc-72f5c581-c704-4883-a7f2-3b7368436f25   8Gi        RWO            rook-ceph-block   6m31s
data-zookeeper-2   Bound    pvc-a9cd4d49-7d2c-4ca7-a998-ebe9551ea4d8   8Gi        RWO            rook-ceph-block   6m31s
2.4、检查 Zookeeper 集群状态
I have no name!@zookeeper-0:/$  zkServer.sh status
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

3.1、Helm 部署 Kafka 集群
helm pull bitnami/kafka --version 22.1.3

3.2、解压
tar -zxf kafka-22.1.3.tgz 
cd kafka
ls
Chart.lock  charts  Chart.yaml  README.md  templates  values.yaml
3.3、修改 values.yaml

extraEnvVars: 
  - name: TZ
    value: "Asia/Shanghai"
---
# 副本数
replicaCount: 3                    # 副本数
---
# 持久化存储
persistence:
  enabled: true
  storageClass: "nfs-storage"  # sc 有默认sc可以不写
  accessModes:
    - ReadWriteOnce
  size: 8Gi
---
kraft:
  ## @param kraft.enabled Switch to enable or disable the Kraft mode for Kafka
  ##
  enabled: false   #设置为false
---
# 配置zookeeper外部连接
zookeeper:
  enabled: false                   # 不使用内部zookeeper,默认是false
externalZookeeper:                 # 外部zookeeper
  servers: zookeeper            #Zookeeper svc名称

## 允许删除topic(按需开启)
deleteTopicEnable: true
## 日志保留时间(默认一周)
logRetentionHours: 168
## 自动创建topic时的默认副本数
defaultReplicationFactor: 2
## 用于配置offset记录的topic的partition的副本个数
offsetsTopicReplicationFactor: 2
## 事务主题的复制因子
transactionStateLogReplicationFactor: 2
## min.insync.replicas
transactionStateLogMinIsr: 2
## 新建Topic时默认的分区数
numPartitions: 3
3.4、创建 Kafka 集群
 helm install kafka -n kafka .
 NAME: kafka
LAST DEPLOYED: Wed Jun 12 17:51:01 2024
NAMESPACE: kafka
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: kafka
CHART VERSION: 22.1.3
APP VERSION: 3.4.0

** Please be patient while the chart is being deployed **

Kafka can be accessed by consumers via port 9092 on the following DNS name from within your cluster:

    kafka.kafka.svc.cluster.local

Each Kafka broker can be accessed by producers via port 9092 on the following DNS name(s) from within your cluster:

    kafka-0.kafka-headless.kafka.svc.cluster.local:9092
    kafka-1.kafka-headless.kafka.svc.cluster.local:9092
    kafka-2.kafka-headless.kafka.svc.cluster.local:9092

To create a pod that you can use as a Kafka client run the following commands:

    kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.4.0-debian-11-r33 --namespace kafka --command -- sleep infinity
    kubectl exec --tty -i kafka-client --namespace kafka -- bash

    PRODUCER:
        kafka-console-producer.sh \
            --broker-list kafka-0.kafka-headless.kafka.svc.cluster.local:9092,kafka-1.kafka-headless.kafka.svc.cluster.local:9092,kafka-2.kafka-headless.kafka.svc.cluster.local:9092 \
            --topic test

    CONSUMER:
        kafka-console-consumer.sh \
            --bootstrap-server kafka.kafka.svc.cluster.local:9092 \
            --topic test \
            --from-beginning
3.5、进入 Kafka 集群,创建 topic 查看

##进入Kafka集群
kubectl exec -it -n kafka kafka-0 -- bash
#创建topic
kafka-topics.sh --create --bootstrap-server kafka:9092  --topic abcdocker
#查看topic列表
kafka-topics.sh --list --bootstrap-server kafka:9092 
#查看topic详细信息
kafka-topics.sh --bootstrap-server kafka:9092  --describe --topic abcdocker
#配置文件配置已经生效,默认分区为3,副本为3,过期时间为168小时
I have no name!@kafka-0:/$ kafka-topics.sh --bootstrap-server kafka:9092  --describe --topic abcdocker
Topic: abcdocker    TopicId: jcJtxY1NSr-nSloax8oPnA PartitionCount: 3   ReplicationFactor: 3    Configs: flush.ms=1000,segment.bytes=1073741824,flush.messages=10000,max.message.bytes=1000012,retention.bytes=1073741824
    Topic: abcdocker    Partition: 0    Leader: 1   Replicas: 1,2,0 Isr: 1,2,0
    Topic: abcdocker    Partition: 1    Leader: 0   Replicas: 0,1,2 Isr: 0,1,2
    Topic: abcdocker    Partition: 2    Leader: 2   Replicas: 2,0,1 Isr: 2,0,1
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes 可以很容易地部署 Kafka 集群。下面是一个大致的步骤: 1. 创建一个 Kafka 镜像并将其上传到 Docker Hub 上。Kafka 可以从 Apache Kafka 官网下载并编译。你可以使用 Dockerfile 将其打包成 Docker 镜像。 2. 在 Kubernetes 上安装 ZooKeeper 集群Kafka 需要 ZooKeeper 来管理其 Brokers。 3. 创建一个 Kafka StatefulSet,它会自动创建多个 Kafka 实例。 4. 在 Kubernetes 上创建一个 Kafka Service,它会将流量路由到 StatefulSet 中的 Kafka 实例上。 下面是一个 YAML 文件示例,用于创建一个 Kafka StatefulSet 和 Service: ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: kafka spec: serviceName: kafka replicas: 3 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: your-kafka-image env: - name: KAFKA_ZOOKEEPER_CONNECT value: "zookeeper:2181" - name: KAFKA_ADVERTISED_LISTENERS value: "PLAINTEXT://$(hostname -f):9092" ports: - containerPort: 9092 volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi --- apiVersion: v1 kind: Service metadata: name: kafka spec: type: NodePort selector: app: kafka ports: - name: kafka port: 9092 targetPort: 9092 ``` 这个 YAML 文件会创建一个名为 kafka 的 StatefulSet。它会自动创建 3 个 Kafka 实例,并且使用一个名为 data 的 PVC 来存储数据。它还会创建一个名为 kafka 的 Service,它会将流量路由到 Kafka 实例上,这个 Service 的类型是 NodePort,意味着它会将 Kafka 的端口映射到 Kubernetes 集群中的任何节点上。 你可以使用 `kubectl apply -f kafka.yaml` 命令来应用这个 YAML 文件并创建 Kafka 集群

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值