请原谅我对网络的相对无知,但我已经阅读了很多文档,但仍然无法理解这一点(可能是由于缺乏网络背景)。
鉴于此 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
我的理解是:
我的假设正确吗?如果服务在容器端口和外部世界之间进行映射,我不清楚为什么我无法在 localhost:80 或仅 localhost 访问我的应用程序?服务中 3000 和 80 之间的映射有什么意义?
简而言之,我为什么需要 NodePort?
有两个网络层,我们可以称之为“集群内”和“集群外”。Pod 和 Service 都有自己的 IP 地址,但这些仅在集群内部。您需要 NodePort 将请求从集群外部转发到集群内部。
在“真正的”Kubernetes 集群中,您会发出一个请求……
http://any-kubernetes-node.example.com:31245/
,以您期望物理系统具有的方式使用“正常”IP 地址,连接到 NodePort 端口,该端口转发...http://web-service.default.svc.cluster.local:80/
,带有集群内部 IP 地址和服务端口,它查看它选择和转发的 pod...http://10.20.30.40:3000/
,使用任何匹配 pod 的集群内部 IP 地址和服务的目标端口。将containerPort:
在群规格没有严格要求(但如果你给它name: http
,那么你可以有指定服务targetPort: http
,而不知道具体的端口号)。EXPOSE
在 Dockerfile 中在这个序列中几乎没有任何意义。
此序列还为您提供了一些灵活性,无需知道事情在哪里运行。假设您有 100 个节点和 3 个 pod 副本;初始连接可以连接到任何节点,服务将转发到所有目标 Pod,您无需从调用者那里知道任何这些详细信息。
(为了完整起见,LoadBalancer 类型的服务请求在集群外创建负载均衡器;例如,AWS ELB。这将转发到上述步骤 1 中的任何集群节点。如果您不在云环境中并且集群不知道如何自动创建外部负载均衡器,它与NodePort相同。)
如果我们将其简化为本地 Kubernetes 安装(Docker Desktop、minikube、kind),唯一真正的区别是只有一个节点;底层基础设施仍然像一个多节点分布式集群一样构建。您访问服务的准确方式因这些安装而异。在 Docker Desktop 中,从主机系统,您可以localhost
在第一步中将其用作“正常”“外部”节点 IP 地址。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句