我有一个依赖于 kafka 服务的应用程序。
使用 Kafka 连接,在运行用于 Kafka 连接的 kubernetes pod 的 Linux 虚拟机上尝试 curl localhost:8083
时出现错误。
curl -v localhost:8083
给出:
kubectl get po -o wide
对于我的 kubernetes 命名空间给出:
当我使用 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
答案 0 :(得分:1)
如果不稍加修改,您将无法从集群外部连接到集群内部运行的服务。
您有三种可能的解决方案:
使用类型为 NodePort
或 LoadBalancer
的服务使服务可在集群外访问。
请参阅 services 和 kubectl expose 文档。
请注意,根据您的环境,这可能会将服务暴露给互联网。
使用代理动词访问:(见here)
这仅适用于 HTTP/HTTPS。如果您的服务不安全,请使用此选项 足以暴露在互联网上。
从集群内运行的 pod 访问。
正如您在评论中所注意到的,您可以从 pod 内部 curl
。您也可以从同一集群中运行的任何其他 pod 执行此操作。 Pod 之间无需任何额外配置即可相互通信。
为什么我在虚拟机上 ssh 时不能 curl 8083?
如果不使用上述方法(第 1 点或第 2 点)公开,则无法从集群外部访问 Pod/服务。
<块引用>为什么没有在具有 Pod 的主机 VM 上公开端口?
它不会在您的 VM 上公开,而是在您的集群内公开。
我强烈建议您阅读 Cluster Networking 文档以了解更多信息。