Skip to content

第 6 部分:MSK 集成

支持的版本: Amazon MSK (Provisioned & Serverless), MSK Connect
最后更新: July 9, 2026

实验环境设置

要跟随本文档中的示例进行操作,你需要以下工具和环境:

必需工具

  • AWS CLI v2(用于管理 MSK cluster 和 IAM policies)
  • kubectl v1.28 或更高版本,以及一个可用的 EKS cluster
  • aws-msk-iam-auth client library(用于使用 IAM authentication 的 Kafka clients)
  • 配置了 External Secrets Operator 或 IRSA 的 EKS cluster(用于 credential injection)

前面的部分介绍了如何使用 Strimzi 在 EKS 上自行运行 Kafka。本部分介绍如何将 EKS workloads 连接到 Amazon MSK —— AWS 的完全托管 Kafka 服务 —— 以及它与自管理 Strimzi 方式之间的取舍。它还澄清了一个常见的混淆点:Kafka 与 Kinesis Data Streams 之间的关系,后者是一个完全独立的 AWS streaming service。

Amazon MSK 与自管理 Strimzi

这两种方式都能让 EKS workload 与 Kafka 通信,但它们的不同之处在于 brokers 实际运行的位置以及由谁来运维。MSK 在你的 cluster 之外、由 AWS 管理的基础设施上运行 brokers;Strimzi 则将 brokers 作为 Pods 运行在你的 EKS cluster 内。

方面Amazon MSK (Provisioned)Amazon MSK ServerlessStrimzi(在 EKS 上自管理)
运维负担AWS 负责 broker patching、hardware replacement 和 storage expansionAWS 完全移除 broker sizing(完全自动扩展)Operator 会自动化 rolling upgrades/reconciliation,但你仍然负责 upgrade timing、capacity planning 和 incident response
成本模型按 broker-hour + storage (GB-month) + data transfer 计费基于 throughput(按 partition、每 GB in/out)直接 EC2/EBS 成本 —— 通常在规模化时更便宜,但你需要单独承担运维人员成本
自动扩展支持 storage auto-expansion;broker scaling 需要手动或通过 API 驱动完全自动的 per-partition scaling;brokers 不作为概念暴露可通过 Cruise Control 等工具实现半自动化,但通常由你触发
自定义配置可以自定义 broker configuration (server.properties)不支持自定义 broker config;部分 APIs/features 受限(例如某些 ACL types、connector types)几乎所有内容都可调优 —— listeners、interceptors、KRaft controller settings
版本支持AWS 维护受支持的 Kafka version list,可能落后于 upstream固定版本,不能选择版本只要 Strimzi 支持,就可以在 upstream 发布后采用任意 Kafka version
多租户通过 cluster/resource policies 隔离;细粒度定制有限Tenant isolation 委托给 AWS 的内部实现通过 namespaces、KafkaUser ACLs 和 custom listeners 实现细粒度租户能力
Observability/GitOps 适配通过 CloudWatch/Prometheus exporters 集成;AWS console 是主要管理界面相同能自然融入与平台其余部分相同的 GitOps/observability pipeline(Argo CD、Prometheus Operator)

为什么选择 MSK

  • 你的团队缺乏深入的 Kafka broker 运维经验,或者不希望将 Kafka 运维作为核心能力
  • 你已经大量投入 AWS-native operations tooling(console、IAM、CloudWatch)
  • 流量难以预测,而 MSK Serverless 可以让你完全消除 broker capacity planning

尽管 MSK 存在,为什么仍要使用 Strimzi 在 EKS 上自行运行 Kafka

  • 你希望用与平台其余部分相同的工具和相同的 deployment pipeline 来管理 Kafka —— 其他 workloads、GitOps、Prometheus/Grafana —— 而无需增加第二套 AWS console/IAM 操作界面
  • 你需要不绑定到单一 cloud 的可移植性(on-prem、multi-cloud migration potential)
  • 在非常大的规模下,直接管理 EC2/EBS 比按 broker-hour 定价更具成本效益
  • 你需要最新的 Kafka features(新的 KIPs、custom interceptors、特定的 KRaft tuning options),而 MSK 还没有跟上

从 EKS 连接到 MSK

要让 EKS workload 访问 MSK brokers,你同时需要网络路径和 authentication mechanism。

网络路径

  • Same VPC:如果 EKS cluster 和 MSK cluster 位于同一个 VPC,仅靠 subnet routing 就能获得连接性 —— 最简单且延迟最低。
  • Different VPC:你需要 VPC peering 或 AWS Transit Gateway 来连接两个 VPC。MSK 确实支持 public access(public broker endpoints),但生产环境通常倾向于 private connectivity。
  • Security groups:MSK cluster 的 security group 必须在相关 broker ports 上显式允许来自 EKS node(或 pod,如果 pods 有自己的 security groups)security group 的 inbound traffic —— plaintext 9092、TLS 9094、SASL/SCRAM 9096、IAM 9098。默认情况下不允许任何流量。
bash
# Allow the IAM auth port on the MSK security group from the EKS node security group
aws ec2 authorize-security-group-ingress \
  --group-id sg-0abcd1234msk \
  --protocol tcp --port 9098 \
  --source-group sg-0efgh5678eksnode

Authentication mechanisms 对比

机制工作方式EKS 集成点
IAM authentication (AWS_MSK_IAM)Client 使用 AWS_MSK_IAM 通过 SigV4-signed request 进行身份验证,这是一个专用的 custom SASL mechanism(不是 OAUTHBEARER extension);IAM policies 控制 per-topic permissions通过 IRSA 为 pod 授予 IAM role —— 完全不需要分发 credentials
SASL/SCRAM基于 username/password;credentials 存储在 AWS Secrets Manager 中通过 External Secrets Operator 将 SCRAM credentials 从 Secrets Manager 同步到 Kubernetes Secret
Mutual TLS (mTLS)由 AWS Private CA 颁发 client certificates;通过 certificate 验证身份通过 cert-manager 或 External Secrets Operator 将 certificates/keys 挂载到 pods 中

IAM authentication 最适合 EKS。使用 IRSA (IAM Roles for Service Accounts),你可以为 pod 授予作用域受限的 IAM role,并完全通过 IAM policy 表达 topic-level access control —— 无需分发或轮换密码或证书。

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kafka-cluster:Connect",
        "kafka-cluster:AlterCluster",
        "kafka-cluster:DescribeCluster"
      ],
      "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/my-msk-cluster/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "kafka-cluster:*Topic*",
        "kafka-cluster:WriteData",
        "kafka-cluster:ReadData"
      ],
      "Resource": "arn:aws:kafka:us-east-1:111122223333:topic/my-msk-cluster/*/orders"
    }
  ]
}

在 client 端,将 aws-msk-iam-auth library 添加到你的 classpath(或使用对应语言的等效 package),然后按如下方式配置 Kafka client:

properties
security.protocol=SASL_SSL
sasl.mechanism=AWS_MSK_IAM
sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler

MSK Connect

MSK Connect 是 AWS 的完全托管 Kafka Connect 产品。AWS 负责 Connect worker infrastructure 的 provisioning、scaling 和 patching;你通过将 connector plugins(JAR bundles)上传到 S3 来注册它们。

重要细节是:MSK Connect 并不限于 MSK clusters。只要它能够通过网络访问 bootstrap brokers,MSK Connect 也可以针对通过 Strimzi 运行在 EKS 上的自管理 Kafka cluster 运行 connectors。

bash
# Upload a custom connector plugin to S3 and register it as an MSK Connect custom plugin
aws kafkaconnect create-custom-plugin \
  --name debezium-postgres-plugin \
  --content-type ZIP \
  --location s3Location='{bucketArn=arn:aws:s3:::my-connect-plugins,fileKey=debezium-postgres-2.7.zip}'
方面MSK ConnectStrimzi KafkaConnect(在 EKS 上自运维)
运维负担AWS 管理 worker infrastructure;你只管理 connector configuration你需要自行管理 worker pod scaling、monitoring 和 resource tuning
灵活性受限于 AWS 支持的 connector framework对任意 connectors、custom SMTs (Single Message Transforms)、sidecars 拥有完全自由
可移植性仅限 AWS 的服务,很难迁移到其他地方可原样移植到任何其他 Kubernetes cluster
Observability通过 CloudWatch Logs/Metrics 查看 connector status集成到与 EKS workloads 其余部分相同的 Prometheus/Grafana pipeline 中

与 Kinesis Data Streams 的比较与桥接

Kinesis Data Streams 和 Kafka 经常被一起提及,但它们不是兼容的协议。Kinesis 是一种 AWS-native streaming service,拥有自己的 API/SDK,并不了解 Kafka 的 producer/consumer protocol。MSK 被描述为“Kafka-compatible”并不意味着它能与 Kinesis 互操作 —— MSK 是 Apache Kafka protocol 的托管实现,而 Kinesis 是一个完全独立的服务。

方面Apache Kafka (MSK/Strimzi)Kinesis Data Streams
协议Open-source Kafka protocol,兼容广泛的 client/tooling ecosystemAWS-proprietary API,不兼容 Kafka clients
扩展单位Partitions(在 topic 创建时定义,可重新分区)Shards(read/write capacity units,通过 split/merge 调整)
运维复杂度需要运维 brokers/controllers(MSK 将其卸载给 AWS)完全托管,完全没有 server 概念
AWS service integration间接,通过 connectors(Kafka Connect、MSK Connect)原生,直接与 Lambda triggers、Firehose、Kinesis Data Analytics 集成
生态系统广泛的 open-source ecosystem:Kafka Streams、ksqlDB、Flink、Debezium更小、以 AWS-service 为中心的 ecosystem,但更易于集成
Retention实际上不受限制(只需为 storage 付费;默认 7 天)默认 24 小时,可扩展到最长 365 天(成本随之增加)

真正的桥接模式

如果你需要真正连接 Kafka 和 Kinesis —— 用于迁移,或与 legacy Kinesis consumers 桥接 —— 实用模式是在 Kafka Connect(或 MSK Connect)下运行 Kinesis connector,而不是依赖任何内置的 protocol compatibility。

  • Kinesis Sink connector:从 Kafka topic 读取 messages 并写入 Kinesis stream —— 适用于将基于 Kafka 的 pipeline 输出送入 Kinesis consumption ecosystem(Lambda、Firehose)
  • Kinesis Source connector:从 Kinesis stream 读取 records 并写入 Kafka topic —— 适用于在逐步将 consumers 迁移到 Kafka 的同时,保留现有 Kinesis producers

这些 connectors 可以部署在 MSK Connect 上,也可以通过 Strimzi 的 KafkaConnect/KafkaConnector CRs 直接运行在 EKS 上 —— 上一节中的 MSK Connect 与 Strimzi 取舍同样适用于这里。

决策指南

使用此 checklist 在自管理 Strimzi、MSK Provisioned、MSK Serverless 和 Kinesis 之间缩小选择范围。

  • 你的团队是否具备 Kafka 运维经验,并且需要细粒度调优/自定义配置? → 是:Strimzi(在 EKS 上自管理)/ 否:考虑 MSK
  • multi-cloud/on-prem 可移植性是否是硬性要求? → 是:Strimzi / 否:MSK 值得评估
  • 流量是否不可预测或有突发峰值,并且你想完全消除 broker capacity planning? → 是:MSK Serverless / 否:MSK Provisioned 或 Strimzi
  • 你是否已经深入投入 AWS-native event processing(Lambda、Firehose),并且不需要 Kafka ecosystem(Kafka Streams、ksqlDB 等)? → 是:评估 Kinesis Data Streams / 否:继续使用 Kafka(MSK/Strimzi)
  • 你是否希望通过与 EKS platform 其余部分相同的 GitOps pipeline 来管理 Kafka,而不增加 AWS console/IAM 界面? → 是:Strimzi / 否:MSK

在实践中,答案通常是“both” —— 为了速度在 MSK Serverless 上启动一个新服务,然后在需要 custom tuning 时迁移到 Strimzi,这是常见路径。

后续步骤

无论你运行 MSK 还是 Strimzi,都需要持续查看 broker metrics 和 consumer lag,以了解 cluster 是否健康。这是第 7 部分:监控的主题。

返回主页面

测验

要测试你在本章中学到的内容,请尝试主题测验