Kubernetes上的Kafka,Strimzi方式!(第1部分)

作者 : IT 大叔 本文共7693个字,预计阅读时间需要20分钟 发布时间: 2020-08-18

在本文中,学习如何在Kubernetes上运行Kafka。

我以前的一些博客文章(例如,在Kubernetes上使用Kafka Connect ,这很简单!)演示了如何以Kubernetes原生方式使用Kafka Connect。这是系列博客文章的第一篇,该系列文章将使用Strimzi OperatorKubernetes上介绍Apache Kafka。在本文中,我们将从最简单的设置开始,即单节点Kafka(和Zookeeper)集群,并学习:

  • Strimzi概述和设置
  • Kafka集群安装
  • 在后台使用/创建的Kubernetes资源
  • 使用Kubernetes集群中的客户端测试Kafka设置

该代码在GitHub上可用-https: //github.com/abhirockzz/kafka-kubernetes-strimzi

我需要尝试什么?

kubectlhttps://kubernetes.io/docs/tasks/tools/install-kubectl/

我将使用Azure Kubernetes服务(AKS)来演示概念,但是总的来说,它独立于Kubernetes提供程序(例如,可以随意使用本地设置,如minikube)。如果要使用AKS,您只需一个Microsoft Azure帐户,如果您还没有帐户,则可以免费获得

安装 Helm

我将使用Helminstall Strimzi。这是要自行安装的文档Helm-https: //helm.sh/docs/intro/install/

您也可以YAML直接使用这些文件进行安装Strimzi。在此处查看快速入门指南-https: //strimzi.io/docs/quickstart/latest/#proc-install-product-str

(可选)安装Azure Kubernetes服务

Azure Kubernetes服务(AKS)使在Azure中部署托管Kubernetes群集变得简单。通过将大量责任转移到Azure上,它降低了管理Kubernetes的复杂性和运营开销。以下是如何使用以下方法设置AKS群集的示例

设置群集后,您可以轻松配置kubectl以指向它

JAVA

az aks get-credentials --resource-group <CLUSTER_RESOURCE_GROUP> --name <CLUSTER_NAME>

等一下,什么Strimzi

从Strimzi文档中

Strimzi简化了在Kubernetes集群中运行Apache Kafka的过程。Strimzi提供了容器映像和操作员,用于在Kubernetes上运行Kafka。作为项目一部分Cloud Native Computing Foundation(撰写本文时)Sandbox

Strimzi Operators是该项目的基础。这些操作员是专门设计的,具有专业的操作知识,可以有效地管理Kafka。运营商简化了以下过程:部署和运行Kafka集群和组件,配置和保护对Kafka的访问,升级和管理Kafka,甚至负责管理主题和用户。

下图显示了10,000英尺的操作员角色概览:

安装Strimzi

Strimzi使用安装Helm非常简单:

//add helm chart repo for Strimzi
helm repo add strimzi https://strimzi.io/charts/
//install it! (I have used strimzi-kafka as the release name)
helm install strimzi-kafka strimzi/strimzi-kafka-operator

这将安装Strimzi操作(这不过是Deployment),自定义资源的定义和其他Kubernetes组件,如Cluster RolesCluster Role BindingsService Accounts

有关更多详细信息,请查看此链接

要删除,只需 helm uninstall strimzi-kafka

要确认已部署Strimzi Operator,请检查它是否已安装PodRunning一段时间后应转换为状态)

kubectl get pods -l=name=strimzi-cluster-operator
NAME                                        READY   STATUS    RESTARTS   AGE
strimzi-cluster-operator-5c66f679d5-69rgk   1/1     Running   0          43s

还要检查自定义资源定义:

kubectl get crd | grep strimzi
kafkabridges.kafka.strimzi.io           2020-04-13T16:49:36Z
kafkaconnectors.kafka.strimzi.io        2020-04-13T16:49:33Z
kafkaconnects.kafka.strimzi.io          2020-04-13T16:49:36Z
kafkaconnects2is.kafka.strimzi.io       2020-04-13T16:49:38Z
kafkamirrormaker2s.kafka.strimzi.io     2020-04-13T16:49:37Z
kafkamirrormakers.kafka.strimzi.io      2020-04-13T16:49:39Z
kafkas.kafka.strimzi.io                 2020-04-13T16:49:40Z
kafkatopics.kafka.strimzi.io            2020-04-13T16:49:34Z
kafkausers.kafka.strimzi.io             2020-04-13T16:49:33Z

kafkas.kafka.strimzi.io CRD代表Kubernetes中的Kafka集群

现在我们已经连接了“大脑”(Strimzi运算符),让我们使用它!

是时候创建一个Kafka集群了!

如前所述,我们将使事情变得简单,并从以下设置开始(我们将逐步更新该设置,作为本系列后续文章的一部分):

  • 单节点Kafka集群(和Zookeeper)
  • 内部可用于同一Kubernetes集群中的客户端
  • 没有加密,认证或授权
  • 无持久性(使用emptyDir量)

要部署Kafka集群,我们要做的就是创建一个Strimzi Kafka资源。看起来是这样的:

apiVersion: kafka.strimzi.io/v1beta1
kind: Kafka
metadata:
  name: my-kafka-cluster
spec:
  kafka:
    version: 2.4.0
    replicas: 1
    listeners:
      plain: {}
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
      log.message.format.version: "2.4"
    storage:
      type: ephemeral
  zookeeper:
    replicas: 1
    storage:
      type: ephemeral

有关KafkaCRD 的详细参考,请查阅文档-https://strimzi.io/docs/operators/master/using.html#type-Kafka-reference

我们在中定义my-kafka-cluster群集的名称()metadata.name。以下是的属性摘要spec.kafka

  • version-Kafka经纪人版本(2.5.0在撰写本文时默认为,但我们正在使用2.4.0
  • replicas-Kafka群集大小,即Kafka节点数(Pod群集中的s)
  • listeners-配置Kafka代理的侦听器。在此示例中,我们使用plain侦听器,这意味着内部客户端(在同一Kubernetes群集中)可通过端口访问该群集9092(不涉及加密,身份验证或授权)。支持的类型包括plaintlsexternal(见https://strimzi.io/docs/operators/master/using.html#type-KafkaListeners-reference)。可以配置多个侦听器(我们将在后续的博客文章中介绍)
  • config -这些是用作Kafka经纪人配置属性的键值对
  • storage-用于Kafka群集的存储。支持的类型包括ephemeralpersistent-claimjbodephemeral在此示例中,我们使用的是使用emptyDir,并且数据仅与Kafka经纪人的存续时间相关Pod(以后的博客文章将介绍persistent-claim存储)

Zookeeper群集详细信息(spec.zookeeper)与Kafka类似。在这种情况下,我们只配置no。的replicasstorage类型。有关详细信息,请参阅https://strimzi.io/docs/operators/master/using.html#type-ZookeeperClusterSpec-reference

要创建Kafka集群:

kubectl apply -f https://raw.githubusercontent.com/abhirockzz/kafka-kubernetes-strimzi/master/part-1/kafka.yaml

下一步是什么?

Strimzi运算符开始行动并创建许多Kubernetes资源,以响应Kafka我们刚刚创建的CRD实例。

创建了以下资源:

  • StatefulSet-Kafka和Zookeeper集群以StatefulSets 的形式存在,用于管理Kubernetes中的有状态工作负载。请参阅https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/和相关材料以了解详细信息
  • Service-Kubernetes ClusterIP服务用于内部访问
  • ConfigMap-卡夫卡与动物园管理员配置存储在Kubernetes ConfigMap小号
  • Secret-Kubernetes Secret用于存储Kafka集群组件和客户端的私钥和证书。这些用于TLS加密和身份验证(在后续博客文章中介绍)

Kafka自定义资源

kubectl get kafka

NAME               DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS
my-kafka-cluster   1

StatefulSet 和 Pod

StatefulSet使用以下命令检查Kafka和Zookeeper :

kubectl get statefulset/my-kafka-cluster-zookeeper
kubectl get statefulset/my-kafka-cluster-kafka

Kafka and Zookeeper Pods

kubectl get pod/my-kafka-cluster-zookeeper-0
kubectl get pod/my-kafka-cluster-kafka-0

ConfigMap

ConfigMap创建了个人来存储KafkaZookeeper配置

kubectl get configmap
my-kafka-cluster-kafka-config         4      19m
my-kafka-cluster-zookeeper-config     2      20m

让我们来看看Kafka的配置

kubectl get configmap/my-kafka-cluster-kafka-config -o yaml

输出是相当长的,但我将突出显示重要的部分。作为数据部分的一部分,Kafka代理有两个配置属性- log4j.propertiesserver.config

这是的摘要server.config。请注意advertised.listeners(突出显示了通过端口的内部访问9092)和User provided configuration(我们在yaml清单中指定的访问)

##############################
    ##############################
    # This file is automatically generated by the Strimzi Cluster Operator
    # Any changes to this file will be ignored and overwritten!
    ##############################
    ##############################
    broker.id=${STRIMZI_BROKER_ID}
    log.dirs=/var/lib/kafka/data/kafka-log${STRIMZI_BROKER_ID}
    ##########
    # Plain listener
    ##########
    ##########
    # Common listener configuration
    ##########
    listeners=REPLICATION-9091://0.0.0.0:9091,PLAIN-9092://0.0.0.0:9092
    advertised.listeners=REPLICATION-9091://my-kafka-cluster-kafka-${STRIMZI_BROKER_ID}.my-kafka-cluster-kafka-brokers.default.svc:9091,PLAIN-9092://my-kafka-cluster-kafka-${STRIMZI_BROKER_ID}.my-kafka-cluster-kafka-brokers.default.svc:9092
    listener.security.protocol.map=REPLICATION-9091:SSL,PLAIN-9092:PLAINTEXT
    inter.broker.listener.name=REPLICATION-9091
    sasl.enabled.mechanisms=
    ssl.secure.random.implementation=SHA1PRNG
    ssl.endpoint.identification.algorithm=HTTPS
    ##########
    # User provided configuration
    ##########
    log.message.format.version=2.4
    offsets.topic.replication.factor=1
    transaction.state.log.min.isr=1
    transaction.state.log.replication.factor=1

Service

如果查询Services,则应该看到类似以下内容:

kubectl get svc
NAME                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)
my-kafka-cluster-kafka-bootstrap    ClusterIP   10.0.240.137   <none>        9091/TCP,9092/TCP
my-kafka-cluster-kafka-brokers      ClusterIP   None           <none>        9091/TCP,9092/TCP
my-kafka-cluster-zookeeper-client   ClusterIP   10.0.143.149   <none>        2181/TCP
my-kafka-cluster-zookeeper-nodes    ClusterIP   None           <none>        2181/TCP,2888/TCP,3888/TCP

my-kafka-cluster-kafka-bootstrap内部Kubernetes客户端可以访问Kafka集群,my-kafka-cluster-kafka-brokers并且该Headless服务对应于StatefulSet

Secret

尽管我们没有使用它们,但是查看Secret由创建的会很有帮助Strimzi

kubectl get secret
my-kafka-cluster-clients-ca               Opaque
my-kafka-cluster-clients-ca-cert          Opaque
my-kafka-cluster-cluster-ca               Opaque
my-kafka-cluster-cluster-ca-cert          Opaque
my-kafka-cluster-cluster-operator-certs   Opaque
my-kafka-cluster-kafka-brokers            Opaque
my-kafka-cluster-kafka-token-vb2qt        kubernetes.io/service-account-token
my-kafka-cluster-zookeeper-nodes          Opaque
my-kafka-cluster-zookeeper-token-xq8m2    kubernetes.io/service-account-token

创建一个生产者Pod

export KAFKA_CLUSTER_NAME=my-kafka-cluster
kubectl run kafka-producer -ti --image=strimzi/kafka:latest-kafka-2.4.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --broker-list $KAFKA_CLUSTER_NAME-kafka-bootstrap:9092 --topic my-topic

在另一个终端中,创建一个使用者Pod

export KAFKA_CLUSTER_NAME=my-kafka-cluster
kubectl run kafka-consumer -ti --image=strimzi/kafka:latest-kafka-2.4.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server $KAFKA_CLUSTER_NAME-kafka-bootstrap:9092 --topic my-topic --from-beginning

上述论证是从Strimzi文档拍摄- https://strimzi.io/docs/operators/master/deploying.html#deploying-example-clients-str

您也可以使用其他客户端

我们才刚刚开始...

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Kubernetes上的Kafka,Strimzi方式!(第1部分)

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论