当前位置: 首页 > news >正文

在k8s中 ,数据包是怎么从外部流转进入到pod的?

       在 Kubernetes 中,当您创建 NodePort 类型的服务时,流量不会直接从主机的 IP 和端口转发到特定 Pod 的 IP 和端口。相反,流量被转发到集群中的一个节点,然后从那里转发到相应的 Pod。

1、当您创建 NodePort 类型的服务时,Kubernetes 会在集群中的每个节点上分配预定义范围(通常在 30000-32767 范围内)的端口。

2、当流量发送到指定 NodePort 上的主机 IP 地址时,接收流量的节点使用其内部路由来确定哪个 Pod 应接收流量。

3、然后,Kubernetes 使用服务的集群 IP 将流量转发到选定的 Pod。服务负责在与服务选择器匹配的容器之间对流量进行负载平衡。

总之,发往 NodePort 服务的流量首先发送到集群中的节点,然后根据服务的内部负载均衡机制将其路由到服务后面的某个 Pod。流量不会直接从主机 IP 和端口转发到特定的容器 IP 和端口。

eg:

假设你有一个 Kubernetes 集群,其中包括三个节点,它们分别有以下IP地址:

  • Node1: 192.168.1.100        节点 1:192.168.1.100
  • Node2: 192.168.1.101        节点 2:192.168.1.101
  • Node3: 192.168.1.102        节点 3:192.168.1.102

现在,你创建了一个 NodePort 类型的 Service,它暴露了端口 80,并选择了一组 Pod,这些 Pod 运行一个 Web 应用程序,监听端口 8080。你的 Service 配置可能如下所示:

apiVersion: v1
kind: Service
metadata:name: my-web-service
spec:selector:app: my-web-appports:- protocol: TCPport: 80targetPort: 8080type: NodePort

在这种情况下,Kubernetes会执行以下操作:

  1. Kubernetes为集群中的每个节点分配一个随机的 NodePort(在大多数情况下,NodePort会在30000到32767之间随机选择)。假设分配的NodePort为30080。

  2. 当有来自外部的请求,例如浏览器请求 http://Node1:30080 时,流量将被路由到 Node1,因为该请求使用了 Node1 的 IP 地址和 NodePort。

  3. 在 Node1 上,Kubernetes会检查 Service 的选择器(selector)以确定哪些 Pod 符合条件(在本例中是标记为 app: my-web-app 的 Pod)。

  4. Kubernetes将请求从 Node1 转发到符合条件的 Pod 中的一个,通常使用轮询或IP散列等方法来实现负载均衡。

  5. 请求最终到达一个运行你的 Web 应用程序的 Pod,该应用程序监听端口 8080,并响应请求。

总之,NodePort Service 将流量路由到集群中的一个节点,然后再根据 Service 的选择器将流量路由到符合条件的 Pod 上,以实现负载均衡。这是 Kubernetes 中一种常见的服务暴露方式,使得你可以通过节点的 IP 地址和 NodePort 来访问服务。

作为新手,你可能还要问那 外部用户怎么通过80端口进行访问呢?

如果你希望外部用户可以通过标准 HTTP 端口 80 访问你的服务,你可以使用 Kubernetes Ingress Controller 来将外部流量引导到你的 NodePort 服务。下面是一个简单的示例来说明这一点:

  1. 创建一个 NodePort 服务: 创建一个 NodePort 服务来公开你的应用程序,就像之前的示例中一样。这个服务将监听一个高端口(例如 30080),然后将流量路由到你的应用程序的 Pod。

  2. 创建 Ingress 资源: 创建一个 Ingress 资源,将外部 HTTP 流量引导到你的 NodePort 服务。下面是一个示例 Ingress 配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-ingress
spec:rules:- host: your-domain.com  # 你的域名http:paths:- path: /pathType: Prefixbackend:service:name: my-web-service  # 你的 NodePort 服务名称port:number: 80

在这个示例中,Ingress 规则将外部流量从域名 your-domain.com 引导到名为 my-web-service 的 NodePort 服务的端口 80。

  1. 部署 Ingress Controller: 你需要在集群中部署一个 Ingress Controller,例如 Nginx Ingress Controller 或 Traefik,以便它能够理解和处理 Ingress 资源。根据你选择的 Ingress Controller,你需要遵循相应的部署和配置指南。

  2. 配置域名解析: 在你的域名服务提供商处配置域名解析,将你的域名(例如 your-domain.com)指向集群中的一个或多个节点的公共 IP 地址。

一旦你完成上述步骤,外部用户将能够通过标准 HTTP 端口 80 访问你的服务。Ingress Controller 将负责将流量从域名引导到相应的 NodePort 服务,然后再路由到你的应用程序的 Pod。

http://www.lryc.cn/news/205771.html

相关文章:

  • 微信小程序设置 wx.showModal 提示框中 确定和取消按钮的颜色
  • 【Chrome】使用k8s、docker部署无头浏览器Headless,Java调用示例
  • springmvc http请求,支持get,post,附件传输和参数传输
  • linux性能分析(七)CPU性能篇(二)怎么理解平均负载
  • PostgreSQL12中浮点数输出算法优化带来的小问题
  • Hive安装配置笔记
  • 前端数据可视化之【Echarts下载使用】
  • 本机计算机上的mysql启动后停止
  • Java中ReentrantLock测试线程的安全
  • Vue-dvadmin-d2-crud-plus-常用配置-row-handle-columns-options
  • 【OpenCV实现图像的算数运算,性能测试和优化,改变颜色空间】
  • 多级缓存入门
  • CentOS卸载LVM磁盘的方法
  • ChatGPT:Spring Boot和Maven——Java应用开发的关键工具和区别
  • 智能振弦传感器:参数智能识别技术的重要科技创新
  • tooltip实现悬停内容染色
  • “深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“
  • Java|学习|多线程
  • 【Python机器学习】零基础掌握VotingClassifier集成学习
  • 深入了解JavaScript中的AJAX和HTTP请求
  • 第87步 时间序列建模实战:LSTM回归建模
  • GB/T28181协议介绍
  • 光致发光荧光量子检测的作用
  • 深度学习第四课
  • Linux创建临时文件mkstemp()tmpfile()
  • js的节流和防抖详解
  • 基于SpringBoot的水果销售网站
  • vue2进阶学习知识汇总
  • SQL SERVER连接oracle数据库几种方法
  • 存储优化知识复习三详细版解析