Kafka 连接 - 无法连接到本地主机端口 8083:连接被拒绝

时间:2021-06-25 06:44:42

标签: linux kubernetes apache-kafka-connect

我有一个依赖于 kafka 服务的应用程序。

使用 Kafka 连接,在运行用于 Kafka 连接的 kubernetes pod 的 Linux 虚拟机上尝试 curl localhost:8083 时出现错误。

curl -v localhost:8083 给出:

  • 重建 URL 为:localhost:8083/
  • 正在尝试 127.0.0.1...
  • 连接到 127.0.0.1 端口 8083 失败:连接被拒绝
  • 无法连接到本地主机端口 8083:连接被拒绝
  • 关闭连接 0 curl: (7) 无法连接到本地主机端口 8083:连接被拒绝

kubectl get po -o wide 对于我的 kubernetes 命名空间给出:

enter image description here

当我使用 sudo lsof -i -P -n | grep LISTEN 检查开放端口时,我没有看到列出 8083。 kafka 连接 pod 正在运行,并且该 pod 的日志中没有任何可疑内容。

有一个 kubernetes manifest,我认为它可能用于设置 Kafka 连接服务,这些是相关部分。我真的很感激任何关于如何找出为什么我不能卷曲 localhost:8083

的建议
apiVersion: apps/v1
kind: Deployment
metadata:
   name: kafka-connect
   namespace: my-namespace
spec:

   ...

   template:
     metadata:
       labels:
         app: connect
     spec:
        containers:
          - name: kafka-connect
            image: confluentinc/cp-kafka-connect:3.0.1
            ports:
              - containerPort: 8083

            env:
              
              - name: CONNECT_REST_PORT
                value: "8083"
              - name: CONNECT_REST_ADVERTISED_HOST_NAME
                value: "kafka-connect"

        volumes:
          - name: connect-plugins
            persistentVolumeClaim:
                claimName: pvc-connect-plugin
          - name: connect-helpers          
            secret:
              secretName: my-kafka-connect-config
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-connect
  namespace: my-namespace
  labels:
    app: connect  
spec:
  ports:
    - port: 8083
  selector:
    app: connect

1 个答案:

答案 0 :(得分:1)

如果不稍加修改,您将无法从集群外部连接到集群内部运行的服务。

您有三种可能的解决方案:

  1. 使用类型为 NodePortLoadBalancer 的服务使服务可在集群外访问。

    请参阅 serviceskubectl expose 文档。
    请注意,根据您的环境,这可能会将服务暴露给互联网。

  2. 使用代理动词访问:(见here

    这仅适用于 HTTP/HTTPS。如果您的服务不安全,请使用此选项 足以暴露在互联网上。

  3. 从集群内运行的 pod 访问。

    正如您在评论中所注意到的,您可以从 pod 内部 curl。您也可以从同一集群中运行的任何其他 pod 执行此操作。 Pod 之间无需任何额外配置即可相互通信。


<块引用>

为什么我在虚拟机上 ssh 时不能 curl 8083?

如果不使用上述方法(第 1 点或第 2 点)公开,则无法从集群外部访问 Pod/服务。

<块引用>

为什么没有在具有 Pod 的主机 VM 上公开端口?

它不会在您的 VM 上公开,而是在您的集群内公开。


我强烈建议您阅读 Cluster Networking 文档以了解更多信息。