【问题标题】:GKE Error: listen EACCES: permission denied on any portGKE 错误:监听 EACCES:任何端口上的权限被拒绝
【发布时间】:2020-09-26 01:50:36
【问题描述】:

我正在尝试在 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))

我在试图解决这个问题时完全不知所措,任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js kubernetes google-kubernetes-engine


    【解决方案1】:

    看起来它不能只绑定到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
      

    ✌️

    【讨论】:

      【解决方案2】:

      您的问题在environment variable conflicting with the service name。

      According to Kubernetes docs

      对于映射到名为 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

      【讨论】:

        猜你喜欢
        • 2022-01-09
        • 2021-10-30
        • 2020-10-11
        • 2014-06-10
        • 2016-11-14
        • 2023-02-08
        • 2020-06-14
        • 2021-07-22
        相关资源
        最近更新 更多