Fastify 无法在 Docker / Kubernetes 上运行
Fastify not working on Docker / Kubernetes
我有一个非常简单的应用程序 returns "Hello World" 字符串,它在本地运行良好。正如您将从下面的应用程序代码中看到的那样,运行s 在端口 4000
上。当我创建 docker 图像和 运行 容器时,我无法从我的机器上的 localhost:4000
访问它,但我可以看到 docker 到达 node index.js
命令正确,应用程序 运行ning 没有任何错误。
我也尝试将它部署到 Kubernetes 集群,当我访问负载均衡器 ip 时,我得到 ERR_EMPTY_RESPONSE
。通过 kubectl
检查此应用程序后,我可以看到一切正常 运行ning,图像已下载并且 pod 为 运行ning。
我很难理解我错过了什么以及为什么它只在本地有效。
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);
}
});
Docker 文件
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
首先,当我尝试你的代码时,我尝试使用本地 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);
}
});
其余的应该是一样的。要在本地尝试,您可以使用:
参考:
我有一个非常简单的应用程序 returns "Hello World" 字符串,它在本地运行良好。正如您将从下面的应用程序代码中看到的那样,运行s 在端口 4000
上。当我创建 docker 图像和 运行 容器时,我无法从我的机器上的 localhost:4000
访问它,但我可以看到 docker 到达 node index.js
命令正确,应用程序 运行ning 没有任何错误。
我也尝试将它部署到 Kubernetes 集群,当我访问负载均衡器 ip 时,我得到 ERR_EMPTY_RESPONSE
。通过 kubectl
检查此应用程序后,我可以看到一切正常 运行ning,图像已下载并且 pod 为 运行ning。
我很难理解我错过了什么以及为什么它只在本地有效。
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);
}
});
Docker 文件
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
首先,当我尝试你的代码时,我尝试使用本地 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);
}
});
其余的应该是一样的。要在本地尝试,您可以使用:
参考: