Fastify が Docker / Kubernetes で動作しない 質問する

Fastify が Docker / Kubernetes で動作しない 質問する

「Hello World」という文字列を返す非常にシンプルなアプリがあり、ローカルでは問題なく動作します。以下のアプリ コードからわかるように、ポートで実行されます4000。docker イメージを作成してコンテナーを実行すると、マシンからはアクセスできませんが、docker がコマンドを正しく実行し、アプリがエラーなしで実行されていることlocalhost:4000が確認できます。node index.js

また、Kubernetes クラスターにデプロイしようとしましたが、ロード バランサーの IP にアクセスすると、次のメッセージが表示されます。ERR_EMPTY_RESPONSEこのアプリを検査すると、kubectlすべてが正常に実行されており、イメージがダウンロードされ、ポッドが実行されていることがわかります。

何を見逃したのか、なぜそれがローカルでしか機能しないのか理解するのに苦労しています。

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

ベストアンサー1

fastifyまず、あなたのコードを試したとき、ローカルの docker を使用してみましたが、動作はまったく同じだったので、デフォルトでは のみを listen するという事実が原因であると予想していますlocalhost

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

Docker 内では、'0.0.0.0'デフォルトではインターフェースfastifyのみをlisten するため、明示的に指定する必要がありますlocalhost 127.0.0.1。利用可能なすべての IPv4 インターフェースを listen するには、例0.0.0.0を次のように変更して listen する必要があります。

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/#最初のサーバー

おすすめ記事