Kubernetes Service 工作原理

news2025/2/27 18:42:55

本文介绍了 Kubernetes Service 的概念、原理和具体使用。

作者:沈亚军

爱可生研发团队成员,负责公司 DMP 产品的后端开发,爱好太广,三天三夜都说不完,低调低调…

本文来源:原创投稿

  • 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

Service 是什么?

Service 是 Kubernetes 一种资源,用于实现恒定的入口访问一组提供相同服务的 Pod。每个 Service 在其生命周期内拥有固定的 IP 和 Port,客户端可以通过访问该 IP 和端口访问到和其关联的所有 Pod。这样服务的客户端不需要知道提供服务的各个 Pod 的位置,从而允许这些 Pod 在集群中移动。

首先我们使用 Deployment 创建标签为 app=nginx 的三个 Pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

如下使用 Deployment 创建了三个 Pod。

NAME                                READY   STATUS    RESTARTS   AGE    IP          NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-6b474476c4-hc6k4   1/1     Running   0          7d2h   10.42.1.3   node8    <none>           <none>
nginx-deployment-6b474476c4-mp8vw   1/1     Running   0          7d2h   10.42.0.7   node10   <none>           <none>
nginx-deployment-6b474476c4-wh8xd   1/1     Running   0          7d2h   10.42.1.4   node8    <none>           <none>

接下来我们定义一个名为 my-service 的 Service 资源并指定选择器为 app=nginx,其中 selector 定义了可以通过 Label selector 访问的 Pod 组。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
  - name: default
    protocol: TCP
    port: 80 #service port
    targetPort: 80 

如下我们成功创建了一个默认类型为 ClusterIP 的 Service 对象,并随机分配了一个 ClusterIP 10.109.163.26 此后我们就可以通过该 IP 和 Port 访问到之前创建的 Pod 了,Service 的默认方访问模式为轮询模式,即轮询将请求转发到后端的各个 Pod。

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR
my-service   ClusterIP   10.109.163.26   <none>        80/TCP    4d1h   app=nginx

为什么需要 Service?

Service 在我们使用 Kubernetes 几乎必不可少的一个资源对象主要包括以下原因

  • 集群中的每一个 Pod 都可以通过 PodIP 被直接访问的,但是 Kubernetes 中的 Pod 是有生命周期的对象,尤其是被 ReplicaSet、Deployment 等对象管理的 Pod,随时都有可能由于集群的状态变化被销毁和创建,导致 Pod 的 IP 发生变化。
  • Pod 被 Kubernetes 调度到确定的节点后,才会为 Pod 分配 IP 地址,在启动之前客户端无法知道服务器 Pod 的 IP 地址。
  • 水平扩展意味着多个 Pod 可以提供相同的服务,每个 Pod 都可以提供相同的服务 Pod 有自己的 IP 地址。客户端不应该关心有多少 Pod 支持服务及其 IP 是什么而且不应该保留所有 Pod 的 IP 列表。相反所有这些 Pod 都应该可以通过单个 IP 地址提供服务。

Service 工作原理

在 Kubernetes 中创建一个新的 Service 对象会涉及到两大模块,其中一个模块是控制器,它需要在每次客户端创建新的 Service 对象时,生成用于暴露一组 Pod 的 Kubernetes 对象,也就是 Endpoint 对象;另一个模块是 kube-proxy,它运行在 Kubernetes 集群中的每一个节点上,两大模块同时协作实现了 Service 功能

  1. 当我们发起创建 Service 请求时 kube-apiserver 会生成一个 Service 对象并将其保存到 ETCD。
  2. Endpoint Controller 在订阅到 Service 创建时会创建对应的 Endpoint 对象。
  3. kube-proxy 会订阅 Service 和 Endpoint 变动,以此改变节点上 iptables/ipvs 中保存的规则。

接下来会分别介绍这两大模块是何协作实现 Service 功能

Endpoint

如上文所述当我们创建 Service 时,同时也会生成如下所示的 Endpoint。

NAME         ENDPOINTS                                AGE
my-service   10.42.0.7:80,10.42.1.3:80,10.42.1.4:80   7d3h

Endpoint 是 Kubernetes 集群中的一个资源对象存储在 Etcd 中,从上文可以看到 Endpoint 中保存了一个 Service 对应的所有 Pod 的访问地址,Endpoint 的创建和更新是通过 Endpoint Controller,当我们通过 API 创建/修改 Service 对象时,Endpoints Controller 的 informer 机制监听到 Service对象更新,然后根据 Service 的配置的 selector 创建对应 Endpoint 对象,此对象将 Pod 的 IP、容器端口做记录并存储到 Etcd,这样 Service 只要看一下自己名下的 Endpoint 就可以知道所对应Pod信息了。

Endpoint Controller 是 kube-controller-manager 组件中众多控制器中的一个,是 Endpoint 资源对象的控制器,其通过对 Service、Pod 两种资源的监听实现对的 Endpoint 资源进行管理,主要包括以下功能:

  • 负责生成和维护所有 Endpoint 对象
  • 负责监听 Service 和对应 Pod 的变化
  • 监听到 Service 被删除,则删除和该 Service 同名的 Endpoint 对象
  • 监听到新的 Service 被创建,则根据新建 Service 信息获取相关 Pod 列表,然后创建对应 Endpoint 对象
  • 监听到 Service 被更新,则根据更新后的 Service 信息获取相关 Pod 列表,然后更新对应 Endpoint 对象
  • 监听到 Pod 事件,则更新 endpoint 对象保存的 Pod IP 列表, 如 Pod 处于非健康状态时则把 Pod 从保存的 IP 列表中移除,恢复时再重新加入

kube-proxy

kube-proxy 是 Kubernetes 的一个网络代理组件,运行在每个 worker 节点上。kube-proxy 维护节点上的网络规则,实现了 Kubernetes Service 概念的一部分,它的作用是使发往 Service 的流量(通过 ClusterIP 和端口)负载均衡到正确的后端 Pod,kube-proxy 支持多种配置模式主要包括 iptable 和 ipvs 模式,本文则基于 iptable 模式描述 kube-proxy 的工作原理, kube-proxy 的主要职责包括两大块:

  • 监听 Service 更新事件,并更新 Service 相关的 iptables 规则。
  • 监听 Endpoint 更新事件,更新 Endpoint 相关的 iptables 规则, 如 KUBE-SVC-链中的规则会把包请求转入 Endpoint 对应的Pod。如果某个 Service 尚没有 Pod 创建,那么针对此 Service 的请求将会被 drop 掉。

在 iptables 模式下,创建 Service 会创建一系列的 iptable 规则,

首先我们在任意一台 worker 节点执行 iptables -nvL OUTPUT -t nat 查看 iptables net 表的 output 链,存在 kube-proxy 创建的 KUBE-SERVICE 链

Chain OUTPUT (policy ACCEPT 40606 packets, 2435K bytes)
pkts bytes target     prot opt in     out     source               destination
15M  929M KUBE-SERVICES  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

执行 iptables -nvL KUBE-SERVICES -t nat 查看 KUBE-SERVICES 链,可以看到 clusterIP 10.43.7.11 跳转到 KUBE-SVC-KEAUNL7HVWWSEZA6

Chain KUBE-SERVICES (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 KUBE-SVC-KEAUNL7HVWWSEZA6  tcp  --  *      *       0.0.0.0/0            10.43.7.11           /* default/my-service: cluster IP */ tcp dpt:80

然后我们执行 iptables -nvL KUBE-SVC-KEAUNL7HVWWSEZA6 -t nat 查看 KUBE-SVC-KEAUNL7HVWWSEZA6 可以看到以不同的概率进行了跳转

Chain KUBE-SVC-KEAUNL7HVWWSEZA6 (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 KUBE-SEP-SKMF2UJJQ24AYOPG  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/my-service: */ statistic mode random probability 0.33333333349
    0     0 KUBE-SEP-BAKPXLXOJZJDGFKA  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/my-service: */ statistic mode random probability 0.50000000000
    0     0 KUBE-SEP-M4RM3QHTJOBNSPNE  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/my-service: */

最后执行 iptables -nvL KUBE-SEP-SKMF2UJJQ24AYOPG -t nat 查看其中一条通过 DNAT发送到其中一个 Pod 地址 10.42.0.7:80

Chain KUBE-SEP-SKMF2UJJQ24AYOPG (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/my-service: */ tcp to:10.42.0.7:80

从上问所述可知在 Service 创建时会生成大量的 iptalbes 规则,当服务数量非常庞大时 iptables 规则也会成倍增长,带来的问题是路由延迟和服务访问延迟,而且由于 iptables 使用非增量式更新当规则数量庞大时添加或删除一条规则也有较大延迟, 为了解决该问题所以 kubernetes 在 1.11 之后版本推出了 ipvs 模式。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MAUI+Blazor 如何开启浏览器调试工具

文章目录 前言如何开启调试模式输入快捷键打开浏览器有什么意义&#xff1f; 前言 MAUIBlazor其实就是浏览器套壳&#xff0c;我觉得很有意义&#xff0c;因为现在性能已经不是主要的限制了&#xff0c;很多时候讲究的快速开发。而且MAUIBlazor跨平台的未来感觉实在是太香了。…

基于Gradio的GPT聊天程序

网上很多别人写的&#xff0c;要用账号也不放心。就自己写了一个基于gradio的聊天界面&#xff0c;部署后可以本地运行。 特点&#xff1a; 可以用openai的&#xff0c;也可以用api2d&#xff0c;其他api可以自己测试一下。使用了langchain的库 可以更改模型&#xff0c;会的…

Semantic Kernel 入门系列: Planner 规划器

Semantic Kernel 的一个核心能力就是实现“目标导向”的AI应用。 目标导向 “目标导向”听起来是一个比较高大的词&#xff0c;但是却是实际生活中我们处理问题的基本方法和原则。 顾名思义&#xff0c;这种方法的核心就是先确定目标&#xff0c;然后再寻找实现目标的方法和…

基于R做宏基因组结果的PCoA分析

写在前面 因为公司给的PCA结果效果不佳&#xff0c;决定从中重新挑选部分样本进行再分析 步骤 表格结果预处理 在属水平genus参考原本结果已有的PCA图&#xff0c;尽可能挑选距离较远且聚团的样本 选取不同样本属水平的丰度数据&#xff0c;整理成逗号分隔的csv文件 代码…

Android:自定义沿着曲线轨迹移动

前言 前几天&#xff0c;后台有老铁留言&#xff0c;说有个需求&#xff0c;画两条曲线&#xff0c;中间是一个小球&#xff0c;沿着两条线中间的轨迹从左往右移动&#xff0c;让提供个思路&#xff0c;做为一个极度宠粉的博主&#xff0c;思路不仅要提供&#xff0c;实现方案也…

视图簇 se54 sm34 se54

今天演练了一下 维护视图到视图簇的过程。 se11建表&#xff0c;建表之后 【使用程序】→【表维护生成器】 se54 新建视图簇 对象结构 选中其中一行 字段附属 PS:以上每一行都要设置过去 &#xff0c; 设置完成了 激活 sm34展示

Word转PDF工具哪家安全?推荐好用的文件格式转换工具

Word文档是我们最常见也是最常用的办公软件&#xff0c;想必大家都知道了Word操作起来十分的简单&#xff0c;而且功能也是比较齐全的。随着科技的不断进步&#xff0c;如今也是有越来越多类型的办公文档&#xff0c;PDF就是其中之一&#xff0c;那么word转pdf怎么转?Word转PD…

vue3多页面配置踩坑

vue3实现多页面打包容易&#xff0c;关键是如何实现本地的开发和调试&#xff1f;我们接下来解决如下几个问题&#xff1a; 1 多页面项目的项目结构是怎样的&#xff1f; --public--src---App.vue---main.js---page1. ---App.vue---main.js----home.vue----list.vue---page2.…

申请TikTok海外直播公会的具体流程

截止目前&#xff0c;TikTok的主用户群已经从除中国用户外的亚洲用户群&#xff0c;逐步转变成了以英美欧洲为主体的西方用户群体。TikTok先后在40多个国家的应用商店内排名前列&#xff0c;成为了全球增速最快的短视频APP。接下来的这篇文章就是关于抖音tiktok海外公会申请cmx…

谷器数据:以“数字化+标准化”推动中小企业高质量发展

近日&#xff0c;2023全国专精特新中小企业发展大会在浙江杭州举行。据悉&#xff0c;截至目前&#xff0c;我国已累计培育专精特新“小巨人”企业1.2万余家&#xff0c;专精特新中小企业超9.8万家&#xff0c;创新型中小企业达21.5万家。其中&#xff0c;1.2万家小巨人企业中&…

DETR模型计算量(FLOPs)参数量(Params)

前言 关于计算量(FLOPs)参数量(Params)的一个直观理解&#xff0c;便是计算量对应时间复杂度&#xff0c;参数量对应空间复杂度&#xff0c;即计算量要看网络执行时间的长短&#xff0c;参数量要看占用显存的量。 计算量&#xff1a; FLOPs&#xff0c;FLOP时指浮点运算次数&a…

云端剪切板,让你的数据同步无界

云端剪切板&#xff0c;让你的数据同步无界&#xff01; 每个人都应该保护自己的数据&#xff0c;同时使它易于访问和共享。这就是我们的云剪切板网站诞生的原因&#xff01;无论你在哪里&#xff0c;只要登录我们的网站&#xff0c;就可以随时随地使用你的剪切板数据。 你可…

从支付或退款之回调处理的设计,看一看抽象类的使用场景

一、背景 抽象类&#xff0c;包含抽象方法和实例方法&#xff0c;抽象方法待继承类去实例化&#xff0c;正是利用该特性&#xff0c;以满足不同支付渠道的差异化需求。 我们在做多渠道支付的时候&#xff0c;接收支付或退款的回调报文&#xff0c;然后去处理。这就意味着&…

对话音视频牛哥:如何设计功能齐全的跨平台低延迟RTMP播放器

开发背景 2015年&#xff0c;我们在做移动单兵应急指挥项目的时候&#xff0c;推送端采用了RTMP方案&#xff0c;这在当时算是介入RTMP比较早的了&#xff0c;RTMP推送模块做好以后&#xff0c;我们找了市面上VLC还有Vitamio&#xff0c;来测试整体延迟&#xff0c;实际效果真…

大数据传输的定义与大数据传输解决方案的选择

当我们需要处理大量的数据时&#xff0c;我们就要把数据从一个地方移动到另一个地方。这个过程就叫做大数据传输。它通常需要用到高速的网络连接、分散的存储系统和数据传输协议&#xff0c;以保证数据的快速、可靠和安全的移动。常用的大数据传输技术有Hadoop分布式文件系统&a…

servlet三大类HttpSevlet,HttpServletRequest,HttpServletResponse介绍

一、HttpServlet HttpServlet类是一个被继承的方法&#xff0c;可以看做一个专门用来响应http请求的类&#xff0c;这个类的所有方法都是为响应http请求服务的&#xff0c;要对一个某个路径谁知http响应时&#xff0c;需要写一个类来继承HttpServlet类&#xff0c;并重写里面的…

BGP基础建邻+宣告实验

实验要求及拓扑 一、实验思路 1.编写静态路由使R1、R2之间可通和使R4、R5之间可通。 2.使用OSPF使R2、R3、R4之间可通。 3.各自宣告AS区域&#xff0c;中间区域两两之间建邻。 4.注意建邻所使用的端口&#xff0c;外部BGP邻居关系和内部BGP邻居关系的区别。 二、上虚拟机操…

企业微信web登录(扫二维码登录)

记录一下企业微信web扫码登录的使用过程。 按惯例&#xff0c;先看登录流程&#xff1a; 步骤 首先&#xff0c; 企业微信后台开启“企业微信授权登陆功能”&#xff0c;“设置授权回调域名” ,授权回调域名必须与访问链接的域名完全一致。&#xff08;访问链接的域名就是扫码…

【Kubernetes】Kubernetes的调度

K8S调度 一、Kubernetes 调度1. Pod 调度介绍2. Pod 启动创建过程3. Kubernetes 的调度过程3.1 调度需要考虑的问题3.2 具体调度过程 二、影响kubernetes调度的因素1. nodeName2. nodeSelector3. 亲和性3.1 三种亲和性的区别3.2 键值运算关系3.3 节点亲和性3.4 Pod 亲和性3.5 P…

高忆管理:创业板股票涨跌幅?

创业板股票涨跌幅限制大于主板商场&#xff0c;为何呈现这样的现象&#xff1f;从多个角度剖析&#xff0c;其中包含方针因素、商场走势、职业危险等多个方面。 首要&#xff0c;方针因素是导致股票涨跌幅波动的一个重要因素。在新的方针环境下&#xff0c;相关部门关于创业板股…