打造高可用的Kubernetes Kafka集群

随着近年来大数据的快速发展和人工智能技术的不断普及,消息队列已经成为了大量企业和机构中不可或缺的关键组件。其中,Kafka 由于其高性能、高可用以及可扩展性等特点而备受青睐,成为了流行的分布式消息系统之一。而在云环境中部署 Kubernetes Kafka 集群,可以大幅度简化 Kafka 部署和管理,从而提高生产力、便捷可靠地进行Kafka 开发。本篇文章将从多个方面讲解如何打造高可用的Kubernetes Kafka 集群,包括集群架构、存储、网络等,以满足实际业务需求。

一、集群架构

Kafka 可以在 Kubernetes 上部署成为一个分布式的结构,这里的部署方式有不同的选择。下面,我们介绍一种主要的架构方式:

spec:
  replicas: 3 # 设置3个副本形成一个 Kafka 集群
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - name: kafka
        image: wurstmeister/kafka:2.13-2.8.1
        ports:
        - containerPort: 9092 # 配置 Kafka 端口,服务监听端口
        env:
        - name: KAFKA_ADVERTISED_HOST_NAME # 配置 hostname
          value: kafka-lb.example.com
        - name: KAFKA_ADVERTISED_PORT
          value: "9092"
        - name: KAFKA_ZOOKEEPER_CONNECT # 配置 ZooKeeper
          value: "zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181"

通过上述代码部署了一个 Kubernetes Kafka 集群,其中 Kafka 节点数量为 3 台,支持节点的水平扩展。同时,使用 Rolling Update 策略能够保证 Kafka 集群的正常运转,并且在节点平滑升级时不会影响生产环境服务的持续提供。使用 KAFKA_ZOOKEEPER_CONNECT 指向 Zookeeper 节点,这里采用 3 台机器作为 Zookeeper 集群,保证了数据的高可用。

二、存储

Kafka 数据存储使用本地磁盘进行存储,这种方式会面临磁盘容量不足,或者节点宕机的风险。为了解决这些问题,我们可以使用 Kubernetes 的 PV 和 PVC 技术,来对 Kafka 数据进行持久化存储。

通过下方代码示例创建 Kafka 集群所需的这个 PersistentVolumeClaim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kafka-pvc
spec:
  resources:
    requests:
      storage: 10Gi # 申请10GB的存储容量
  accessModes:
    - ReadWriteOnce
  storageClassName: standard

此代码部分定义了一个名为 kafka-pvc 的 PersistenceVolumeClaim 对象,用于在系统中申请10 GB 的存储空间。同时,定义 storageClassName 手动连接 Kubernetes 集群中的 StorageClass,从而完成集群存储的自动化配置。

三、网络

与大部分微服务中的网络解决方案不同,Kafka 的协议是默认使用明文 socket 方式传输的,考虑到网络传输中的数据安全问题,建议采用 HTTPS 进行数据保护。此时,需要使用 Kubernetes 的 ingress 和 HTTPS 协议。其配置方式如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: kafka-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt"


spec:
  tls:
  - hosts:
      - kafka-lb.example.com
    secretName: kafka-tls-secret
  rules:
    - host: kafka-lb.example.com
      http:
        paths:
        - backend:
            serviceName: kafka-svc
            servicePort: 443

通过以上代码部署,我们定义了一个基于 TLS 的安全数据传输方案,以解决网络传输中的安全性问题。可以看到,这里采用的是 Nginx Ingress Controller ,当环境中租户对访问服务的域名进行 HTTPS 请求时,用户请求会首先被 Nginx 实例负载 IP 转发至内部 Kafka 服务,并且将协议转变为对应的 HTTP。

四、监控

Kafka 集群的监控是保障其高可用的前提。在 Kubernetes 环境中,我们通常使用 Prometheus 和 Grafana 来实现 Kafka 集群的监控

以下为采用标准的 Prometheus Operator 方式实现监控的代码:

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: kafka-prometheus
  labels:
    app: prometheus
spec:
  replicas: 1
  storage:
    volumeClaimTemplate:
      metadata:
        name: prometheus-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi
        volumeMode: Filesystem
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      app: kafka
    namespaceSelector:
      matchNames:
        - kafka
  ruleSelector:
    matchLabels:
      app: kafka
    matchExpressions:
      - key: job
        operator: In
        values:
        - kafka-exporter
  alerting:
    alertmanagers:
    - namespace: monitoring
      name: alertmanager-main
      port: web

使用 Prometheus Operator 可以自动化进行 Kafka 集群的监控数据收集,而且在 Prometheus collect 的时候,还可以使用 Kafka Exporter 从 Kafka node 获取应用指标数据。除此之外,我们可以通过 Grafana 显示出收集到的 Kafka 相关数据,如下所示:

五、实现各节点的高可用

为了实现 Kafka 集群的高可用,我们需要在集群中设置 leader 和 follower 节点,从而实现 Kafka 副本之间数据的复制,以实现高可用。

对于服务器故障等单点问题,我们可以使用热备节点的方式来解决,具体代码如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: kafka-0
  labels:
    broker.id: "0"
spec:
  containers:
  - name: kafka
    image: wurstmeister/kafka:2.13-2.8.1
    env:
    - name: KAFKA_BROKER_ID
      value: "0"
    - name: KAFKA_ADVERTISED_HOST_NAME
      value: kafka.example.com
    - name: KAFKA_META_BROKER_LIST
      value: "kafka-0:9092,kafka-1:9092,kafka-2:9092"
    - name: KAFKA_ZOOKEEPER_CONNECT
      value: "zk-0:2181,zk-1:2181,zk-2:2181/kafka"
    ports:
    - containerPort: 9092
    volumeMounts:
    - name: kafka-data
      mountPath: /var/lib/kafka
    - name: config-volume
      mountPath: /opt/kafka/config/kafka-0.properties
      subPath: kafka-0.properties
  volumes:
  - name: kafka-data
    persistentVolumeClaim:
      claimName: pvc-kafka-0
  - name: config-volume
    configMap:
      name: kafka-config-map
      items:
         - key: kafka-0.properties
           path: kafka-0.properties
      defaultMode: 420

上述代码中定义了一个名为 kafka-0 的副本,用于备份 Kafka 集群中的数据。如此一来,当 Kafka 集群中某一台主节点宕机时,副本节点会接替主节点的职责,实现高可用。

六、总结

本文介绍了如何在 Kubernetes 环境下打造高可用的 Kafka 集群,分别从高可用架构、存储、网络、监控以及实现各节点的高可用等方面进行了详细讲解,是初学者学习 Kubernetes Kafka 集群的一篇不可多得的好文章。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/183185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-24 16:27
下一篇 2024-11-24 16:27

相关推荐

  • 使用Go-Redis获取Redis集群内存使用率

    本文旨在介绍如何使用Go-Redis获取Redis集群的内存使用率。 一、Go-Redis简介 Go-Redis是一个用于连接Redis服务器的Golang客户端。它支持Redis…

    编程 2025-04-28
  • Python消费Kafka数据指南

    本文将为您详细介绍如何使用Python消费Kafka数据,旨在帮助读者快速掌握这一重要技能。 一、Kafka简介 Kafka是一种高性能和可伸缩的分布式消息队列,由Apache软件…

    编程 2025-04-28
  • Kubernetes安装Drone教程

    本文将通过多个方面详细介绍如何在Kubernetes中安装Drone,让您快速上手使用。 一、前置条件 1、已经安装了Kubernetes环境 2、拥有一个Github账户 3、已…

    编程 2025-04-27
  • Redis5.0集群扩容用法介绍

    Redis是一个内存数据库,越来越受到开发者的欢迎。在开发中,我们经常需要考虑Redis集群的扩容问题。而Redis5.0针对集群扩容方面进行了多项优化和改进,本文将从多个方面详细…

    编程 2025-04-27
  • CentOS安装Kubernetes教程

    一、安装必备组件 在开始安装Kubernetes之前,需要安装一些必备组件: sudo yum install -y yum-utils device-mapper-persist…

    编程 2025-04-25
  • Flink消费Kafka

    一、Flink消费Kafka简介 Apache Flink是一个分布式流处理引擎,提供在大规模数据上实时计算的能力,同时也支持批处理模式。在结合Kafka使用时,Flink可以通过…

    编程 2025-04-25
  • 浅谈Docker集群

    一、Docker简介 Docker可以理解为是一种容器技术,可以将应用程序及其所有依赖项打包在一个标准化单元中,以便在不同的计算机上交付。这种单元被称为容器。相比于传统的虚拟机技术…

    编程 2025-04-24
  • Kubernetes 中的 Service

    一、简介 Kubernetes 中的 Service 是一个重要的概念,它将一组 Pod 封装成一个逻辑单元,并提供网络访问,对外暴露一个统一的 IP 和端口号。这样,无论后端 P…

    编程 2025-04-24
  • 使用Kubernetes(K8s)搭建分布式系统

    一、Kubernetes概述 Kubernetes是一个用于自动部署、扩展和管理容器化应用程序的开源平台。其提供了高可用性、自我修复能力和易于扩展的特征,使得大规模、高度可用的分布…

    编程 2025-04-24
  • Docker Redis 集群详解

    一、Docker Redis 集群简介 Docker Redis 集群是一种通过 Docker 容器实现的分布式 Redis 数据库解决方案。通过将 Redis 数据库实例分散在多…

    编程 2025-04-24

发表回复

登录后才能评论