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

时间:2020-06-19 01:18:43

标签: kubernetes kubernetes-pod pod kubernetes-networking

我正在尝试访问部署在笔记本电脑上运行的本地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访问应用程序?

1 个答案:

答案 0 :(得分:1)

我强烈建议您不要这样做。 根据k8s文档:https://kubernetes.io/docs/concepts/configuration/overview/#services

除非绝对必要,否则请不要为Pod指定hostPort。将Pod绑定到hostPort时,它会限制Pod可以安排的位置数,因为每个组合必须唯一。如果未明确指定hostIP和协议,Kubernetes将使用0.0.0.0作为默认hostIP,使用TCP作为默认协议。

如果仅出于调试目的而需要访问端口,则可以使用apiserver代理或kubectl端口转发。

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

那么...您的案例上真的需要hostPort吗?还是NodePort服务可以解决这个问题?

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

kubectl get nodes -o wide

http:// 命令中的IP :55555 / testapi / index

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

更新

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

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

因此,“问题”(实际上是不建议采用这种方法的原因)是,只能通过该特定的节点IP来访问Pod。如果重新启动并在其他节点中启动,则IP也会更改。