请原谅我的相对关系网无知,但我读过很多文档,但仍然很难理解这一点(也许是因为缺乏网络背景)。
考虑到这个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"]...this部署:
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,或者只是本地主机,如果服务进行集装箱港口和外部世界之间的映射?在服务中3000到80之间的映射有什么意义?
简而言之,为什么我需要NodePort?
发布于 2021-07-18 14:20:38
有两个网络层,我们可以称之为“集群内部”和“集群之外”。Pod和Service各有自己的IP地址,但这些地址仅在集群内。您需要NodePort将来自集群外部的请求转发到集群内部。
在“真正的”库伯内特斯集群中,你会提出一个请求.
使用物理系统的“正常”IP地址,连接到forwards...
http://web-service.default.svc.cluster.local:80/的NodePort端口,通过集群内部IP地址和服务端口,查看它选择的端口和服务端口,使用任何匹配的端口和服务端口的集群内部IP地址和目标端口。pod规范中的containerPort:并不是严格要求的(但是如果您给它name: http,那么您可以让服务指定targetPort: http,而不知道具体的端口号)。在这个序列中,Dockerfile中的EXPOSE几乎没有任何意义。
这个序列还为您提供了一些灵活性,不需要知道事情在哪里运行。假设您有100个节点和3个豆荚副本;初始连接可以是到任何节点,并且服务将转发到所有目标荚,而不需要从调用方了解任何这些细节。
(为了完整起见,LoadBalancer类型服务请求在集群之外创建负载均衡器;例如,AWS。这将转发到任何集群节点,如上面步骤1所示。如果您不在云环境中,而且集群不知道如何自动创建外部负载均衡器,则与NodePort相同。)
如果我们将其简化为本地Kubernetes安装( Desktop,minikube,kind),唯一真正的区别是只有一个节点;底层基础设施的构建仍然像一个多节点分布式集群一样。在这些安装中,访问服务的具体方式是不同的。在Desktop中,在第一步中,您可以使用localhost作为“正常”“外部”节点IP地址。
https://stackoverflow.com/questions/68429853
复制相似问题