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来进行数据库配置…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
