Kubernetes之Headless Services
Kubernetes中的Headless Services(无头服务)是一种特殊类型的服务(Service)定义,它不提供传统意义上的负载均衡和集群IP地址分配。在无头服务中,spec.clusterIP 字段被显式设置为None ,Kubernetes不会为该服务分配一个虚拟IP(ClusterIP)地址。
一、无头服务的特点
-
没有Cluster IP:不分配Cluster IP,客户端不能通过服务的Cluster IP地址访问后端Pod,而是直接通过Pod的具体地址进行通信。
-
直接使用DNS解析:Kubernetes的DNS系统会为无头服务生成一条特殊的DNS记录,这条记录列出所有关联Pod的IP地址,允许客户端通过域名解析直接获得Pod列表,进而实现自定义的负载均衡或服务发现逻辑。
-
适用于状态服务应用:特别适合那些需要直接与特定实例通信的应用场景,如分布式数据库、消息队列等有状态服务,因为这些服务往往需要客户端直接与服务实例建立会话或维持连接状态。
二、headless Service和普通Service的区别
-
headless不分配clusterIP
-
headless service可以通过解析service的DNS,返回所有Pod的地址
-
普通的service,只能通过解析service的DNS返回service的ClusterIP。client访问ClusterIP,通过iptables或者ipvs转发到Real Server(Pod)
三、无头服务应用场景
-
有状态应用(StatefulSet):在部署有状态应用时,如分布式数据库集群(如Zookeeper、MySQL等),需要客户端直接访问特定节点,而不是通过负载均衡随机分配。比如MongoDB副本集,需要每个节点直接相互通信或客户端直接访问特定节点。比如Zookeeper、etcd集群,节点间需要相互发现并建立连接。
-
服务发现与自定义负载均衡:当应用需要实现自定义的负载均衡算法或服务发现逻辑时,无头服务允许应用直接与后端Pod列表交互,便于实现更精细的控制逻辑。
-
Session亲和性:对于需要维护会话状态的应用,使用无头服务可以直接指向会话所属的Pod,确保会话的一致性。
四、实验测试
- 普通的service
[root@node1 ~]# kubectl get po -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-5977dc5756-ksff2 1/1 Running 0 22h 172.16.28.42 node3 <none> <none>
test-5977dc5756-vrbg2 1/1 Running 0 22h 172.16.154.23 node1 <none> <none>
test-5977dc5756-zgw4c 1/1 Running 0 22h 172.16.44.33 node2 <none> <none>
[root@node1 ~]# kubectl get svc -n test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.233.23.79 <none> 80/TCP 19d
[root@node1 ~]#
[root@node1 ~]# kubectl get endpoints -n test
NAME ENDPOINTS AGE
nginx-svc 172.16.154.23:80,172.16.28.42:80,172.16.44.33:80 19d
[root@node1 ~]# 我们在物理机使用dig指定coredns 地址进行解析svc,如下:
[root@node1 ~]# dig @10.233.0.3 nginx-svc.test.svc.test.com; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> @10.233.0.3 nginx-svc.test.svc.test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1089
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx-svc.test.svc.test.com. IN A;; ANSWER SECTION:
nginx-svc.test.svc.test.com. 30 IN A 10.233.23.79 ###此处得知返回结果为cluster ip;; Query time: 1 msec
;; SERVER: 10.233.0.3#53(10.233.0.3)
;; WHEN: Thu May 09 14:42:27 CST 2024
;; MSG SIZE rcvd: 99
- headless service
[root@node1 ~]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
maradb-0 1/1 Running 0 22h 172.16.44.32 node2 <none> <none>
maradb-1 1/1 Running 0 22h 172.16.28.44 node3 <none> <none>
maradb-2 1/1 Running 0 21h 172.16.154.25 node1 <none> <none>
[root@node1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 396d
mariadb ClusterIP None <none> 3306/TCP 22h我们在物理机使用dig指定coredns 地址进行解析svc,如下:
[root@node1 ~]# dig @10.233.0.3 mariadb.default.svc.test.com; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> @10.233.0.3 mariadb.default.svc.test.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35068
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;mariadb.default.svc.test.com. IN A;; ANSWER SECTION:
mariadb.default.svc.test.com. 30 IN A 172.16.28.44 ##此处得知返回的结果为pod的真实地址
mariadb.default.svc.test.com. 30 IN A 172.16.154.25
mariadb.default.svc.test.com. 30 IN A 172.16.44.32;; Query time: 1 msec
;; SERVER: 10.233.0.3#53(10.233.0.3)
;; WHEN: Thu May 09 14:27:43 CST 2024
;; MSG SIZE rcvd: 189
五、使用无头服务的好处
-
简化服务发现:通过DNS记录直接提供Pod列表,简化了服务发现过程,特别是对于需要直接与各个实例交互的应用。
-
增强控制灵活性:允许应用层决定如何分配请求到各个Pod,适应特定的业务逻辑或性能需求。
-
支持有状态应用部署:更好地匹配有状态应用的部署需求,确保数据的一致性和可靠性。
-
减少网络跳转:去除了一层负载均衡,减少了网络延迟,提高了通信效率。
使用无头服务是为了在某些特定场景下,绕过Kubernetes的常规服务代理和负载均衡机制,以实现更直接、更灵活的服务实例访问方式,特别是在需要保持会话状态、实现自定义负载策略或部署有状态应用的场景中。这种方式提供了更高的灵活性和对底层基础设施的直接控制能力。
相关文章:
Kubernetes之Headless Services
Kubernetes中的Headless Services(无头服务)是一种特殊类型的服务(Service)定义,它不提供传统意义上的负载均衡和集群IP地址分配。在无头服务中,spec.clusterIP 字段被显式设置为None ,Kubernet…...

银行监管报送系统系列介绍(十七):一表通2.0
国家金融监督管理总局于9月发布了【一表通2.0(试用版)】(简称:一表通2.0),在原试点报送范围的基础上扩大了试点报送区域,意味着将陆续扩大试报送机构范围,推进的速度已明显加快。尽早…...

网络安全之OSPF进阶
该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。 OSPF基础的内容请查看:网络安全之动态路由OSPF基础-CSDN博客 OSPF中更新方式中的触发更新30分钟的链路状态刷新。是因为其算法决定的,距离矢量型协议是边算边…...

Ubuntu虚拟机上推荐一款免费好用的git版本管理工具
工具叫: gitg 软件界面如下: FR:徐海涛(hunkxu)...

python下载及安装
1、python下载地址: Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2、python安装 (1) 直接点击下载后的可执行文件.exe (2&…...

visual studio2022 JNI极简开发流程
文章目录 1 创建java类2 生成JNI头文件3 使用visual studio2022创建DLL项目3.1 选择模板中(Windows桌面向导)3.2 为项目命名3.3 选择应用程序类型为动态链接库3.4 项目概览 4 导入需要的头文件4.1 导入需要的头文件4.2 修改头文件 5 编写C实现6 生成dll文…...

Linux 第三十章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...

Linux网络——自定义序列化与反序列化
前言 之前我们学习过socket之tcp通信,知道了使用tcp建立连接的一系列操作,并通过write与read函数能让客户端与服务端进行通信,但是tcp是面向字节流的,有可能我们write时只写入了部分数据,此时另一端就来read了&#x…...
大模型介绍
大模型通常指的是参数量超过亿级别,甚至千亿级别的深度学习模型。这类模型能够处理更加复杂的任务,并在各项基准测试中取得了优异的成绩。大模型在自然语言处理、计算机视觉、推荐系统等领域都取得了显著的成果。 大模型的主要优势在于其强大的表征能力&…...
【思维】根号分治
写在前面的话: 个人理解 根号分治本身就是一种卡着评测机过题的做法,所以非必要不要写 #define int long long !!! 本篇博客参考:暴力美学——浅谈根号分治 做到过两三题根号分治了,来总结一下…...

Linux线程(三)死锁与线程同步
目录 一、什么是死锁 死锁的四个必要条件 如何避免死锁 避免死锁算法 二、Linux线程同步 三 、条件变量 1、条件变量基本原理 2、条件变量的使用 3、条件变量使用示例 为什么 pthread_cond_wait 需要互斥量? 一、什么是死锁 死锁是计算机科学中的一个概念,…...

SpringAMQP 发布订阅-TopicExchange
根据这个模型编写代码: RabbitListener(bindings QueueBinding(value Queue(name "topic.queue1"),exchange Exchange(name "itcast.topic",type ExchangeTypes.TOPIC),key {"china.#"}))public void listenTopicQueue1(String msg){Syst…...

uniapp h5 配置代理服务器
"devServer": {"disableHostCheck": true,"proxy": {"/api": {// 需要被代理的后台地址"target": "http://自己的地址","changeOrigin": true,"secure": false,"pathRewrite": {&q…...

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移 在本文中,将介绍如何构建一个实时数据pipeline,从MySQL数据库读取数据,通过Kafka传输数据,最终将数据存储到HDFS中。我们将使用Apache Spark的结构化流处理和流处理功能&#…...

一篇文章拿下Redis 通用命令
文章目录 Redis数据结构介绍Redis 通用命令命令演示KEYSDELEXISTSEXPIRE RedisTemplate 中的通用命令 本篇文章介绍 Redis 的通用命令, 通用命令在 Redis 的所有数据类型下都使用, 学好通用命令可以让我们更好的使用 Redis. Redis数据结构介绍 Redis 是一个key-value的数据库&…...
锂电池充电充放电曲线分析
前言 锂电池的充电曲线通常包括三个阶段:恒流充电阶段、恒压充电阶段和滞后充电阶段。在恒流充电阶段,电流保持恒定,电压逐渐增加;在恒压充电阶段,电压保持恒定,电流逐渐减小;在滞后充电阶段,电流进一步减小,电池开始充满。通过监测这些阶段的电流和电压变化,可以评…...
vue3 第二十九节 (vue3 事件循环之nextTick)
引言 vue 项目中为什么要使用 nextTick 这个函数,是做什么用的,解决了哪些问题 1、nextTick 作用 用于处理DOM更新完成之后,执行回调函数的方法; 2、实现方案 vue2 中 nextTick() 是基于浏览器的 异步队列和微任务队列而执行…...

使用Flask-SocketIO构建实时Web应用
文章目录 准备工作编写代码编写HTML模板运行应用 随着互联网的发展,实时性成为了许多Web应用的重要需求之一。传统的HTTP协议虽然可以实现实时通信,但是其长轮询等机制效率低下,无法满足高并发、低延迟的需求。为了解决这一问题,诞…...

可重构柔性装配产线:为工业制造领域注入了新的活力
随着科技的飞速发展,智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中,可重构柔性装配产线以其独特的技术优势和创新理念,为工业制造领域注入了新的活力,开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…...

懒人网址导航源码v3.9
测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44 为防止调试错误,建议使用测试环境运行的php与mysql版本 首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不行,请直接复制数据库内容运行sql语句也可以 再修改config.php来进行数据库配置…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...