Fastify 在 Docker / Kubernetes 上无法工作

16

我有一个非常简单的应用程序,返回“Hello World”字符串,在本地运行良好。如下面的应用程序代码所示,它在端口4000上运行。当我创建Docker镜像并运行容器时,无法从我的计算机上的localhost:4000访问它,但我可以看到Docker正确执行了node index.js命令,并且应用程序没有任何错误。

我还尝试将其部署到Kubernetes集群,当我访问负载均衡器IP时,我收到ERR_EMPTY_RESPONSE。通过kubectl检查此应用程序后,我可以看到一切正常,镜像已下载并且Pod正在运行。

我很难理解我错过了什么以及为什么它只在本地工作。

NodeJS应用程序

import fastify from 'fastify';

const server = fastify();

server.get('/', (_request, reply) => {
   reply.status(200).send("Hello World");
});

server.listen(4000, error => {
  if (error) {
    process.exit(1);
  }
});

Dockerfile
FROM node:14.2-alpine

WORKDIR /app

COPY package.json yarn.lock /app/

RUN yarn

COPY . .

EXPOSE 4000

CMD ["node", "index.js"]

Kubernetes清单

---
# Load balancer
apiVersion: v1
kind: Service
metadata:
  name: development-actions-lb
  annotations:
    service.beta.kubernetes.io/do-loadbalancer-name: "development-actions-lb"
    service.beta.kubernetes.io/do-loadbalancer-algorithm: "round_robin"
spec:
  type: LoadBalancer
  selector:
    app: development-actions
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 4000
---
# Actions deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: development-actions
spec:
  replicas: 1
  selector:
    matchLabels:
      app: development-actions
  template:
    metadata:
      labels:
        app: development-actions
    spec:
      containers:
        - image: registry.digitalocean.com/myapp/my-image:latest
          name: development-actions
          ports:
            - containerPort: 4000
              protocol: TCP
      imagePullSecrets:
        - name: registry-myapp
3个回答

37

当我尝试您的代码时,我使用本地docker进行尝试,但行为仍然相同,因此我认为这是因为fastify默认只侦听localhost

docker build -t development-actions:latest .
docker run -it -p 4000:4000 development-actions:latest

在Docker内,你应该明确地提到'0.0.0.0',因为默认情况下fastify只监听本地接口localhost 127.0.0.1。为了在所有可用的IPv4接口上监听,示例应进行修改以侦听0.0.0.0,就像我将其更改为以下内容:
const server = require('fastify')({ logger: true })

server.get('/', (_request, reply) => {
   reply.status(200).send("Hello World");
});

server.listen(4000, '0.0.0.0', error => {
  if (error) {
    process.exit(1);
  }
});

其余部分应该是相同的。要在本地尝试,请使用以下命令:

参考资料:

  1. https://www.fastify.io/docs/latest/Getting-Started/#your-first-server

就是这样!谢谢,我卡了一段时间。 - Ilja
那真的救了我的一天! - huudyy

10
如果您在2023年之后阅读此信息,则API已更改。请尝试:
fastify.listen({ port: 4000, host: '0.0.0.0' }, (err, address) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  console.info(`Server listening on ${address}`);
});

0

我将主机变量设置为'0.0.0.0',解决了我的问题,在fastify.listen({port:3000, host: '0.0.0.0'}, () -> {})中, 一切都正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接