无法通过 MicroK8s 集群中的 Kubernetes NodePort 服务访问 Express.js 服务



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

docker run -p 3000:3000 mytag:my-build-id

http://localhost:3000/响应很好,如果我像这样使用工作站的LAN IPhttp://10.44.103.60:3000/

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

apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: my-service
spec:
type: NodePort
ports:
- name: "3000"
port: 3000
targetPort: 3000
status:
loadBalancer: {}

和吊舱规范类似(更新2019-11-05(:

apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
name: my-service
spec:
replicas: 1
selector:
matchLabels:
name: my-service
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
name: my-service
spec:
containers:
- image: mytag:my-build-id
name: my-service
ports:
- containerPort: 3000
resources: {}
restartPolicy: Always
status: {}

并通过kubectl get services获得暴露的NodePort为32750,并尝试在MicroK8s主机上访问,如:

卷曲http://127.0.0.1:32750

那么请求就会挂起,如果我试图从我的工作站访问MicroK8s主机的LAN IPhttp://192.168.191.248:32750/则该请求立即被拒绝。

但是,如果我试着用向前推进吊舱

kubectl port-forward my-service-5db955f57f-q869q 3000:3000

那么http://localhost:3000/效果很好。

因此,pod部署似乎运行良好,像microbot服务这样的示例服务在该集群上运行良好。

我已经确保Express.js服务器监听所有带有的IP

app.listen(port, '0.0.0.0', () =>  ...

那么问题出在哪里呢?

您需要在服务中添加一个选择器。这将告诉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: {}

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

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

我已经确保Express.js服务器监听所有带有的IP

基于您稍后报告的内容:

http://192.168.191.248:32750/则该请求立即被拒绝。

那么您的express服务器实际上并没有监听所有接口。这就解释了为什么你可以成功地将端口转发到Pod(这会导致流量出现在Pod的本地主机上(,但不能从Pod 的"外部"到达它

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

你很有可能误解了你的PodService关系,但由于你没有发布PodSpec,而且你所描述的行为听起来更像是一种明显的误解,我们将继续这样做,直到我们有相反的证据

最新更新