0

我正在尝试访问部署在笔记本电脑上运行的本地 Kubernetes 集群中的 Web api(Docker -> 设置 -> 启用 Kubernetes)。下面是我的 Pod Spec YAML。

kind: Pod
apiVersion: v1
metadata:
  name: test-api
  labels:
    app: test-api
spec:
  containers:
  - name: testapicontainer
    image: myprivaterepo/testapi:latest
    ports:
    - name: web
      hostPort: 55555
      containerPort: 80      
      protocol: TCP

kubectl get pods显示 test-api 正在运行。但是,当我尝试使用笔记本电脑上的http://localhost:55555/testapi/index连接到它时,我没有得到响应。但是,我可以使用 URL 从集群内不同 pod 中的容器访问应用程序(我对不同的容器执行了 kubectl exec -it)

http:// test-api pod 集群 IP /testapi/index

. 为什么我不能使用 localhost:hostport URL 访问应用程序?

4

1 回答 1

1

我会说这是强烈不推荐的。根据 k8s 文档:https ://kubernetes.io/docs/concepts/configuration/overview/#services

除非绝对必要,否则不要为 Pod 指定 hostPort。当您将 Pod 绑定到 hostPort 时,它会限制 Pod 可以调度的位置数量,因为每个 <hostIP, hostPort, protocol> 组合必须是唯一的。如果您没有明确指定 hostIP 和协议,Kubernetes 将使用 0.0.0.0 作为默认 hostIP 和 TCP 作为默认协议。

如果您只需要访问端口进行调试,则可以使用 apiserver 代理或 kubectl port-forward。

如果您明确需要在节点上公开 Pod 的端口,请考虑在使用 hostPort 之前使用 NodePort 服务。

所以... hostPort 对您的情况真的有必要吗?或者 NodePort 服务可以解决它?

如果确实有必要,那么您可以尝试使用从命令返回的 IP:

kubectl get nodes -o wide

http:// ip-from-the-command :55555/testapi/index

此外,另一个可能有助于您进行故障排除的测试是检查您的应用程序是否可以在 Pod IP 上访问。

更新

我已经在本地进行了一些测试,并且更好地理解了文档试图解释的内容。让我通过我的测试:

  • 首先我创建了一个 Pod hostPort: 55555,我用一个简单的 nginx 完成了它。
  • 然后我列出了我的 Pod,发现这个 Pod 正在我的一个特定节点上运行。
  • 之后我尝试通过我的主节点 IP 和其他节点 IP 访问端口 55555 中的 Pod,但没有成功,但是当尝试通过该 Pod 实际运行的节点 IP 访问时,它可以工作。

因此,“问题”(实际上这就是不推荐这种方法的原因)是 Pod 只能通过该特定节点 IP 访问。如果它重新启动并在不同的节点中启动,IP 也会发生变化。

于 2020-06-19T06:09:48.260 回答