目录

Service的定义

核心定义

Service 的类型

关键组件与机制

工作流程示例

高级特性

 Service工作原理

核心工作原理

标签选择器(Label Selector)

Endpoints 对象

网络代理与负载均衡(kube-proxy)

userspace 模式(已淘汰)

iptables 模式(默认)

IPVS 模式(推荐高性能场景)

Service 类型与流量路由

ClusterIP(默认)

NodePort

LoadBalancer

ExternalName


Service的定义

在 Kubernetes(K8s)中,Service 是一个核心抽象资源,用于为一组具有相同功能的 Pod 提供稳定的网络访问入口,并实现服务发现、负载均衡和抽象隔离。

核心定义

  • 逻辑抽象层:Service 将一组动态变化的 Pod(通过标签选择器匹配)抽象为一个逻辑服务单元,客户端无需关心后端 Pod 的具体数量、IP 地址或位置。
  • 稳定访问入口:为 Pod 分配一个固定的 ClusterIP(虚拟 IP),该 IP 在 Service 生命周期内不变,即使后端 Pod 重建或扩缩容。
  • 负载均衡:自动将客户端请求分发到匹配的 Pod,支持轮询(默认)、随机、会话保持等策略。

Service 的类型

根据网络访问方式,Service 分为以下四种类型:

类型访问范围适用场景
ClusterIP仅集群内部访问(默认)内部服务间通信(如微服务调用、数据库访问)。
NodePort集群外部通过节点 IP+端口访问开发测试或临时暴露服务(需手动指定节点端口,范围通常为 30000-32767)。
LoadBalancer外部负载均衡器(云环境)生产环境暴露服务,自动创建云厂商的负载均衡器(如 AWS ALB、GCP Load Balancer)。
ExternalName通过 DNS CNAME 映射外部服务访问集群外部服务(如数据库、第三方 API),无需在集群内运行 Pod。

关键组件与机制

  • 标签选择器(Label Selector)
    • 通过 spec.selector 字段匹配 Pod 的标签(如 app: nginx),动态关联后端 Pod。
    • 示例:
      apiVersion: v1
      kind: Service
      metadata:name: nginx-service
      spec:selector:app: nginx  # 匹配所有标签为 app=nginx 的 Podports:- protocol: TCPport: 80    # Service 暴露的端口targetPort: 80  # Pod 的容器端口
    • Endpoints 对象
      • K8s 自动为每个 Service 创建同名的 Endpoints 资源,记录当前匹配的 Pod IP 和端口。
      • 通过 kubectl get endpoints nginx-service 可查看实时关联的 Pod。
    • ClusterIP
      • 虚拟 IP,仅在集群内路由有效,由 kube-proxy 通过 iptables/IPVS 实现。
      • 客户端访问 ClusterIP:Port 时,请求会被转发到后端 Pod。
    • DNS 解析
      • 集群内服务可通过 <service-name>.<namespace>.svc.cluster.local 域名访问(如 nginx-service.default.svc.cluster.local)。
      • 简化配置,避免硬编码 IP。

工作流程示例

  1. 创建 Deployment:部署 3 个 Nginx Pod,标签为 app=nginx
  2. 创建 Service
    apiVersion: v1
    kind: Service
    metadata:name: nginx-service
    spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80
  3. 访问服务
    • 集群内其他 Pod 可通过 nginx-service:80 或其 ClusterIP 访问。
    • 若为 NodePort 类型,外部可通过 http://<节点IP>:<节点端口> 访问。

高级特性

  • 会话保持(Session Affinity)
    • 通过 sessionAffinity: ClientIP 确保同一客户端请求始终路由到同一 Pod。
  • 外部流量策略
    • externalTrafficPolicy: Local 保留客户端源 IP,避免经过 NAT 丢失信息(仅 NodePort/LoadBalancer 有效)。
  • 无头服务(Headless Service)
    • 设置 clusterIP: None,不分配 ClusterIP,直接返回 Pod IP 列表(适用于 StatefulSet 或需要直接访问 Pod 的场景)。

 Service工作原理

 Kubernetes(K8s)中的 Service 通过抽象一组动态变化的 Pod,提供稳定的网络访问入口和负载均衡能力。其工作原理涉及 标签选择、Endpoint 管理、网络代理(kube-proxy)和负载均衡 等核心机制。

核心工作原理

标签选择器(Label Selector)
  • 作用:Service 通过 spec.selector 字段匹配一组 Pod 的标签(如 app=nginx),动态关联后端 Pod。
  • 动态性:当匹配的 Pod 数量或 IP 变化时(如扩容、重建),Service 会自动更新关联的 Endpoint,无需手动干预。
  • 示例
    apiVersion: v1
    kind: Service
    metadata:name: nginx-service
    spec:selector:app: nginx  # 匹配所有标签为 app=nginx 的 Podports:- protocol: TCPport: 80    # Service 暴露的端口targetPort: 80  # Pod 的容器端口
Endpoints 对象
  • 自动生成:K8s 为每个 Service 创建一个同名的 Endpoints 资源(如 nginx-service),记录当前匹配的 Pod IP 和端口。
  • 实时更新:当 Pod 状态变化(如新增、删除、IP 变更),Endpoints 会同步更新,确保流量始终路由到健康的 Pod。
  • 查看 Endpoints
    kubectl get endpoints nginx-service

        输出实例:

NAME            ENDPOINTS                          AGE
nginx-service   10.244.1.3:80,10.244.2.5:80      5m

网络代理与负载均衡(kube-proxy)

kube-proxy 是运行在每个节点上的网络代理,负责实现 Service 的负载均衡和流量转发。它支持三种工作模式:

userspace 模式(已淘汰)
  • 原理:kube-proxy 作为用户态进程,通过 iptables 捕获 Service 的 ClusterIP 流量,然后转发到后端 Pod。
  • 缺点:性能较差(上下文切换开销大),已逐渐被弃用。
iptables 模式(默认)
  • 原理
    1. kube-proxy 监听 Service 和 Endpoint 的变化,动态生成 iptables 规则。
    2. 当客户端访问 Service 的 ClusterIP 时,iptables 随机选择一个后端 Pod IP,并将请求转发过去。
  • 特点
    • 纯内核态转发,性能较高。
    • 支持基本的轮询负载均衡。
    • 无法处理会话保持(需通过 sessionAffinity: ClientIP 实现)。
  • 查看 iptables 规则
    kubectl get svc nginx-service -o yaml  # 获取 ClusterIP
    iptables -t nat -L | grep <ClusterIP>
     
IPVS 模式(推荐高性能场景)
  • 原理
    1. kube-proxy 调用 Linux 内核的 IPVS 模块(基于哈希表的负载均衡器)。
    2. IPVS 支持多种负载均衡算法(如轮询、加权轮询、最少连接等),性能优于 iptables。
  • 启用方式
    • 修改 kube-proxy 启动参数:--proxy-mode=ipvs
    • 确保节点已加载 IPVS 内核模块(如 ip_vs_rrip_vs_wrr)。
  • 查看 IPVS 规则
    ipvsadm -Ln

 

Service 类型与流量路由

根据访问范围,Service 分为四种类型,其流量路由方式如下:

ClusterIP(默认)
  • 访问范围:仅集群内部。
  • 路由过程
    1. 客户端访问 nginx-service:80 或 ClusterIP。
    2. kube-proxy 通过 iptables/IPVS 将请求转发到匹配的 Pod。
  • 适用场景:内部服务间通信(如微服务调用)。

ClusterIP实例:

apiVersion: v1
kind: Service
metadata:name: my-service       # 服务名称namespace: default     # 命名空间(可选)labels:app: my-app          # 服务标签
spec:type: ClusterIP        # 指定为ClusterIP类型(默认可省略)selector:app: my-app          # 匹配Pod的标签ports:- protocol: TCP      # 协议类型(TCP/UDP)port: 80           # 服务暴露的端口(集群内部访问)targetPort: 8080   # 后端Pod的端口

NodePort
  • 访问范围:外部通过节点 IP + 端口访问。
  • 路由过程
    1. 客户端访问 <节点IP>:<NodePort>(如 192.168.1.100:30080)。
    2. 节点上的 iptables/IPVS 将请求转发到 Service 的 ClusterIP,再路由到 Pod。
  • 特点
    • NodePort 范围默认 30000-32767。
    • 外部流量需手动配置负载均衡器(如 Nginx)分发到多个节点。

NodePort实例:

apiVersion: v1
kind: Service
metadata:name: my-nodeport-servicenamespace: defaultlabels:app: my-app
spec:type: NodePort        # 指定为NodePort类型selector:app: my-app         # 匹配Pod的标签ports:- protocol: TCPport: 80          # 服务内部端口(供集群内部访问)targetPort: 8080  # 后端Pod的端口nodePort: 30080   # 节点上暴露的端口(可选,默认自动分配30000-32767)

LoadBalancer
  • 访问范围:外部通过云厂商负载均衡器访问。
  • 路由过程
    1. 创建 Service 时指定 type: LoadBalancer
    2. 云控制器(Cloud Controller Manager)自动创建外部负载均衡器(如 AWS ALB)。
    3. 外部流量通过负载均衡器分发到节点,再路由到 Pod。
  • 适用场景:生产环境暴露服务。

loadBalancer实例:

apiVersion: v1
kind: Service
metadata:name: my-loadbalancer-servicenamespace: defaultlabels:app: my-appannotations:# 可选:云服务商特定的注解(如AWS、GKE)service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:type: LoadBalancer       # 指定为LoadBalancer类型selector:app: my-app            # 匹配Pod的标签ports:- protocol: TCPport: 80             # 服务暴露的端口(负载均衡器端口)targetPort: 8080     # 后端Pod的端口nodePort: 30080      # 可选:自动分配的NodePort(LoadBalancer依赖NodePort实现)externalTrafficPolicy: Cluster  # 可选:Cluster(默认)或Local

ExternalName
  • 访问范围:通过 DNS CNAME 映射外部服务。
  • 路由过程
    1. 客户端访问 Service 的 DNS 名称(如 my-db.default.svc.cluster.local)。
    2. DNS 解析返回外部服务的 CNAME(如 mysql.example.com)。
  • 适用场景:访问集群外部数据库或 API。

 创建101命名空间所需要的yaml文件

[root@k8s-master opt]# cat myapp01.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp01namespace: test01
spec:replicas: 1selector: #标签选择器matchLabels: #匹配的标签为app: myapp01release: canarytemplate:metadata:labels:app: myapp01 #和上面的myapp要匹配release: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v1ports:- name: http01containerPort: 80
[root@k8s-master opt]# cat myapp-svc-extername01.yaml 
kind: Service
apiVersion: v1
metadata:name: myapp-svcname02namespace: test01
spec:type: ExternalNameexternalName: myapp-svc02.test02.svc.cluster.local
[root@k8s-master opt]# cat myapp-svc-headless01.yaml 
apiVersion: v1
kind: Service
metadata:name: myapp-svc01namespace: test01
spec:selector:app: myapp01 #挑选的pod还是myapp01。一个pod可以有多个servicerelease: canaryclusterIP: None #None表示是无头serviceports:- port: 39320 #service ip中的端口targetPort: 80 #容器ip中的端口

 创建102命名空间所需要的yaml文件

[root@k8s-master opt]# cat myapp-svc-headless02.yaml 
apiVersion: v1
kind: Service
metadata:name: myapp-svc02namespace: test02
spec:selector:app: myapp02 #挑选的pod还是myapp。一个pod可以有多个servicerelease: canaryclusterIP: None #None表示是无头serviceports:- port: 39320 #service ip中的端口targetPort: 80 #容器ip中的端口
[root@k8s-master opt]# cat myapp-svc-extername02.yaml 
kind: Service
apiVersion: v1
metadata:name: myapp-svcname01namespace: test02
spec:type: ExternalNameexternalName: myapp-svc01.test01.svc.cluster.local
[root@k8s-master opt]# cat myapp02.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp02namespace: test02
spec:replicas: 1selector: #标签选择器matchLabels: #匹配的标签为app: myapp02release: canarytemplate:metadata:labels:app: myapp02 #和上面的myapp要匹配release: canaryspec:containers:- name: myapp02image: ikubernetes/myapp:v1ports:- name: http02containerPort: 80

验证:

##查看test01容器的ip地址
[root@k8s-master opt]# ku get pods -n test01 -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
myapp01-696c886d6b-bbvrn   1/1     Running   0          30m   10.244.36.80   k8s-node1   <none>           <none>##登陆到test02命名空间的容器,访问test01容器的ip
[root@k8s-master opt]# ku exec -it myapp02-55ffcd5f64-xmgq8 -n test02 -- sh
/ # ping 10.244.36.80
PING 10.244.36.80 (10.244.36.80): 56 data bytes
64 bytes from 10.244.36.80: seq=0 ttl=63 time=0.059 ms
64 bytes from 10.244.36.80: seq=1 ttl=63 time=0.121 ms

 

 

 

 

 

 

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

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

相关文章

洛谷P1514 [NOIP 2010 提高组] 引水入城

洛谷P1514 [NOIP 2010 提高组] 引水入城 洛谷题目传送门 题目背景 NOIP2010 提高组 T4 题目描述 在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政区划十分特殊&#xff0c;刚好构成一个 NNN 行 MMM 列的矩形&#xff…

【unity小技巧】国内Unity6下载安装和一些Unity6新功能使用介绍

文章目录前言一、安装1、国外下载2、国内下载二、常用的新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法6、随…

Rust 中字符串类型区别解析

在 Rust 中&#xff0c;"hello" 和 String::from("hello") 都表示字符串&#xff0c;但它们在内存表示、所有权和可变性上有本质区别&#xff1a;1. 类型与内存表示"hello" (字符串字面量)&#xff1a;类型为 &str&#xff08;字符串切片引用…

springMVC05-异常处理器

在 SpringMVC 中&#xff0c;异常处理是一个非常重要的功能&#xff0c;它可以让你优雅地处理程序抛出的各种异常&#xff0c;向用户展示友好的提示&#xff0c;而不是显示一堆报错信息&#xff08;如 500 页面&#xff09;。一、SpringMVC的异常处理器返回的是ModelAndView&am…

安装 Elasticsearch IK 分词器

安装 Elasticsearch IK 分词器&#xff08;手动 .zip/.zip 安装&#xff09; IK 分词器&#xff08;IK Analysis&#xff09;是 Elasticsearch 最常用的中文分词插件&#xff0c;支持 细粒度分词&#xff08;ik_max_word&#xff09; 和 智能切分&#xff08;ik_smart&#xf…

数据库系统原理实验1:创建数据库、数据表及单表查询

一、实验目的1&#xff0e;掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法。2&#xff0e;掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数据表的方法&#xff08;以SQL命令为重点&#xff09;。3&#xff0e;掌握无条件查询…

【STM32】ADC模数转换基本原理(提供完整实例代码)

这篇文章是嵌入式中我通过大量资料 整合成了一份 系统完整、层次清晰的 ADC 模数转换原理解析 文档。 这里系统地梳理了 STM32F1 系列 ADC 模数转换的核心资料&#xff0c;包括&#xff1a; 1.原理 特性 2.通道配置 3.模式选择&#xff08;单次/连续/扫描&#xff09; 4.关键寄…

图神经网络 gnn 应用到道路网络拓扑结构与交通碳排放相关性。,拓扑指标量化、时空关联模型及演化机制分析

针对您提出的“道路网络拓扑结构与交通碳排放相关框架&#xff0c;以下结合研究目标、数据与方法进行系统性深化设计&#xff0c;重点强化拓扑指标量化、时空关联模型及演化机制分析&#xff1a;一、核心研究问题深化 静态关联&#xff1a;不同拓扑结构&#xff08;方格网/环射…

7.6 优先队列| dijkstra | hash | rust

lc1337pair存入&#xff0c;lambda sort后取出&#xff0c;最开始想用hash&#xff0c;写一半感觉写复杂了class Solution {public:vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {int m mat.size();int n mat[0].size();vector<pair…

最新 HarmonyOS API 20 知识库 重磅推出

最新 HarmonyOS API 20 知识库 重磅推出 前言 最近整理下 华为开发者联盟最新的 API 20的鸿蒙应用开发文档&#xff0c;这次的API 20 相比较之前的文档&#xff0c;要多了不少内容&#xff0c;目前整理后是9000千多篇&#xff0c;不容易呀。 如何使用 基于腾讯的知识库工具 …

uniapp 监听物理返回按钮

import {onShow,onHide,onLoad,onReady,onBackPress} from "dcloudio/uni-app"onBackPress((e) > {showLog("返回按钮触发")if(e.frombackbutton){//开始干活}})参数说明属性类型说明fromString触发返回行为的来源&#xff1a;backbutton——左上角导航…

多线程(2)

多线程&#xff08;2&#xff09; &#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&am…

网关助力航天喷涂:Devicenet与Modbus TCP的“跨界对话“

在航空航天领域&#xff0c;飞机、航天器的制造过程有着极高的精度与安全性要求。以飞机、航天器表面喷涂作业为例&#xff0c;不仅要进行严格的防腐蚀处理&#xff0c;而且对表面光滑度要求极高&#xff0c;这直接关系到飞行器的空气动力学性能和使用寿命。为确保作业安全与质…

从传统项目管理到敏捷DevOps:如何转向使用DevOps看板工具进行工作流管理

在DevOps实践中&#xff0c;DevOps看板工具成为了开发与运维团队之间高效协作的关键。随着企业对敏捷开发和持续交付的需求日益增长&#xff0c;DevOps看板工具通过可视化的管理方法&#xff0c;帮助团队在繁杂的任务中保持高效的工作节奏和清晰的进度跟踪。 具体而言&#xff…

【leetcode100】下一个排列

1、题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正…

Flink-Source算子状态恢复分析

背景 修改 source 算子 kafka_old_topic 消费任务运行一段时间后&#xff0c;暂停状态并保留。然后将 uid 和 topic 都改了&#xff0c;消费者 offset 会从 earliest 开始。 // before FlinkKafkaConsumer consumer KafkaConfig.getConsumer("kafka_old_topic");…

IDEA中application.yml配置文件不自动提示解决办法

今天在自己的电脑上使用IDEA的时候&#xff0c;发现在application配置文件里面输入配置项的时候没有提示&#xff0c;网上找了一圈也没解决&#xff0c;最后自己试出来了。 解决办法&#xff1a; 鼠标移动到配置文件上&#xff0c;单击右键-重写文件类型、选择YAML(捆绑)&#…

Vite 完整功能详解与 Vue 项目实战指南

Vite 完整功能详解与 Vue 项目实战指南 Vite 是下一代前端开发工具&#xff0c;由 Vue 作者尤雨溪开发&#xff0c;提供极速的开发体验和高效的生产构建。以下是完整功能解析和实战示例&#xff1a;一、Vite 核心功能亮点闪电般冷启动 基于原生 ES 模块&#xff08;ESM&#xf…

Vue 3 中使用路由参数跳转时 watch 触发重复请求问题详解

&#x1f4d8;Vue 3 中使用路由参数跳转时 watch 触发重复请求问题详解&#x1f516; 收藏 点赞 关注&#xff0c;掌握 Vue 3 路由参数监听中的隐藏陷阱&#xff0c;避免详情页、嵌套路由页误触发重复请求&#xff01;&#x1f9e9; 一、问题背景 在 Vue 3 项目中&#xff0c…

前端 项目更新通知 (plugin-web-update-notification)

项目版本更新迭代时&#xff0c;需提示用户更新系统&#xff0c;不然早时间不更新对用户体验很不好&#xff0c;所以在每次部署后需要提示用户&#xff0c;刷新静态资源。推荐插件 plugin-web-update-notification .具体配置 vite.config.js文件中 import { webUpdateNotice …