K8S中Service详解(一)

Service介绍

在Kubernetes中,Service资源解决了Pod IP地址不固定的问题,提供了一种更稳定和可靠的服务访问方式。以下是Service的一些关键特性和工作原理:

  • Service的稳定性:由于Pod可能会因为故障、重启或扩容而获得新的IP地址,直接使用Pod的IP来访问服务是不可靠的。Service通过提供一个固定的虚拟IP(ClusterIP)作为访问入口,使得服务访问变得更加稳定。

  • Service的类型:Kubernetes支持不同类型的Service,包括ClusterIP、NodePort、LoadBalancer和ExternalName,每种类型适用于不同的访问场景:

    • ClusterIP:为Service在集群内部提供一个固定的虚拟IP,只有集群内部的客户端可以访问此服务。

    • NodePort:在所有节点的特定端口上公开Service,使得外部可以通过<NodeIP>:<NodePort>访问服务。

    • LoadBalancer:在NodePort的基础上,通过云服务商的负载均衡器对外提供服务,适用于公有云环境。

    • ExternalName:将服务映射到外部服务的DNS名称,不通过kube-proxy进行代理。

  • Service的负载均衡:Service可以对关联的Pod进行轮询或随机的负载均衡,使得请求可以均匀地分发到各个Pod上。

  • Service的发现机制:Kubernetes中的Pod可以通过DNS或环境变量来发现Service。通过DNS,Pod可以通过Service的名称和命名空间来解析Service的ClusterIP。

  • Service和Pod的关系:Service通过标签选择器(label selector)与一组Pod关联。当Service创建后,kube-proxy或相关的网络插件会监控Pod的变化,并更新Service的后端列表(Endpoints。

  • Headless Service:一种特殊的Service,不分配ClusterIP,而是通过DNS返回Pod的IP列表,适用于需要直接访问每个Pod的场景,如StatefulSets。

  • Service的端口:Service可以定义一个或多个端口,将外部请求映射到Pod的特定端口上。端口分为Service端口(port)、Pod端口(targetPort)和NodePort(仅NodePort类型Service)

 

  • Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则。

image-20240514095556728

 

kube-proxy三种工作模式

1. Userspace 模式

工作原理:
  • kube-proxy 在用户空间中运行,为每个 Service 创建一个监听端口,将发向 ClusterIP 的请求通过 iptables 规则重定向到 kube-proxy 的监听端口,然后 kube-proxy 根据负载均衡算法选择一个后端 Pod,将流量转发到 Pod。
优点:
  • 简单稳定:实现简单,适用于负载较低或要求不高的场景。
  • 负载均衡算法灵活:支持不同的负载均衡算法,如轮询、随机等。
  • 易于调试:由于运行在用户空间,问题较容易排查。
缺点:
  • 性能较低:每个请求都需要从内核空间经过用户空间进行转发,导致性能开销大,尤其是在高流量环境下。
  • 延迟较高:数据包需要在内核空间和用户空间之间来回拷贝,增加了延迟。
  • 不能进行智能重试:无法像 iptablesipvs 模式那样自动重试不可用的 Pod。
应用场景:
  • 低负载环境:适用于流量较小的 Kubernetes 集群,或者不对性能要求极高的应用场景。
  • 调试与开发:在开发和调试阶段使用,便于排查问题。

2. iptables 模式

工作原理:
  • kube-proxy 为每个 Service 后端的 Pod 创建对应的 iptables 规则,流量直接通过网络路由到相应的 Pod,而不经过 kube-proxy 进程本身。
优点:
  • 性能较好:与 userspace 模式相比,避免了用户空间和内核空间之间的数据拷贝,提高了性能。
  • 低延迟:直接修改内核中的路由规则,减少了处理过程中的开销,转发效率更高。
  • 简单高效:不需要额外的代理进程,适合大规模集群。
缺点:
  • 负载均衡策略简单:只能通过简单的轮询方式进行负载均衡,无法实现更复杂的负载均衡算法(如基于连接数或源 IP)。
  • 重试机制缺失:如果选定的 Pod 不可用,流量会被丢弃,不会自动重试。
  • 安全性问题:流量直接路由到 Pod,可能暴露给不受信任的网络,需要额外配置网络策略。
应用场景:
  • 高性能需求的应用:对于需要较高性能且负载均衡需求较简单的应用非常适合,如微服务架构中的 HTTP 或 DNS 服务。
  • 规模较大的集群:对于大规模集群,iptables 模式因其性能优势而被广泛使用。

3. ipvs 模式

工作原理:
  • kube-proxy 在内核空间使用 ipvs 进行负载均衡,监控 Pod 和 Service 的变化,并将相应的规则实时同步到 ipvs 中。
优点:
  • 性能最佳ipvs 在内核空间实现,避免了用户空间和内核空间的数据拷贝,提供极高的转发性能,尤其在高负载和大规模集群中表现优异。
  • 丰富的负载均衡算法:支持多种负载均衡算法,包括轮询、最小连接、源 IP 哈希等,能够满足更多复杂的负载均衡需求。
  • 会话保持:支持基于客户端 IP 或会话的会话保持,使得某些需要维持会话状态的应用(如 Web 应用)能够始终路由到同一 Pod。
  • 健康检查:可以基于 Pod 的健康状态进行流量路由,只将流量发送到健康的 Pod 上,提升可用性。
  • SNAT 优化:优化源地址转换(SNAT),对 NodePortLoadBalancer 类型的服务尤其有效。
  • 直接路由:通过直接路由减少了网络地址转换(NAT)开销,进一步提高了性能。
缺点:
  • 配置复杂:相较于 iptablesipvs 模式的配置和维护稍微复杂。
  • 内核依赖:需要内核支持 ipvs,如果内核版本过低或未开启 ipvs 支持,无法使用此模式。
应用场景:
  • 高性能要求的集群:适用于大规模、需要高吞吐量和低延迟的 Kubernetes 集群。
  • 复杂的负载均衡需求:适合需要多种负载均衡算法和会话保持机制的场景,例如大规模 Web 应用、数据库负载均衡等。
  • 高可用性要求:支持健康检查和流量路由到健康 Pod,提高应用的可用性。

总结对比:

模式性能配置复杂度支持的负载均衡算法会话保持健康检查重试机制应用场景
Userspace较差简单简单(轮询等)不支持不支持支持低负载环境,开发调试阶段
iptables较好中等简单(轮询)不支持不支持不支持高性能、简单需求、大规模集群
ipvs最好较复杂多种(轮询、最小连接等)支持支持支持高性能、高可用、大规模集群

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6183.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins-k8s pod方式动态生成slave节点

一. 简述&#xff1a; 使用 Jenkins 和 Kubernetes (k8s) 动态生成 Slave 节点是一种高效且灵活的方式来管理 CI/CD 流水线。通过这种方式&#xff0c;Jenkins 可以根据需要在 Kubernetes 集群中创建和销毁 Pod 来执行任务&#xff0c;从而充分利用集群资源并实现更好的隔离性…

LabVIEW滤波器选择与参数设置

在信号处理应用中&#xff0c;滤波器是去除噪声、提取目标信号的重要工具。LabVIEW 提供多种类型的滤波器&#xff08;如低通、高通、带通、带阻&#xff09;&#xff0c;用户需要根据采样频率、信号特性和应用需求合理选择滤波器类型及参数设置。本文以 采样率 100kHz&#xf…

iOS中的设计模式(四)- 抽象工厂

引言 在软件设计中&#xff0c;创建一个类的对象通常需要客户端知道该类的所有细节。而当需要同时创建一组相关对象时&#xff0c;且这些对象在运行时会根据不同的标准有所变化&#xff0c;这会变得更加复杂。此时&#xff0c;抽象工厂模式能够有效地简化这一过程。 抽象工厂…

deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_12

目录 1、下载链接1.1、CSDN链接&#xff0c;含权重文件直接使用&#xff0c;建议直接下这个&#xff0c;还不限速。1.2 Github链接&#xff1a;2、下载代码&#xff0c;下载预训练好的权重3、预测代码4、像素提取&#xff0c;或者说类别提取5、文档部分内容截图6、其他数据处理…

Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南

本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子&#xff1b;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…

KETTLE-SAP抽数报错RFC_ERROR_SYSTEM_FAILURE

KETTLE调SAP 合并ECCS相关的函数时报错 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Unexpected error 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-3…

困境如雾路难寻,心若清明步自轻---2024年创作回顾

文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份&#xff0c;我已写下一篇《近一年多个人总结》&#xff0c;当时还没开始写博客。四月份写博后&#xff0c;就顺手将那篇总…

2024 行远自迩,笃行不怠

2024年是充满变化与挑战的一年&#xff0c;我的开发方向经历了从智能驾驶到工业智能检测&#xff0c;再到机器人感知交互与决策的不断演进。 这一年&#xff0c;我不断拓宽技术视野&#xff0c;深入探索不同领域的技术挑战和应用场景。 最初&#xff0c;我希望专注于单一领域…

【Linux】19.基础IO(1)

文章目录 1. 基础IO1. 文件2. 回顾C文件接口2.1 hello.c写文件2.2 hello.c读文件2.3 接口介绍 3. open函数返回值3.1 文件描述符fd3.2 文件描述符的分配规则3.2.1 代码13.2.2 代码23.2.3 重定向底层原理代码示例3.2.4 使用 dup2 系统调用 3.3 缓冲区刷新问题3.4 FILE 1. 基础IO…

客户案例:向导ERP与金蝶云星空集成方案

一、客户背景 该客户公司主要致力于黄金、铂金、金镶玉首饰的研发设计、生产加工、批发及直营加盟业务。公司总部占地面积目前已达6000多平方米&#xff0c;拥有标准生产厂房和现代化生产设施&#xff0c;拥有一支完善的企业管理团队和专业技工队伍。 该企业目前同时采用向导 E…

RabbitMQ 在实际应用时要注意的问题

1. 幂等性保障 1.1 幂等性介绍 幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应⽤,⽽不会改变初始应⽤的结果. 应⽤程序的幂等性介绍 在应⽤程序中,幂等性就是指对⼀个系统进⾏重复调⽤(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果. ⽐如数据库…

Cesium特效——城市白模的科技动效的各种效果

最终效果图如下&#xff1a; 实现方法&#xff1a; 步骤一&#xff1a;使用cesiumlib生产白模&#xff0c;格式为3dtiles 注意事项&#xff1a;采用其他方式可能导致白模贴地&#xff0c;从而导致不能实现该效果&#xff0c;例如把步骤二的服务地址改为Cesium Sandcastle 里的…

4_高并发内存池项目_高并发池内存释放设计_ThreadCache/CentralCache/PageCache回收并释放内存

高并发池内存释放设计 对各缓存层释放内存的设计&#xff0c;不仅仅是从上一层回收内存&#xff0c;还包括对回收回来的内存怎样处理更有利于下一缓存层的回收&#xff0c;提高效率。 高并发内存池内存释放步骤&#xff1a; 线程对象释放内存 ↓↓↓↓↓ ThreadCache(1.回收线…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

分子动力学模拟里的术语:leap-frog蛙跳算法和‌Velocity-Verlet算法

分子动力学模拟&#xff08;Molecular Dynamics Simulation&#xff0c;简称MD&#xff09;是一种基于经典力学原理的计算物理方法&#xff0c;用于模拟原子和分子在给定时间内的运动和相互作用‌。以下是关于分子动力学模拟的一些核心术语和概念&#xff1a; ‌定义系统‌&am…

iOS开发设计模式篇第二篇MVVM设计模式

目录 一、什么是MVVM 二、MVVM 的主要特点 三、MVVM 的架构图 四、MVVM 与其他模式的对比 五、如何在iOS中实现MVVM 1.Model 2.ViewModel 3.View (ViewController) 4.双向绑定 5.文中完整的代码地址 六、MVVM 的优缺点 1.优点 2.缺点 七、MVVM 的应用场景 八、结…

【C++图论 并集查找】2492. 两个城市间路径的最小分数|1679

本文涉及知识点 C图论 并集查找&#xff08;并查集) LeetCode2492. 两个城市间路径的最小分数 给你一个正整数 n &#xff0c;表示总共有 n 个城市&#xff0c;城市从 1 到 n 编号。给你一个二维数组 roads &#xff0c;其中 roads[i] [ai, bi, distancei] 表示城市 ai 和 …

Linux应用编程(五)USB应用开发-libusb库

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…