k8s基础(4)—Kubernetes-Service
Service概述
抽象层
k8s的Service是一种抽象层,用于为一组具有相同功能的Pod提供一个统一的入口地址,并通过负载均衡将网络流量分发到这些Pod上。 Service解决了Pod动态变化的问题,例如Pod的IP地址和端口可能会发生变化,通过Service可以提供稳定的访问地址和负载均衡功能,从而屏蔽后端Endpoint的变化。
Service的作用
服务发现:Service通过标签选择器(Label Selector)与Pod关联,提供稳定的访问地址,即使Pod的IP地址发生变化,客户端仍然可以通过Service访问到服务。
负载均衡:Service可以将网络流量分发到后端的多个Pod上,提供负载均衡的功能,确保服务的可用性和扩展性。
抽象层:Service提供了一种抽象层,使得客户端不需要关心具体的Pod细节,只需要通过Service的地址进行访问。
Service的类型
k8s中的Service有四种类型:
ClusterIP:默认类型,为集群内部提供一个虚拟IP,只能在集群内部访问。
NodePort:在每台机器上绑定一个端口,可以通过NodeIP来访问该服务。
LoadBalancer:在NodePort的基础上,创建一个外部负载均衡器,将请求转发到NodeIP。
ExternalName:将集群外部的服务引入到集群内部,直接使用外部服务的名称,没有任何代理被创建。
Service的工作原理
在k8s集群中,每个Node运行一个kube-proxy进程,负责为Service实现虚拟IP(VIP)的形式。从k8s v1.2版本起,默认使用Iptables代理模式,从v1.8.0-beta.0版本开始,添加了ipvs代理模式。
一、ClusterIP
ClusterIP:默认类型,为集群内部提供一个虚拟IP,只能在集群内部访问。
实验背景
启动3个nginx pod 每一个节点的nginx配置相关的访问信息
pod1——> web1
pod2——> web2
pod3 ——> web3
修改nginx的访问页面
方便区分service是否实现了负载均衡
pod2、pod3按照上边的操作步骤进行。
测试查看了配置是否生效
访问pod节点IP,检查配置是否成功。
1、使用命令行进行操作
#给nginx02工作负载节点暴露端口8080指向后端的80端口
kubectl expose deploy nginx02 --port=8080 --target-port=80#查看service产生的虚拟IP
kubectl get service#删除service命令
kubectl delete service nginx02#查看每组pod的标签
kubectl get pods --show-labels
1.1 负载均衡测试
crul 192.168.72.130:8080
2、使用yaml文件进行操作
apiVersion: v1
kind: Service
metadata:labels:run: nginx02name: nginx02
spec:selector:app: nginx02ports:- port: 8080protocol: TCPtargetPort: 80
3、使用Service产生的虚拟IP进行访问
#在服务器上进行查看产生的虚拟IP信息
kubectl get service
4、通过域名进行访问
命名的规则是: 服务名.所在名称空间.scv
如:上述实验对应的域名为: nginx02.default.svc
curl nginx02.default.svc:8080
不过此方法仅限于在运行的容器pod中进行,如果在外部无法访问
在pod中访问成功
二、NodeIP
NodePort:在每台机器上绑定一个端口,可以通过NodeIP来访问该服务。
NodePort会随机在每个pod之间生成一个端口范围在30000-32767之间。
1、使用命令行创建NodeIP
#创建NodePort类型的servicekubectl expose deploy nginx02 --port=8080 --target-port=80 --type=NodePort#查看service端口对应的真实主机映射的端口是多少kubectl get service
2、通过NodePort暴露的端口访问到集群
在上一步骤中得知对外暴露的端口为32361,在浏览器上输出真实主机IP:端口进行访问。
三、ExternalName
ExtenlName:将服务通过DNS CNAME 记录方式转发到指定的域名
在访问的时候service过程如下:
client ——> test.domain.org (service) ——> pod(n) 直接用ip访问应用里边的地址可能会改变
1、创建externalName
[root@master test]# vim ex-service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx02
spec:type: ExternalNameexternalName: test.domain.org
2、安装域名测试工具
sudo yum install bind-utils -y
3、测试验证
[kubeadm@server1 ~]$ sudo yum install bind-utils -y ##安装测试软件[kubeadm@server1 ~]$ kubectl get svc -n kube-system ##查看dns 对应的ClusterIP
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 8d
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$ dig -t A test.domain.org @10.96.0.10 ##测试 ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A test.westos.ortg @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 23243
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.westos.ortg. IN A;; Query time: 1255 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Mon Mar 02 09:35:40 EST 2020
;; MSG SIZE rcvd: 45[kubeadm@server1 ~]$[kubeadm@server1 ~]$ kubectl describe svc nginx02
Name: my-nginx
Namespace: default
Labels: <none>
Annotations: <none>
Selector: <none>
Type: ExternalName
IP:
External Name: test.domain.org
Session Affinity: None
Events: <none>
[kubeadm@server1 ~]$
四、LoadBalancer
从外部访问的Service的第二种方式 是用于共有云上的Kubernetes服务,这时候,可以指定一个LoadBalancer类型的Service。
在service提交后,Kubernetes就会调用CloudProvider 在共有云上 你可以创建一个负载均衡服务,并且把代理的pod的IP 地址配置给负载均衡服务做后缀。(共有云、阿里云、亚马逊)。
在外部的公有云上才可以创建 (因为要收费)
五、创建一个对外访问的指定IP和端口
1、创建Service
#执行yaml文件
[root@master test]# cat exposeIpService-2.yamlapiVersion: v1 ##版本
kind: Service ##类型
metadata:name: nginx02 ##名称
spec:ports:- name: nginx02 ##端口服务名称port: 8080 ##外部访问的端口号targetPort: 80 ##转发的端口号selector:app: nginx02externalIPs:- 192.168.72.133 ##创建一个供外部访问的共有ip[root@master test]# kubectl get service #查看service是否创建成功
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d
nginx02 ClusterIP 10.96.103.205 192.168.72.133 8080/TCP 8m38s
2、访问测试
六、服务发现机制验证
1、将缩容节点从负载均衡中剔除
将一个pod节点缩容后,再重新扩容到之前的副本数,通过Service可以访问到新扩容节点的信息。
2、将扩容节点添加到负载均衡中
对节点进行扩容之后,Service能够发现并将扩容的pod节点重新加入集群中,此时访问会出现web1、web2和nginx的原始页面信息,因为web3在上一步骤的缩容中已经被删除,重新扩容之后为新节点的信息。
七、开启kube-proxy的IPVS模式
1、为什么要使用IPVS代替iptables
IPVS和iptables对比说明
service代理默认使用iptables规则通过内核模块netfilter实现流量转发,内核转发效率高,但是iptables不具备更为灵活的负载均衡策略,只是将流量随意的转发至后端Pod,当Pod不可用时也无法进行健康检查;就以下是将默认流量转发修改为ipvs。
kubernetes自1.8版本开始强推ipvs,之前版本默认使用iptables,是比较古老的一种网络模式。
ipvs采用的hash表,iptables采用一条条的规则列表。集群数量越多iptables规则就越多,而 iptables规则是从上到下匹配,所以效率就越是低下。因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。
kubernetes在版本v1.6中已经支持5000个节点,但使用iptables 的 kube-proxy 实际上是将集群扩展到5000个节点的瓶颈。 在5000节点集群中使用 NodePort 服务,如果有2000个服务并且每个服务有10个 pod,这将在每个工作节点上至少产生20000个iptable 记录,这可能使内核非常繁忙。因此,如果是大集群的话,iptables可能会造成集群崩溃。
IPVS模式与iptables同样基于Netfilter,作为linux内核的一部分实现传输层负载均衡的技术,通常称为第4层LAN交换。但是ipvs采用的hash表(性能更加高效),Iptables采用一条条的规则列表。
iptables 模式
iptables 是一个 Linux 内核功能,是一个高效的防火墙,并提供了大量的数据包处理和过滤方面的能力。它可以在核心数据包处理管线上用 Hook 挂接一系列的规则。iptables 模式中 kube-proxy 在 NAT pre-routing Hook 中实现它的 NAT 和负载均衡功能。这种方法简单有效,依赖于成熟的内核功能,并且能够和其它跟 iptables 协作的应用(例如 Calico)融洽相处。
然而 kube-proxy 的用法是一种 O(n) 算法,其中的 n 随集群规模同步增长,这里的集群规模,更明确的说就是服务和后端 Pod 的数量。
IPVS 模式
IPVS 是一个用于负载均衡的 Linux 内核功能。IPVS 模式下,kube-proxy 使用 IPVS 负载均衡代替了 iptable。这种模式同样有效,IPVS 的设计就是用来为大量服务进行负载均衡的,它有一套优化过的 API,使用优化的查找算法,而不是简单的从列表中查找规则。
这样一来,kube-proxy 在 IPVS 模式下,其连接过程的复杂度为 0。换句话说,多数情况下,他的连接处理效率是和集群规模无关的。
另外作为一个独立的负载均衡器,IPVS 包含了多种不同的负载均衡算法,例如轮询、最短期望延迟、最少连接以及各种哈希方法等。而 iptables 就只有一种随机平等的选择算法。
IPVS 的一个潜在缺点就是,IPVS 处理数据包的路径和通常情况下 iptables 过滤器的路径是不同的。如果计划在有其他程序使用 iptables 的环境中使用 IPVS,需要进行一些研究,看看他们是否能够协调工作。(Calico 已经和 IPVS kube-proxy 兼容)
2、安装ipvsadm服务
各个节点上的内核一定要装有ip_vs_rr 这是ipvsadm生效的前提
#查看内核是否已经安装ip_vs_rrlsmod | grep ip_vs#安装ipvsadm服务yum install ipvsadm -y
3、开启kube-proxy 的povs模式
#查看IPVS中是否有策略
ipvsadm -ln#开启kube-proxy的povs模式
kubectl -n kube-system edit cm kube-proxy ##改为IPVS mode"ipvs"#查看是否已经更新
kubectl get pod -n kube-system -o wide | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'#查看更新是否成功
kubectl get pod -n kube-system -o wide -w
4、验证IPVS策略是否生效
开启firewalld防火墙服务iptables策略失效,此时可以对集群的pod进行扩容,如果能够正常扩容说明IPVS已经生效。
#将之前的2个副本扩容到5个
kubectl scale deploy/nginx02 --replicas=5
八、VIP 和 Service 代理的区别
VIP和Kubernetes Service代理的区别主要体现在定义、功能、实现方式以及应用场景等方面。
定义和功能
VIP(虚拟IP):VIP是一个全局唯一的虚拟IP地址,用于集群内部服务的访问。它不是一个物理IP地址,而是通过负载均衡器或DNS解析来指向实际的物理服务器或服务实例。VIP通常用于实现高可用性和负载均衡,确保服务故障时的自动切换。
Kubernetes Service:Kubernetes Service定义了一个服务的访问入口地址,前端应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。Service通过Label Selector与后端Pod副本集群对接,实现负载均衡和会话保持机制。Service不是共用一个负载均衡器的IP,而是被分配了一个全局唯一的虚拟IP地址,称为Cluster IP。
实现方式
VIP:通常通过硬件负载均衡器或软件负载均衡器来实现,如F5 BIG-IP或Keepalived等。这些工具负责将VIP指向实际的服务器或服务实例,实现高可用和负载均衡。
Kubernetes Service:Kubernetes通过kube-proxy进程实现Service代理。kube-proxy运行在每个Node上,负责将请求转发到后端的Pod实例。Kubernetes支持多种代理模式,包括iptables和ipvs等,具体使用哪种模式取决于Kubernetes的版本和配置。
应用场景
VIP:适用于需要高可用性和负载均衡的场景,如数据库、Web服务器等关键服务。VIP确保在服务故障时能够快速切换到备用服务器,减少服务中断时间。
Kubernetes Service:适用于微服务架构中的应用,通过Service抽象服务访问入口,简化应用部署和维护。
在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式。
参考资料:
参考资料:k8s Service 服务 - misakivv - 博客园
IPVS配置参考文档:Kubernetes 当中启用IPVS模式_kubernetes ipvs-CSDN博客
更详细信息可参考之前写的博客:k8s(6)——— service详解_qmfjs-CSDN博客
官网信息:https://kubernetes.io/zh-cn/docs/concepts/services-networking
相关文章:

k8s基础(4)—Kubernetes-Service
Service概述 抽象层 k8s的Service是一种抽象层,用于为一组具有相同功能的Pod提供一个统一的入口地址,并通过负载均衡将网络流量分发到这些Pod上。 Service解决了Pod动态变化的问题,例如Pod的IP地址和端口可能会发生变化,通过…...
CAN或者CANFD的Busoff的恢复时间会受到报文周期的影响么?
目录 分析恢复机制角度快恢复和慢恢复策略角度特殊情况分析分析 Busoff的恢复时间通常不会直接受到报文周期的影响,以下是具体分析: 恢复机制角度 CAN总线的节点在Busoff状态下,恢复过程主要是等待总线上出现128个连续的11bit隐性位,与报文周期并无直接关联。无论报文周…...

【DevOps】Jenkins部署
Jenkins部署 文章目录 Jenkins部署资源列表基础环境一、部署Gilab1.1、安装Gitlab1.2、修改配置文件1.3、加载配置文件1.4、访问Gitlab1.5、修改root登录密码1.6、创建demo测试项目1.7、上传代码1.8、验证上传的代码 二、部署Jenkins所需软件2.1、部署JDK2.2、部署Tomcat2.3、部…...

【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)
【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法) 引言 该文章实现了一个可解释的神经网络回归模型,使用BP神经网络(BPNN)来预测特征输出。该模型利用七个变量参数作为输入特征进行训练。为…...
【Shell编程 / 4】函数定义、脚本执行与输入输出操作
文章目录 函数 与 脚本定义函数示例:简单的 Shell 函数函数参数返回值 脚本执行创建脚本执行脚本 输入输出输出:echo 和 printf输入:read 命令 命令行参数示例:传递参数 函数 与 脚本 在 Shell 编程中,函数和脚本是组…...

RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用
工业视觉识别系统厂家提供的功能主要包括: 这些厂家通过先进的视觉识别技术,实现图像的采集、处理与分析。系统能够自动化地完成质量检测、物料分拣、设备监控等任务,显著提升生产效率和产品质量。同时,系统具备高度的灵活性和可扩…...

MySQL 01 02 章——数据库概述与MySQL安装篇
一、数据库概述 (1)为什么要使用数据库 数据库可以实现持久化,什么是持久化:数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用是:将内存中的数据存储在关系型数据库中,当然也可以…...

运行framework7
安装 framework7 下载地址https://gitcode.com/gh_mirrors/fr/framework7-vue node 下载 https://nodejs.cn/#ionic 配置npm 的镜像源 npm config set registry https://registry.npmmirror.com 下载nvm 进行nvm管理https://www.downza.cn/soft/352547.html 我一开始使用node…...

【Web】软件系统安全赛CachedVisitor——记一次二开工具的经历
明天开始考试周,百无聊赖开了一把CTF,还顺带体验了下二开工具,让无聊的Z3很开心🙂 CachedVisitor这题 大概描述一下:从main.lua加载一段visit.script中被##LUA_START##(.-)##LUA_END##包裹的lua代码 main.lua loca…...
实现自定义集合类:深入理解C#中的IEnumerable<T>接口
文章目录 介绍主要成员示例代码约束常见的约束类型示例代码介绍 在C#中,IEnumerable<T> 是一个泛型接口,用于表示可以被枚举的集合。它定义了用于遍历集合中元素的方法和属性。IEnumerable<T> 是 IEnumerable 的泛型版本,提供了类型安全的枚举功能。 当我们实…...
Compression Techniques for LLMs
Compression Techniques for LLMs 随着大型语言模型(LLMs)的迅速发展,提高其计算效率和存储效率成为研究的重要方向。为了实现这一目标,诸多压缩技术应运而生。本文将深入探讨几种有效的压缩技术,这些技术不仅能够降低…...
Nexus Message Transaction Services(MTS)
Nexus 系列交换机遇到以下情形时,可以尝试查看是否是 MTS 消息卡在缓冲区过多,因为 MTS 负责处理模块内以及跨模块(包括跨管理引擎)的各服务之间的消息路由和排队。 • CPU 高 • 命令行无响应、响应慢 • 控制平面中断 • 流量问…...

2025年Stable Diffusion安装教程(超详细)
StableDiffusion的安装部署其实并不困难,只需简单点击几下,几分钟就能安装好,不管是windows还是苹果mac电脑,关于StableDiffusion的各种安装方式,这片文章一一来给大家讲明白。(所有安装资料都给大家整理好…...

力扣【SQL连续问题】
180. 连续出现的数字 SELECT DISTINCT if(a.num b.num AND b.num c.num,a.num,null) AS ConsecutiveNums FROM Logs a LEFT OUTER JOIN Logs b ON a.id1 b.id LEFT OUTER JOIN Logs c ON a.id2 c.id WHERE if(a.num b.num AND b.num c.num,a.num,null) IS NOT NULL603. 连…...

深圳市-地铁线路和站点名称shp矢量数据(精品)2021年-2030最新arcmap含规划路线内容测评分析
深圳市的地铁网络是城市公共交通系统的重要组成部分,随着城市的发展,其规模和覆盖范围也在不断扩大。这份"深圳市-地铁线路和站点名称shp矢量数据(精品)2021年-2030最新arcmap含规划路线.zip"压缩包提供了全面而详细的信…...
企业级网络运维管理系统深度解析与实践案例
企业级网络运维管理系统深度解析与实践案例 在当今这个信息化时代,企业网络系统的稳定运行和高效管理成为了业务持续发展和创新的关键。企业级网络运维管理系统作为支撑这一目标的基石,其重要性不言而喻。本文将深入探讨企业级网络运维管理系统的构建原则、关键组件、实施步…...

音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现
一、引言 从《音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介》中可以知道,PS流由一个个pack(包装)组成。一个pack 一个pack_header 一个或多个PES_packet。pack_header中还可能存在system header…...

【问题记录】npm create vue@latest报错
1,错误日志 npm error code EPERM npm error syscall mkdir npm error path D:\Program Files\nodejs\node_cache\_cacache npm error errno EPERM npm error FetchError: Invalid response body while trying to fetch https://registry.npmjs.org/create-vue: EP…...

OpenGL材质系统和贴图纹理
上一篇文章当中笔者为大家介绍了风氏光照模型,相信大家也发现了光照着色器当中有设置有很多控制光照强度的参数,而所谓的材质系统就是我们可以人为的去调节这些参数,让一个物体的反光效果能够更加接近我们现实生活当中的一些物体。 材质系统…...
Markdown中类图的用法
Markdown中类图的用法 前言语法详解基本流程图几何图形节点默认的节点分离节点的ID与内容节点形状圆角形节点的语法圆形节点的语法。非对称节点语法菱形节点的语法。六角形节点的语法。平行四边形节点的语法。梯形节点的语法。 连接线基本的连接线语法。无向线段连接线。点状连…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...