Docker Can';t通过MicroK8s集群中的Kubernetes节点端口服务访问Express.js服务

Docker Can';t通过MicroK8s集群中的Kubernetes节点端口服务访问Express.js服务,docker,express,kubernetes,microk8s,Docker,Express,Kubernetes,Microk8s,我有一个简单的Express.js服务器,当我像这样运行它时: docker run -p 3000:3000 mytag:my-build-id 响应很好,如果我使用工作站的LAN IP 现在,如果我使用如下服务部署声明将其部署到MicroK8s: apiVersion: v1 kind: Service metadata: creationTimestamp: null name: my-service spec: type: NodePort ports: - nam

我有一个简单的Express.js服务器,当我像这样运行它时:

docker run -p 3000:3000 mytag:my-build-id
响应很好,如果我使用工作站的LAN IP

现在,如果我使用如下服务部署声明将其部署到MicroK8s:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: my-service
spec:
  type: NodePort
  ports:
  - name: "3000"
    port: 3000
    targetPort: 3000
status:
  loadBalancer: {}
和pod规范(更新2019-11-05):

并通过
kubectl get services
获取暴露的节点端口为32750,并尝试在MicroK8s主机上访问它,如下所示:

卷曲

然后请求就挂起了,如果我试图从位于的工作站访问MicroK8s主机的LAN IP 然后,请求立即被拒绝

但是,如果我试着用

kubectl port-forward my-service-5db955f57f-q869q 3000:3000
那就好了

因此,pod部署似乎运行良好,而诸如microbot服务之类的示例服务在该集群上运行良好

我已确保Express.js服务器使用

app.listen(port, '0.0.0.0', () =>  ...
那么问题出在哪里呢

来自我的工作站的MicroK8s主机的LAN IP

这是你误解的主要根源;localhost、
127.0.0.1
和您机器的LAN IP与运行microk8s的虚拟机无关(如果在您的问题中实际包含这些信息,而不是我们不得不从一句话中推断出来,这将是非常有价值的)

我已确保Express.js服务器使用

app.listen(port, '0.0.0.0', () =>  ...
根据您稍后的报告:

然后,请求立即被拒绝

然后,事实上,您的express服务器并没有监听所有接口。这解释了为什么您可以成功地将端口转发到Pod(这会导致流量出现在Pod的本地主机上),但无法从Pod的“外部”到达它

您还可以通过使用集群内的另一个Pod来测试该理论,以
curl
端口3000上的Pod IP(从而绕过服务,从而绕过节点端口部件)

您很有可能错误配置了您的
Pod
Service
关系,但由于您没有发布
PodSpec
,并且您描述的行为听起来更像是一个明确的错误配置,因此我们将继续进行,直到有相反的证据为止

来自我的工作站的MicroK8s主机的LAN IP

这是你误解的主要根源;localhost、
127.0.0.1
和您机器的LAN IP与运行microk8s的虚拟机无关(如果在您的问题中实际包含这些信息,而不是我们不得不从一句话中推断出来,这将是非常有价值的)

我已确保Express.js服务器使用

app.listen(port, '0.0.0.0', () =>  ...
根据您稍后的报告:

然后,请求立即被拒绝

然后,事实上,您的express服务器并没有监听所有接口。这解释了为什么您可以成功地将端口转发到Pod(这会导致流量出现在Pod的本地主机上),但无法从Pod的“外部”到达它

您还可以通过使用集群内的另一个Pod来测试该理论,以
curl
端口3000上的Pod IP(从而绕过服务,从而绕过节点端口部件)

您很可能错误配置了您的
Pod
Service
关系,但由于您没有发布
PodSpec
,并且您描述的行为听起来更像是一种明显的错误配置,我们将继续这样做,直到我们有相反的证据

您需要在您的服务中添加一个。这将告诉Kubernetes如何找到您的部署。此外,您还可以使用nodePort指定服务的端口号。完成后,您将能够卷曲MicroK8s IP

您的服务YAML应如下所示:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: my-service
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30001
  selector: 
    name: my-service      
status:
  loadBalancer: {}
您需要向服务中添加一个。这将告诉Kubernetes如何找到您的部署。此外,您还可以使用nodePort指定服务的端口号。完成后,您将能够卷曲MicroK8s IP

您的服务YAML应如下所示:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: my-service
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30001
  selector: 
    name: my-service      
status:
  loadBalancer: {}

谢谢:我已经用pod规范更新了这个问题。关于无限价值的缺失信息:MicroK8s集群不是在虚拟机中运行,而是在裸机Linux主机上运行。问题的底部是Express配置中的一个片段,其中
'0.0.0.0'
应该声明服务在所有主机/IP上侦听,这也是默认的AFAIK。我确实尝试过在容器外的裸机上运行Express服务器,它至少会响应本地和主机IP。我可以提供更多缺少的信息吗?卷曲到另一个pod内的外壳中的pod IP和端口-
curlhttp://10.1.31.151:3000
-确实有效:所以我的服务声明一定有问题?我还应该补充的是,这些都是在非默认名称空间中运行的,但是部署和服务都是在使用
kubectl
指定名称空间时应用的-服务声明本身不应该有任何名称空间声明?(我以前在其他集群(GKE)上这样做过,没有遇到任何问题)(我尝试将部署和服务移动到默认名称空间,但没有更多运气。)谢谢:我用pod规范更新了这个问题。关于无限价值的缺失信息:MicroK8s集群不是在虚拟机中运行,而是在裸机Linux主机上运行。问题的底部是Express配置中的一个片段,其中
'0.0.0.0'
应该声明服务在所有主机/IP上侦听,这也是默认的AFAIK。我确实尝试过在容器外运行Express服务器,在裸机上运行