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

ClusterIP、Headless Service 和 NodePort 的比较

1. ClusterIP

1.1 定义

ClusterIP 是 Kubernetes 默认的 Service 类型,它会为 Service 分配一个虚拟的 IP 地址(ClusterIP),这个 IP 是集群内部的虚拟地址,仅在集群内部有效。

1.2 工作原理

  • 虚拟 IP:ClusterIP 是一个虚拟的 IP 地址,由 Kubernetes 网络管理。

  • 负载均衡:通过 kube-proxy 实现负载均衡,将请求转发到后端的 Pod。

  • 隐藏 Pod IP:客户端访问的是 ClusterIP,而不是 Pod 的真实 IP,Pod 的变化对客户端透明。

1.3 适用场景

  • 适用于集群内部的服务通信,例如微服务架构中,服务 A 需要调用服务 B。

  • 客户端不需要知道后端 Pod 的具体 IP,只需要通过一个固定的虚拟 IP(ClusterIP)访问服务。


2. Headless Service

2.1 定义

Headless Service 是一种特殊的 Service 类型,它不会分配 ClusterIP,而是直接将请求转发到后端的 Pod。

2.2 工作原理

  • 无 ClusterIP:Headless Service 不会分配虚拟的 ClusterIP。

  • 直接访问 Pod:客户端直接访问后端 Pod 的 IP 地址,而不是通过一个虚拟的 ClusterIP。

  • DNS 解析:如果需要负载均衡,客户端需要自行实现(例如通过 DNS 解析多个 Pod 的 IP)。

2.3 适用场景

  • 适用于需要直接访问 Pod 的场景,例如:

    • 客户端需要直接与 Pod 通信,而不是通过一个虚拟的 IP。

    • 客户端需要访问多个 Pod 的实例,并自行实现负载均衡。

    • 适用于基于 DNS 的服务发现,例如 StatefulSet 中的有状态服务。


3. NodePort

3.1 定义

NodePort 是一种 Service 类型,它通过每个节点的 IP 和一个固定的端口(NodePort)暴露服务,允许从集群外部访问。

3.2 工作原理

  • 节点端口:NodePort 会在每个节点上开放一个端口(默认范围是 30000-32767),并将请求转发到后端的 Pod。

  • 外部访问:客户端可以通过 <Node-IP>:<NodePort> 访问服务。

  • 简单直接:不依赖外部负载均衡器,直接通过节点的网络暴露服务。

3.3 适用场景

  • 适用于简单的外部访问场景,尤其是当集群没有外部负载均衡器时。

  • 适用于开发和测试环境,方便直接访问服务。


4. 具体区别

特性ClusterIPHeadless ServiceNodePort
是否分配 ClusterIP是,分配一个虚拟的 ClusterIP否,不分配 ClusterIP否,不分配 ClusterIP
负载均衡自动负载均衡,通过 kube-proxy不自动负载均衡,客户端需自行实现不自动负载均衡,通过节点端口暴露
客户端访问目标访问 ClusterIP,由 kube-proxy 转发到 Pod直接访问 Pod 的 IP 或通过 DNS 解析访问 <Node-IP>:<NodePort>
适用场景微服务之间的通信,隐藏 Pod 的真实 IP直接访问 Pod,适用于有状态服务或需要自定义负载均衡外部访问,适用于开发和测试环境
DNS 解析解析为 ClusterIP解析为 Pod 的 IP 列表不涉及 DNS 解析
是否支持外部访问仅限集群内部仅限集群内部支持外部访问

5. 示例场景

5.1 ClusterIP 示例

假设你有一个微服务架构,服务 A 需要调用服务 B。服务 B 通过 ClusterIP 暴露:

  • 客户端:服务 A

  • 目标:服务 B 的 ClusterIP

  • 行为:服务 A 只需要知道服务 B 的 ClusterIP,通过 kube-proxy 自动负载均衡到后端的 Pod。

  • 优点:服务 A 不需要关心服务 B 的 Pod 如何变化,只需要通过一个固定的 ClusterIP 访问即可。

具体表现

  • 服务 B 的 Pod 可能会动态变化(如扩缩容),但服务 A 仍然可以通过固定的 ClusterIP 访问,无需修改配置。


5.2 Headless Service 示例

假设你有一个 StatefulSet,用于运行有状态服务(如数据库集群)。每个 Pod 需要通过固定的 IP 或域名访问:

  • 客户端:其他服务或工具

  • 目标:Pod 的 IP 或通过 DNS 解析的域名

  • 行为:客户端直接访问 Pod 的 IP,而不是通过一个虚拟的 ClusterIP。客户端需要自行实现负载均衡(例如通过 DNS 解析多个 Pod 的 IP)。

  • 优点:客户端需要直接与 Pod 通信,而不是通过一个虚拟的 ClusterIP。

具体表现

  • 在 StatefulSet 中,每个 Pod 的 IP 是固定的,客户端可以通过 DNS 解析直接访问特定的 Pod,例如 mysql-0.mysql


5.3 NodePort 示例

假设你正在开发一个简单的 Web 应用,需要从集群外部访问:

  • 客户端:集群外部的用户

  • 目标:任意节点的 IP 和 NodePort(如 192.168.1.10:30080

  • 行为:客户端通过 <Node-IP>:<NodePort> 访问服务,请求会被转发到后端的 Pod。

  • 优点:简单易用,不需要外部负载均衡器。

具体表现

  • 你可以通过任意节点的 IP 和指定的 NodePort 访问服务,例如 curl 192.168.1.10:30080


6. 总结

6.1 ClusterIP

  • 核心特点:通过虚拟的 ClusterIP 提供服务,隐藏 Pod 的真实 IP,自动负载均衡。

  • 适用场景:集群内部的服务通信,例如微服务之间的调用。

  • 优点:客户端无需关心后端 Pod 的变化,访问简单且稳定。

6.2 Headless Service

  • 核心特点:不分配 ClusterIP,直接访问 Pod 的 IP 或通过 DNS 解析,客户端需要自行实现负载均衡。

  • 适用场景:需要直接访问 Pod 的场景,例如有状态服务(StatefulSet)或自定义负载均衡。

  • 优点:客户端可以直接与 Pod 通信,适合需要精确控制 Pod 访问的场景。

6.3 NodePort

  • 核心特点:通过节点的 IP 和固定端口暴露服务,支持外部访问。

  • 适用场景:简单的外部访问场景,尤其是开发和测试环境。

  • 优点:简单易用,不需要外部负载均衡器,直接通过节点网络暴露服务。

相关文章:

ClusterIP、Headless Service 和 NodePort 的比较

1. ClusterIP 1.1 定义 ClusterIP 是 Kubernetes 默认的 Service 类型&#xff0c;它会为 Service 分配一个虚拟的 IP 地址&#xff08;ClusterIP&#xff09;&#xff0c;这个 IP 是集群内部的虚拟地址&#xff0c;仅在集群内部有效。 1.2 工作原理 虚拟 IP&#xff1a;Clu…...

Ubuntu切换lowlatency内核

文章目录 一. 前言二. 开发环境三. 具体操作 一. 前言 低延迟内核&#xff08;Lowlatency Kernel&#xff09; 旨在为需要低延迟响应的应用程序设计的内核版本。Linux-lowlatency特别适合音频处理、实时计算、游戏和其他需要及时响应的实时任务。其主要特点是优化了中断处理、调…...

介绍一下Qt中的事件过滤

在 Qt 中&#xff0c;事件过滤&#xff08;Event Filter&#xff09;是一种强大的机制&#xff0c;它允许一个对象拦截并处理另一个对象接收到的事件。通过事件过滤&#xff0c;可以在事件到达目标对象之前对其进行监控和修改&#xff0c;这在很多场景下都非常有用&#xff0c;…...

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …...

微信小程序+SpringBoot的单词学习小程序平台(程序+论文+讲解+安装+修改+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 &#xff08;一&#xff09;社会需求背景 在全球化的大背景下&#xff0c;英语作为国际…...

快乐数 力扣202

一、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&…...

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案1

目的&#xff0c;判断是否主键重复&#xff0c;不重复则登录新数据&#xff0c;重复则不登录。 定义类型&#xff1a; DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下&#xff1a; 模拟数据库的登录过程。假设…...

Java基础面试题全集

1. Java语言基础 1.1 Java是什么&#xff1f; • Java是一种广泛使用的编程语言&#xff0c;最初由Sun Microsystems&#xff08;现为Oracle公司的一部分&#xff09;于1995年发布。它是一种面向对象的、基于类的、通用型的编程语言&#xff0c;旨在让应用程序“编写一次&…...

3.激活函数:神经网络中的非线性驱动器——大模型开发深度学习理论基础

激活函数在神经网络中扮演着至关重要的角色&#xff0c;它为模型引入非线性因素&#xff0c;使得网络能够拟合复杂的数据分布&#xff0c;从而实现高效的特征提取与预测。本文将从实际开发角度出发&#xff0c;介绍激活函数的基本概念、常见激活函数&#xff08;如 ReLU、GELU、…...

VUE的第二天

1. 指令修饰符 1.1什么是指令修饰符&#xff1f; ​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 1.2按键修饰符 keyup.enter —>当点击enter键的时候才触发 代码演示&#xff1a; <div id"app"><…...

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…...

尚硅谷爬虫note14

一、scrapy scrapy&#xff1a;为爬取网站数据是&#xff0c;提取结构性数据而编写的应用框架 1. 安装 pip install scrapy 或者&#xff0c;国内源安装 pip install scrapy -i https&#xff1a;//pypi.douban.com/simple 2. 报错 报错1&#xff09;building ‘twisted.te…...

/***************************所有笔记汇总目录***************************/

文章分类目录 STM32CubeMX 01、STM32CubeMX——定时器&#xff08;普通模式和PWM模式&#xff09; 02、STM32CubeMX——串口&#xff08;HAL库&#xff09; 03、STM32CubeMX——(uart_IAP串口)简单示例 04、STM32CubeMX——ADC采集单通道&#xff0c;多通道&#xff0c;内部…...

Spring Framework中的IoC容器

控制反转(Inversion of Control, IoC)与面向切面编程(Aspect Oriented Programming, AOP)是Spring Framework中最重要的两个概念&#xff0c;本章会着重介绍前者。 2.1.1什么是IoC容器 使用XML来配置类实例 定义一个Java Bean类 在resources文件夹中定义一个beans.xml文件&a…...

永洪科技深度分析实战,零售企业的销量预测

随着人工智能技术的不断发展&#xff0c;智能预测已经成为各个领域的重要应用之一。现在&#xff0c;智能预测技术已经广泛应用于金融、零售、医疗、能源等领域&#xff0c;为企业和个人提供决策支持。 智能预测技术通过分析大量的数据&#xff0c;利用机器学习和深度学习算法…...

2.数据结构-栈和队列

数据结构-栈和队列 2.1栈2.1.1栈的表示和实现2.1.2栈的应用举例数制转换括号匹配检验迷宫给求解表达式求值 2.1栈 栈是限定仅在表尾进行插入或删除操作的线性表&#xff0c;因此&#xff0c;对栈来说&#xff0c;表尾端有其特殊含义&#xff0c;称为栈顶&#xff08;top&#x…...

C++ MySQL 常用接口(基于 MySQL Connector/C++)

C MySQL 常用接口&#xff08;基于 MySQL Connector/C&#xff09; 1. 数据库连接 接口&#xff1a; sql::mysql::MySQL_Driver *driver; sql::Connection *con;作用&#xff1a; 用于创建 MySQL 连接对象。 示例&#xff1a; driver sql::mysql::get_mysql_driver_insta…...

android studio开发文档

android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…...

Java 对象与类——从 C++ 到 Java

文章目录 面向对象程序设计概述使用预定义类用户自定义类静态字段与静态方法方法参数对象构造包JAR 文件文档注释类设计技巧 面向对象程序设计概述 面向对象程序设计&#xff08;OOP&#xff09;在 20 世纪 70 年代出现&#xff0c;是当今主流编程范型&#xff0c;Java 是面向…...

java2025年常见设计模式面试题

1. 请解释建造者模式&#xff08;Builder Pattern&#xff09;及其应用场景。 答案&#xff1a; 建造者模式用于创建一个复杂的对象&#xff0c;同时允许用户只通过指定复杂对象的类型和内容就能构建它们&#xff0c;隐藏了复杂的构建逻辑。 示例&#xff1a; public class C…...

一篇文章讲解清楚ARM9芯片启动流程

SAM9X60 ARM9 boot启动流程关键词介绍&#xff1a; 第一级bootloader - 也叫boot ROM&#xff0c;是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置&#xff0c;查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…...

setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。

在 C/C 中&#xff0c;setlocale() 函数的参数 zh_CN.UTF-8、chs 和 chinese-simplified 均用于设置中文简体环境&#xff0c;但它们的语义、平台支持和编码行为存在显著差异&#xff1a; ​1. zh_CN.UTF-8&#xff08;推荐&#xff09;​ ​含义&#xff1a; zh_CN: 中文&…...

Python项目-基于Django的在线教育平台开发

1. 项目概述 在线教育平台已成为现代教育的重要组成部分&#xff0c;特别是在后疫情时代&#xff0c;远程学习的需求显著增加。本文将详细介绍如何使用Python的Django框架开发一个功能完善的在线教育平台&#xff0c;包括系统设计、核心功能实现以及部署上线等关键环节。 本项…...

【2025】Electron + React 架构筑基——从零到一的跨平台开发

引言 源代码仓库&#xff1a; Github仓库【electron_git】 你是否厌倦了在命令行中反复输入git status&#xff0c;却依然无法直观看到文件变化&#xff1f; 是否羡慕VS Code的丝滑Git集成&#xff0c;却苦恼于无法定制自己的专属工具&#xff1f; 本专栏将为你打开一扇新的…...

Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)

目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) &#xff08;0&#xff09;Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 &#xff08;1&#xff09;首先找到已建Vue3工程的目录。 &#xff08;2&#xff09;无需再下载依赖包&#xff0c;直接执行npm ru…...

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…...

Redis- 切片集群

切片集群 切片集群什么是Redis Cluster吗&#xff1f;为什么需要切片集群&#xff1f;Redis Cluster的数据分片机制是怎样的&#xff1f;哈希槽的算法是什么基本算法流程 待填坑 切片集群 什么是Redis Cluster吗&#xff1f;为什么需要切片集群&#xff1f; Redis Cluster是R…...

Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)

背景&#xff1a;问题如上标题&#xff0c;H3C所有交换机配置的model都是comware 解决方案&#xff1a; 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…...

力扣146 - LRU缓存

视频讲解 哈希 双向链表 为什么要用双向链表&#xff1f; 快速删除节点&#xff08;O(1&#xff09;&#xff09; 如果是单链表的话&#xff0c;删除一个节点时&#xff0c;需要从头遍历&#xff0c;找到前驱节点&#xff0c;才能修改 prev->next&#xff0c;导致 O(n)…...

单例模式:确保一个类只有一个实例

目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定&#xff08;Double-Checked Locking&#xff09; 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...