簡體   English   中英

無法通過 MicroK8s 集群中的 Kubernetes NodePort 服務訪問 Express.js 服務

[英]Can't access an Express.js service via a Kubernetes NodePort service in a MicroK8s cluster

我有一個簡單的 Express.js 服務器 Dockerized,當我運行它時:

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

http://localhost:3000/響應很好,如果我使用我的工作站的 LAN IP,例如http60.44/1003。

現在,如果我使用如下服務部署聲明將其部署到 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 主機上訪問它,如下所示:

curl http://127.0.0.1:32750

那么請求就會掛起,如果我嘗試從位於http://192.168.191.248:32750/的工作站訪問 MicroK8s 主機的 LAN IP,那么請求會立即被拒絕。

但是,如果我嘗試使用

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

然后http://localhost:3000/工作得很好。

因此,pod 部署似乎運行良好,並且 microbot-service 等示例服務在該集群上運行良好。

我確保 Express.js 服務器監聽所有 IP

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

那么可能是什么問題?

您需要為您的服務添加一個選擇器 這將告訴 Kubernetes 如何找到您的部署。 此外,您可以使用 nodePort 指定服務的端口號。 之后,您將能夠 curl 您的 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/然后請求立即被拒絕。

那么看起來你的快遞服務器實際上並沒有在所有接口上監聽。 這就解釋了為什么您可以成功地將端口轉發到 Pod(這會導致流量出現在 Pod 的本地主機上)但不能從 Pod“外部”到達它

您還可以通過使用集群內的另一個 Pod 來測試該理論,以curl其 Pod IP 在端口 3000 上(為了避開服務和 NodePort 部分)

您錯誤配置PodService關系的可能性很小,但由於您沒有發布您的PodSpec ,並且您描述的行為聽起來更像是一個明確的錯誤配置,我們將 go 直到我們有證據從相反的方面來說

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM