「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);
}
});
残りは同じです。ローカルで試すには、以下を使用します。
参照: