簡體   English   中英

GKE 錯誤:監聽 EACCES:任何端口的權限被拒絕

[英]GKE Error: listen EACCES: permission denied on any port

我試圖在 GKE 上啟動我的 Express.js 應用程序,但是無論我指定哪個端口,我總是收到如下錯誤:

Error: listen EACCES: permission denied tcp://10.3.253.94:3000
    at Server.setupListenHandle [as _listen2] (net.js:1296:21)
    at listenInCluster (net.js:1361:12)
    at Server.listen (net.js:1458:5)
    at Function.listen (/srv/node_modules/express/lib/application.js:618:24)
    at Object.<anonymous> (/srv/src/index.js:42:5)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)

我嘗試了多個端口(8080、8000、3000)。 我已將用戶設置為 Docker 映像中的root

這是我的設置:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: api
  name: api
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      containers:
        - image: gcr.io/ellioseven-kbp/journal-api:1.0.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
          name: api
apiVersion: v1
kind: Service
metadata:
  labels:
    app: api
  name: api
  namespace: default
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: 3000
  selector:
    app: api
  type: NodePort
FROM node:12-alpine
ENV PATH /srv/node_modules/.bin:$PATH
ENV API_PORT 3000
ENV REDIS_HOST redis
COPY . /srv
WORKDIR /srv
ENV PATH /srv/node_modules/.bin:$PATH
RUN yarn install
CMD yarn start
EXPOSE 3000
USER root
const port = process.env.API_PORT || 3000
app.listen(port, () => console.log("Listening on " + port))

我完全無法解決這個問題,任何幫助將不勝感激。

看起來它不能只綁定到3000端口。 它可以是以下任何一種:

  • 不綁定到0.0.0.0 你可以試試:

     app.listen('3000','0.0.0.0',()=>{ console.log("server is listening on 3000 port"); })
  • 您在容器中以非特權用戶身份運行。 看看你是否可以啟動一個測試 pod 並在它啟動后運行命令。

     apiVersion: apps/v1 kind: Deployment metadata: labels: app: api name: api namespace: default spec: replicas: 1 selector: matchLabels: app: api template: metadata: labels: app: api spec: dnsPolicy: ClusterFirst restartPolicy: Always containers: - image: gcr.io/ellioseven-kbp/journal-api:1.0.14 imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] 👈 args: [ "while true; do sleep 30; done;" ] 👈 ports: - containerPort: 3000 name: api

    然后你可以連接到 pod 並嘗試啟動你的應用程序

    kubectl exec -it <pod-name> bash

✌️

您的問題是與服務名稱沖突的環境變量

根據 Kubernetes 文檔

對於映射到名為bar的容器的名為foo的服務,定義了以下變量:

 FOO_SERVICE_HOST=<the host the service is running on> FOO_SERVICE_PORT=<the port the service is running on>

更改服務名稱或環境變量

例如使用API_PORT_NUMBER而不是API_PORT

暫無
暫無

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

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