如何在 Kubernetes 中向外部公开 StatefulSet 的无头 Kafka 服务

2024-01-09

Using Kubernetes-Kafka https://github.com/Yolean/kubernetes-kafka作为 minikube 的起点。

这使用了 StatefulSet 和无头服务 https://github.com/Yolean/kubernetes-kafka/blob/master/20dns.yml用于集群内的服务发现。

目标是向外部公开各个 Kafka Brokers,其内部地址如下:

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

限制是该外部服务能够专门针对经纪人。

解决这个问题的正确(或一种可能)方法是什么?是否可以公开一个外部服务kafka-x.broker.kafka.svc.cluster.local:9092?


我们在 1.7 中解决了这个问题,将无头服务更改为Type=NodePort并设置externalTrafficPolicy=Local。这会绕过服务的内部负载平衡,并且只有当 Kafka Pod 位于该节点上时,发往该节点端口上特定节点的流量才会起作用。

apiVersion: v1
kind: Service
metadata:
  name: broker
spec:
  externalTrafficPolicy: Local
  ports:
  - nodePort: 30000
    port: 30000
    protocol: TCP
    targetPort: 9092
  selector:
    app: broker
  type: NodePort

例如,我们有两个节点nodeA和nodeB,nodeB正在运行一个kafka pod。 NodeA:30000 将无法连接,但 NodeB:30000 将连接到在 NodeB 上运行的 kafka pod。

https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typenodeport https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typenodeport

请注意,这在 1.5 和 1.6 中也作为 beta 注释提供,可以在此处找到有关功能可用性的更多信息:https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip

另请注意,虽然这将 kafka pod 绑定到特定的外部网络身份,但它并不能保证您的存储卷将绑定到该网络身份。如果您在 StatefulSet 中使用 VolumeClaimTemplates,那么您的卷将与 pod 绑定,而 kafka 希望卷与网络身份绑定。

例如,如果 kafka-0 pod 重新启动并且 kafka-0 在 NodeC 而不是 NodeA 上出现,则 kafka-0 的 PVC(如果使用 VolumeClaimTemplates)具有用于 NodeA 的数据,并且在 kafka-0 上运行的代理开始拒绝请求它是节点A而不是节点C。

为了解决这个问题,我们期待本地持久卷,但现在我们的 kafka StatefulSet 有一个 PVC,数据存储在$NODENAME在该 PVC 上将卷数据绑定到特定节点。

https://github.com/kubernetes/features/issues/121 https://github.com/kubernetes/features/issues/121 https://kubernetes.io/docs/concepts/storage/volumes/#local https://kubernetes.io/docs/concepts/storage/volumes/#local

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Kubernetes 中向外部公开 StatefulSet 的无头 Kafka 服务 的相关文章

  • Apache Kafka 消费者组的偏移量如何过期?

    当我注意到一些奇怪的行为时 我正在对一个旧主题进行一些测试 阅读 Kafka 的日志时 我注意到这条 删除了 8 个过期的偏移量 消息 GroupCoordinator 1001 Stabilized group GROUP NAME ge
  • 如何为容器设置正确的 cpu 毫核?

    我想要优化配置 CPU 核心 而不会分配过多或不足 如何测量给定容器所需的 CPU 毫核 它还带来了一个问题 即代理将根据 CPU 消耗将多少流量发送到任何给定的 Pod 以便我们可以最佳地使用计算 目前我发送请求并进行监控 kubectl
  • 如何使用 C# 从 Kafka 获取主题列表

    我想从卡夫卡获取主题列表 我正在使用 kafka net 客户端 但无法在有关获取主题列表的文档中找到 您可以使用 Confluence Kafka 包中提供的 AdminClient 列出所有主题 using Confluent Kafk
  • Kafka 适合运行公共 API 吗?

    我有一个想要发布的事件流 它被划分为主题 不断更新 需要水平扩展 并且没有 SPOF 很好 并且可能需要在某些情况下重播旧事件 所有的功能似乎都与 Kafka 的功能相匹配 我想通过任何人都可以连接并获取事件的公共 API 将其发布到全世界
  • 事务性 Kafka 生产者

    我正在尝试让我的卡夫卡生产者具有事务性 我正在发送 10 条消息 如果发生任何错误 则不应向 kafka 发送任何消息 即不发送或全部消息 我正在使用 Spring Boot KafkaTemplate Configuration Enab
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • Kafka REST 代理 API 有哪些好处?

    我不知道Kafka REST Proxy API的优点 它是一个 REST API 所以我知道它对于管理来说很方便 人们为什么使用 Kafka REST 代理 API 添加对生产者或消费者的 Maven 依赖是否很麻烦 另外 我知道kafk
  • 如何将新的 Kubernetes Minion 添加到当前集群

    我有一个运行在 3 台服务器上的 Kubernetes 集群 一台主服务器和 2 台服务器 我想添加另一个小黄人 是否可以添加 Minion 而无需再次进行完整安装 到目前为止 在寻找执行此操作的指南时 我只能找到有关建立整个集群的优秀指南
  • 找不到 io.confluence:kafka-protobuf-serializer:6.0.0

    直接的问题是 为什么 Gradle 没有解决我添加的这个依赖关系 dependencies kafka protobuf serializer implementation io confluent kafka protobuf seria
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • Kafka Streams 如何处理包含不完整数据的分区?

    Kafka Streams 引擎将一个分区映射到一个工作线程 即 Java 应用程序 以便该分区中的所有消息都由该工作线程处理 我有以下场景 并试图了解它是否仍然可行 我有一个主题 A 有 3 个分区 发送给它的消息由 Kafka 随机分区
  • Google Kubernetes Engine 中的存储 ReadWriteMany

    有没有一种方法能够提供 ReadWriteMany 存储而无需实现存储集群 我能够使用 gcsfuse 提供存储 但速度非常慢 我需要接近 GlusterFS 速度的东西 我目前正在使用 GlusterFS 另一种选择 Google Clo
  • 为什么 tty 在命令完成后挂起?

    我想运行这样的命令 kubectl run busybox it rm restart Never image busybox command sh c env 预计运行命令并删除 pod 它打印变量 但随后终端冻结 尽管 pod 处于完成
  • Kafka JDBC Sink Connector 对于具有可选字段的模式的消息给出空指针异常

    Kafka JDBC Sink Connector 对于具有可选字段 parentId 的模式的消息给出空指针异常 我错过了什么吗 我正在使用开箱即用的 JSONConverter 和 JDBC Sink Connector 关于 Kafk
  • 带有安全 Kafka 抛出的 Spark 结构化流:无权访问组异常

    为了在我的项目中使用结构化流 我正在 hortonworks 2 6 3 环境上测试 Spark 2 2 0 和 Kafka 0 10 1 与 Kerberos 的集成 我正在运行下面的示例代码来检查集成 我能够在 Spark 本地模式下的
  • Kafka 分区键无法正常工作

    我正在努力解决如何正确使用分区键机制的问题 我的逻辑是设置分区号为3 然后创建三个分区键为 0 1 2 然后使用分区键创建三个KeyedMessage 例如 KeyedMessage 主题 0 消息 KeyedMessage 主题 1 消息
  • K8s服务无法ping通

    我在 minikube 集群中有一个 k8s 服务 部署 名称amq in default命名空间 D20181472 argo k8s gms kubectl get svc all namespaces NAMESPACE NAME T
  • 如何在 Kubernetes 中按特定顺序配置 Pod 初始化?

    我想知道如何按特定顺序开始部署 我知道initContainers但这对我不起作用 我有一个巨大的平台 有大约 20 个部署和 5 个有状态集 每个都有自己的服务 环境变量 卷 水平自动缩放器等 所以不可能 或者我不知道如何 在另一个中定义
  • 如何将 kubectl 配置文件与 ~/.kube/config 合并?

    有没有一个简单的kubectl命令采取kubeconfig文件 包含 cluster context user 并将其合并到 kube config 文件作为附加上下文 Do this export KUBECONFIG kube conf
  • 如何从容器内运行 podman?

    我想跑podman https podman io作为运行 CI CD 管道的容器 但是 我不断从 podman 容器中收到此错误 podman info ERRO 0000 overlay is not supported over ov

随机推荐