如何从 kubernetes (minikube) 中的应用程序连接到本地主机(主机)上的 kafka

How to Connect to kafka on localhost (host machine) from app inside kubernetes (minikube)

我正在尝试将我的 spring 启动应用程序(运行 inside minikube)连接到本地主机(即笔记本电脑)上的 kafka。

我尝试了很多东西,包括无头服务、没有选择器的服务、更新 minikube \etc\hosts,但还没有任何效果。

我从 spring 启动时收到错误提示 No resolvable bootstrap urls given in bootstrap.servers

有人可以指出我做错了什么吗?

我的无头服务

apiVersion: v1
kind: Service
metadata:
  name: es-local-kafka
  namespace: demo
spec:
  clusterIP: None
---
apiVersion: v1
kind: Endpoints
metadata:
  name: es-local-kafka
subsets:
  - addresses:
      - ip: "10.0.2.2"
    ports:
      - name: "kafkabroker1"
        port: 9191
      - name: "kafkabroker2"
        port: 9192
      - name: "kafkabroker3"
        port: 9193

我的 kafka 应用程序属性:

kafka.bootstrap-servers=${LOCALHOST}:9191,${LOCALHOST}:9192,${LOCALHOST}:9193

我的配置图:

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: rr-config
  namespace: demo
data:
  LOCALHOST: es-local-kafka.demo.svc

不确定您如何尝试在 Minikube 或本地系统上连接服务 运行 并希望在 minikube 上利用 kafka。

如果您的应用程序 运行 在本地系统上,Kafka 在 minikube 上

你也可以用minikube的IP把应用连接到Kafka集群

这是一个很好的例子:https://github.com/d1egoaz/minikube-kafka-cluster

Git 克隆:https://github.com/d1egoaz/minikube-kafka-cluster

cd minikube-kafka-cluster

kubectl apply -f 00-namespace/

kubectl apply -f 01-zookeeper/

kubectl apply -f 02-kafka/

kubectl apply -f 03-yahoo-kafka-manager/

kubectl get svc -n kafka-ca1 (Note the port of kafka 31445)

列出 minikube 的 Ip

minikube ip 

现在可以从本地系统连接到 minikube kafka,http://minikube-ip:port您将在浏览器中看到 UI kafka 管理器

如果你是运行 sprint boot application on the minikube

如果两个服务 运行 在同一个命名空间中,您只需使用服务名称即可连接

sprint boot中只有服务名,如果需要端口也可以传

es-local-kafka

也尝试通过完整服务

<servicename>.<namespace>.svc.cluster.local

无头服务用于不同的目的,没有选择器的服务很奇怪,在这种情况下您的服务将无法连接到 PODs。

我最终得到了修复,不需要我在问题中提到的所有疯狂的东西:

  1. 您需要确保您的 kafka 代理绑定到 0.0.0.0 而不是 127.0.0.0 (localhost) 。默认情况下,在单节点 kafka 代理设置中,这是使用的。我接受了这个,因为时间限制,而且这只是我当地的一个 POC(prod 将有一个特定的 dns-able kafka URL,并且不需要这样的 localhost 恶作剧)

  2. 在您的应用程序属性文件中的 kafka URL 中,您需要提供 ip 作为 minikube ip,而不是 localhost。如果您执行命令 minikube ip :)

    ,您将获得相同的 ip

在此处详细了解其工作原理:https://minikube.sigs.k8s.io/docs/handbook/host-access/