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

Kubernetes Service 工作原理

本文介绍了 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-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- 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: nginxports:- name: defaultprotocol: TCPport: 80 #service porttargetPort: 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               destination0     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               destination0     0 KUBE-SEP-SKMF2UJJQ24AYOPG  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/my-service: */ statistic mode random probability 0.333333333490     0 KUBE-SEP-BAKPXLXOJZJDGFKA  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/my-service: */ statistic mode random probability 0.500000000000     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               destination0     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

相关文章:

Kubernetes Service 工作原理

本文介绍了 Kubernetes Service 的概念、原理和具体使用。 作者&#xff1a;沈亚军 爱可生研发团队成员&#xff0c;负责公司 DMP 产品的后端开发&#xff0c;爱好太广&#xff0c;三天三夜都说不完&#xff0c;低调低调… 本文来源&#xff1a;原创投稿 爱可生开源社区出品&am…...

面部表情识别4:C++实现表情识别(含源码,可实时检测)

面部表情识别4&#xff1a;C实现表情识别(含源码&#xff0c;可实时检测) 目录 面部表情识别4&#xff1a;C实现表情识别(含源码&#xff0c;可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型(Python) &#xff08;1&#xff09; 面部表情识别模型的训练…...

提升Element UI分页查询用户体验与交互:实现修改未保存提示

我实现的功能是在 element ui 的分页组件中进行分页查询时&#xff0c;如果当前有未保存的修改数据就提示用户&#xff0c;用户可以选择是否放弃未保存的数据。确认放弃就重新查询数据&#xff1b;选择不放弃&#xff0c;不重新查询&#xff0c;并且显示条数选择框保持原样&…...

UML-时序图

目录 时序图 时序图构成: 对象: 消息: 生命线(激活): 活动条: 时序图举例: 时序图 时序图也叫顺序图、序列图. 时序图描述按照时间的先后顺序对象之间的动作过程&#xff0c;是由生命线和消息组成 时序图构成: 对象: 对象是类的实例&#xff0c;对象是通过类来创建的&…...

Seata - 入门笔记

1、事务 访问并可能更新数据库中数据库中各种数据线的一个程序执行单元 原子性&#xff1a;事务是一个不可分割的工作单位&#xff0c;一个事务要么都做要么都不做 一致性&#xff1a;必须是使数据库从一个一致性到另一个一致性的状态&#xff0c;中间状态不能被观察到 隔离…...

springboot使用aop排除某些方法,更新从另外一张表,从另外一张表批量插入

AOP 在Spring Boot中使用AOP时&#xff0c;如果想要排除某些方法不被切面所影响&#xff0c;可以通过使用切面表达式中的!within关键字来实现。以下是一个示例&#xff1a; Aspect Component public class MyAspect {Before("execution(* com.example.service.*.*(..)) …...

Go 语言面试题(二):实现原理

文章目录 Q1 init() 函数是什么时候执行的&#xff1f;Q2 Go 语言的局部变量分配在栈上还是堆上&#xff1f;Q3 2 个 interface 可以比较吗&#xff1f;Q4 两个 nil 可能不相等吗&#xff1f;Q5 简述 Go 语言GC(垃圾回收)的工作原理Q6 函数返回局部变量的指针是否安全&#xff…...

SAP MM学习笔记16-在库品目评价

在库品目评价是指评估物料。具体比如物料价格&#xff0c;数量&#xff0c;保管场所等发生变化的时候&#xff0c;判断是否发生了变化&#xff0c;要不要生成 FI票&#xff0c;用哪个FI科目来进行管理等内容就叫在库品目评价。 在库品目评价有很多层级&#xff0c;这里先讲3兄弟…...

Azure通过自动化账户实现对资源变更

Azure通过自动化账户实现对资源变更 创建一个自动化账户第一种方式 添加凭据&#xff08;有更改资源权限的账户&#xff0c;没有auth认证情况&#xff09;创建一个Runbook&#xff0c;测试修改 AnalysisServices 定价层设置定时任务&#xff1a;开始定时任务&#xff1a; 第二种…...

使用luarocks安装cjson并使用cjson

1.luarocks安装 wget https://luarocks.org/releases/luarocks-3.3.1.tar.gz --no-check-certificatels -lrthtar -xvf luarocks-3.3.1.tar.gz mv luarocks-3.3.1 /usr/local/cd /usr/local/luarocks-3.3.1/./configure --prefix/usr/local/luarocks-3.3.1 vim /etc/profilePAT…...

【已解决】mac端 sourceTree 解决remote: HTTP Basic: Access denied报错

又是在一次使用sourcetree拉取或者提交代码时候&#xff0c;遇到了sourcetree报错&#xff1b; 排查了一会&#xff0c;比如查看了SSH keys是否有问题、是否与sourcetree账户状态有问题等等&#xff0c;最终才发现并解决问题 原因&#xff1a; 因为之前公司要求企业gitlab中…...

javaee dom4j读取xml文件

引入jar包 dom4j-1.6.1.jar 创建xml文件 <?xml version"1.0" encoding"UTF-8"?> <books><book id"1"><title ID"t1">背影</title><price>88</price><author>三毛</author>…...

各类背包问题

1、0-1背包问题 &#xff08;1&#xff09;用二维数组动态规划 #include<bits/stdc.h> using namespace std; int m,n; int w[50],c[50]; int dp[210][210]; int main() {cin>>m>>n;for(int i1;i<n;i){cin>>w[i]>>c[i];}for(int i1;i<n;…...

《练习100》91~95

题目91 # 自动生成字符串 # a [小马,小羊,小鹿] # b [草地上,电影院,家里] # c [看电影,听音乐,吃晚饭] # 随机生成三个0~2的数字&#xff0c;若是1&#xff0c;0&#xff0c;2 &#xff0c;则输出&#xff1a; 小羊在草地上吃晚饭 import random a [小马,小羊,小鹿] b […...

3.6 Spring MVC文件上传

1. 文件上传到本地 实现方式 Spring MVC使用commons-fileupload实现文件上传&#xff0c;注意事项如下&#xff1a; l HTTP请求方法是POST。 l HTTP请求头的Content-Type是multipart/form-data。 SpringMVC配置 配置commons-fileupload插件的文件上传解析器CommonsMultip…...

# X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系

X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系 很多人对于他们是啥是傻傻分不清的&#xff0c;我做了个表格供大家参考。 摘抄&#xff1a; X11是X Window System Protocol, Version 11&#xff08;RFC1013&#xff09;&#xff0c;是X server和X client之间的通…...

rknn3588如何查看npu使用情况

cat /sys/kernel/debug/rknpu/load在Linux中&#xff0c;你可以使用一些工具和命令来绘制某一进程的实时内存折线图。一个常用的工具是gnuplot&#xff0c;它可以用来绘制各种图表&#xff0c;包括折线图。 首先&#xff0c;你需要收集进程的实时内存数据。你可以使用pidstat命…...

“Can‘t open perl script configure : No such file or directory”的解决办法

编译OpenSSL的时候执行到 perl configure 时提示找不到configure&#xff0c; 然后在网上搜了搜&#xff0c;大家给的解决办法一般都是说设置环境变量或者指定configure路径再执行&#xff1b;我试了都不行&#xff0c; 最后我把perl卸了重装就正常了&#xff1b; 然后我换了…...

ChatGLM2-6B在windows下的部署

2023-08-10 ChatGLM2-6B在windows下的部署 一、部署环境 1、Windows 10 专业版&#xff0c; 64位&#xff0c;版本号&#xff1a;22H2&#xff0c;内存&#xff1a;32GB 2、已安装CUDA11.3 3、已安装Anaconda3 64bit版本 4、有显卡NVIDIA GeForce RTX 3060 Laptop GPU …...

nodejs+vue+elementui学生档案信息管理系统_06bg9

利用计算机网络的便利&#xff0c;开发一套基于nodejs的大学生信息管理系统&#xff0c;将会给人们的生活带来更多的便利&#xff0c;而且在经济效益上&#xff0c;也会有很大的便利!这可以节省大量的时间和金钱。学生信息管理系统是学校不可缺少的一个环节&#xff0c;其内容直…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...