首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要本地Kubernetes集群中的NodePort?

为什么我需要本地Kubernetes集群中的NodePort?
EN

Stack Overflow用户
提问于 2021-07-18 14:03:19
回答 1查看 168关注 0票数 1

请原谅我的相对关系网无知,但我读过很多文档,但仍然很难理解这一点(也许是因为缺乏网络背景)。

考虑到这个Dockerfile:

代码语言:javascript
复制
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部署:

代码语言:javascript
复制
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

这项服务:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  type: NodePort
  selector:
    app: web-pod
  ports:
    - port: 80
      targetPort: 3000
      protocol: TCP
      name: http

我的理解是:

  1. --我的容器中的应用程序在3000
  2. 上向外界公开--我的部署yaml在说,“容器正在监听3000”
  3. ,我的服务是将map 3000内部映射到端口80,这是默认端口,所以您不必将端口添加到主机上。
  4. 是使用NodePort类型的,因为在Desktop这样的本地集群上,它可以在方框之外工作,而不是LoadBalancer。它在每个节点上打开一个随机端口(pod?)在30000到32767年间集群的外部。这个节点端口是我从外部访问应用程序的方式。例如localhost:30543.

我的假设正确吗?我不清楚为什么我不能访问我的应用程序在localhost:80,或者只是本地主机,如果服务进行集装箱港口和外部世界之间的映射?在服务中3000到80之间的映射有什么意义?

简而言之,为什么我需要NodePort?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-18 14:20:38

有两个网络层,我们可以称之为“集群内部”和“集群之外”。Pod和Service各有自己的IP地址,但这些地址仅在集群内。您需要NodePort将来自集群外部的请求转发到集群内部。

在“真正的”库伯内特斯集群中,你会提出一个请求.

使用物理系统的“正常”IP地址,连接到forwards...

  • ...to 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地址。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68429853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档