作者:周翔宇,中国移动云能力中心软件研发工程师
基于 K8s Operator 模式开发的应用程序因其具有全生命周期的自动化管理、可扩展性强和故障自愈等特点,成为云化方案落地的重要方向。业界中主流的 Kafka Operator on K8s 方案分别有 Strimzi 社区推出的 strimzi-kafka-operator[1]和 banzaicloud 公司推出的 koperator[2]。相较于 koperator,strimzi-kafka-operator 具有更完善 Kafka 的上下游生态、自定义 Operator 扩展性强和可定制等特点。
因此,本文深入分析 Strimzi Kafka Operator,介绍其核心功能、整体架构和 Kafka 集群创建的调谐过程。
Strimzi Kafka Operator 基于 fabric8 k8s client 实现的 Kafka Operator,为 K8s 上自动化部署、管理和监控多套 Kafka 集群,提供了一种高度可扩展和可靠的解决方案。
2019 年 8 月托管于 CNCF,目前主要由 Red Hat 社区开发和维护,是 CNCF 中为数不多由 Java 开发的 Operator。Strimzi Kafka Operator 具有集群快速一键化部署、通用的 Kafka 集群管理、跨集群的数据复制、丰富的大数据数据源对接、统一的监控和告警、集群故障管理和数据 Rebalance 等功能。
图1 strimzi kafka operator支持Kafka集群及周边生态[3]
Strimzi Kafka Operator 封装了多层级的 Operator,顶层由四个 Operator 来实现:
图2 核心Operator之间调用流程[3]
本小节将演示如何部署 Cluster Operator,并自动管理 k8s 集群中所有 namespace 下的 kafka 实例。
(1) k8s 中创建名为 kafka-operator 的 namespace: kubectl create ns kafka-operator
(2) 安装 strimzi kafka operator
:
curl -L https://strimzi.io/install/latest?namespace=kafka-operator > strimzi-kafka-operator.yaml
STRIMZI_NAMESPACE
环境变量值为*,以便 Cluster operator
管理所有 namespace 下的 kafka 集群ClusterRoleBindings
,为 Cluster operator
授予所有 namespace 的访问权限kubectl create clusterrolebinding strimzi-cluster-operator-namespaced --clusterrole=strimzi-cluster-operator-namespaced --serviceaccount kafka-operator:strimzi-cluster-operator
kubectl create clusterrolebinding strimzi-cluster-operator-watched --clusterrole=strimzi-cluster-operator-watched --serviceaccount kafka-operator:strimzi-cluster-operator
kubectl create clusterrolebinding strimzi-cluster-operator-entity-operator-delegation --clusterrole=strimzi-entity-operator --serviceaccount kafka-operator:strimzi-cluster-operator
(3)查看安装后的 Cluster Operator pod
是否为 Running
: kubectl create -f strimzi-kafka-operator.yaml kubectl -n kafka-operator get pods -w
图3 Cluster Operator 部署结果
本小节将演示如何使用 Cluster Operator 将临时存储的 kafka 实例部署到 k8s 集群中。集群的创建中,首先创建多副本的 zookeeper pod,创建完成后开始 kafka broker pod 创建。对于 ZK 和 Kafka 集群数据文件的存储,官方示例中提供了临时存储(EmptyDir)、块存储(JBOD)和持久化存储(PVC)三种形式样例。 kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-ephemeral-single.yaml -n kafka
图4 Kafka 集群及内置 ZK 部署结果
本小节将演示如何,连接 kafka 实例对外暴露的服务,并进行消息的生产和消费。
kubectl -n kafka run kafka-producer -ti --image=quay.io/strimzi/kafka:kafka:0.38.0-kafka-3.6.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic test
kubectl -n kafka run kafka-consumer -ti --image=quay.io/strimzi/kafka:kafka:0.38.0-kafka-3.6.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic test --from-beginning
本节详细分析 Cluster Operator 技术实现的核心细节,主要介绍 Cluster Operator 中多种 CRD 资源的定义和对应资源 Operator 的整体调用流程,并重点分析 Kafka 集群创建过程中各个环节的调谐步骤。
Cluster Operator 是 Strimzi Kafka Operator 中的核心模块,封装了 Kafka 集群管理及其周边生态工具的 CRD 资源,并基于观察者模式的事件注册和 K8s Informer 机制,执行不同类型 Operator 的 Reconcile(调谐)逻辑。Cluster Operator 中对 Kafka 集群及其周边生态工具的操作,主要由 6 种 KafkaAssemblyOperator 类型来实现。其中,KafkaAssemblyOperator 负责整个 Kafka 集群创建、持久化存储挂载和对外安全链路访问等。KafkaConnectAssemblyOperator 创建 Kafka Connect 服务实现从外部系统导入或导出数据。KafkaBridgeAssemblyOperator 启动 Kafka Bridge 服务,基于 HTTP REST API 方式操作 Kafka 集群实例。KafkaMirrorMaker/2AssemblyOperator 完成不同 Kafka 集群之间的数据复制工作,实现跨数据中心的集群高可用。KafkaRebalanceAssemblyOperator 与 Cruise Control 工具的 REST API 交互,向其发送 Rebalance 请求,并监听 Kafka 集群 Rebalance 的执行状态。
图5 Cluster Operator中各个AssemblyOperator组件调用流程
当 Cluster Operator Pod 运行时,首先创建各个 CRD 资源所需的 ClusterRoles,并开启 Cluster Operator pod 选主功能,支持 Cluster Operator 多副本;其次,依次为每个被管理的 Kafka 实例创建 verticles 对象,用于处理 ClusterOperator 整体逻辑。针对 Cluster Operator 下不同类型的 AssemblyOperator,调用 CRD 资源的 SharedInformer 注册对应的 EventHandler,并根据 workqueue pop 出的 Reconciliation 对象,执行不同 CRD 资源的调谐逻辑。各个调谐逻辑根据 CRD 资源 Spec 定义的内容,调用 K8s API Server 创建 Pod、Deployment、Service、ConfigMap、PVC、Secret 等内置资源对象,并将创建后的状态数据更新到 K8s 中。
图6 Cluster Operator中各个组件调用流程
KafkaAssemblyOperator Reconcile 过程中,主要包括 Kafka 集群和相关依赖的 ZK、Entity Operator、KafkaExporter 和 JMX 组件的 Reconcile。其中,Kafka broker 核心 k8s 底层资源的 Reconcile 流程有:
图7 KafkaAssembly中各个组件调谐流程
和传统线下自建 Kafka 集群相比,基于 Strimzi Kafka Operator 容器化的 Kafka 服务,具有 Kafka 集群和周边生态的自动化管理、可扩展性强、故障恢复和自愈等优点,并且提供一站式的监控、日志、告警等能力的集成。本文简单介绍 Strimzi Kafka Operator 的功能和安装部署使用,其次,重点分析 Strimzi Kafka Operator 整体架构和 Kafka 集群创建的调谐的核心调用流程,希望能给广大读者的学习和使用带来帮助。
1. strimzi-kafka-operator: https://github.com/strimzi/strimzi-kafka-operator
2.koperator: https://github.com/banzaicloud/koperator
3.strimzi overview: https://strimzi.io/docs/operators/latest/overview