Kubernetes 本地集群 Pod hostPort - 应用程序无法访问

Kubernetes local cluster Pod hostPort - application not accessible

我正在尝试访问在我的笔记本电脑上部署到本地 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 显示测试-api 运行。但是,当我尝试从笔记本电脑使用 http://localhost:55555/testapi/index 连接到它时,我没有收到任何响应。但是,我可以使用 URL

从集群中不同 pod 中的容器访问应用程序(我对不同的容器执行了 kubectl exec -it)

http://test-api pod cluster IP/testapi/index

。为什么我无法使用 localhost:hostport URL 访问应用程序?

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

Don't specify a hostPort for a Pod unless it is absolutely necessary. When you bind a Pod to a hostPort, it limits the number of places the Pod can be scheduled, because each <hostIP, hostPort, protocol> combination must be unique. If you don't specify the hostIP and protocol explicitly, Kubernetes will use 0.0.0.0 as the default hostIP and TCP as the default protocol.

If you only need access to the port for debugging purposes, you can use the apiserver proxy or kubectl port-forward.

If you explicitly need to expose a Pod's port on the node, consider using a NodePort Service before resorting to hostPort.

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

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

kubectl get nodes -o wide

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

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

更新

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

  • 首先我用 hostPort: 55555 创建了一个 Pod,我用一个简单的 nginx 完成了。
  • 然后我列出了我的 Pods 并看到这个 运行 在我的一个特定节点上。
  • 之后我尝试通过我的主节点IP和其他节点IP访问55555端口的Pod,但没有成功,但是当尝试通过这个Pod实际所在的节点IP访问时运行,成功了。

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