【发布时间】:2021-07-18 22:20:38
【问题描述】:
请原谅我对网络的相对无知,但我已经阅读了很多文档,但仍然无法理解这一点(可能是由于缺乏网络背景)。
鉴于此 Dockerfile:
from node:lts-slim
RUN mkdir /code
COPY package.json /code/
WORKDIR /code
RUN npm install
COPY server.js /code/
EXPOSE 3000
CMD ["node", "server.js"]
...这个部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web-pod
template:
metadata:
labels:
app: web-pod
spec:
containers:
- name: web
image: kahunacohen/hello-k8s
ports:
- containerPort: 3000
protocol: TCP
还有这项服务:
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
selector:
app: web-pod
ports:
- port: 80
targetPort: 3000
protocol: TCP
name: http
我的理解是:
- 我容器中的应用程序在 3000 上将自己暴露给外界
- 我的部署 yaml 说“容器正在侦听 3000”
- 我的服务是在内部将 3000 映射到端口 80,这是默认端口,因此您不必将该端口添加到主机。
- 我正在使用 NodePort 类型,因为在 Docker Desktop 等本地集群上,它可以开箱即用,而不是 LoadBalancer。它在 30000-32767 之间的每个节点(pod?)上打开一个随机端口到集群外部。该节点端口是我从外部访问我的应用程序的方式。例如。本地主机:30543。
我的假设是否正确?我不清楚为什么我不能在 localhost:80 访问我的应用程序,或者只是 localhost,如果该服务在容器端口和外部世界之间进行映射?服务中3000到80的映射有什么意义?
简而言之,我为什么需要 NodePort?
【问题讨论】:
标签: kubernetes