无头服务(Headless Service)

无头服务

无头服务(Headless Service)是 Kubernetes 中的一种特殊服务类型,主要用于提供稳定的网络标识,而不需要通过负载均衡来分配流量。它允许直接访问 Pod,而不经过集群内的负载均衡器,并且通常用于有状态的应用场景(如 StatefulSet)。无头服务的典型用例是数据库、缓存、或者有状态的集群应用。

无头服务的特点

  1. 没有 Cluster IP:与普通服务不同,无头服务不分配 ClusterIP,因此不会通过服务的 IP 地址进行负载均衡。
  2. 直接解析到 Pod IP:当客户端通过无头服务的 DNS 名称查询时,Kubernetes 会直接返回与该服务匹配的 Pod 的 IP 地址列表。客户端可以直接与这些 Pod 通信。
  3. 有状态应用:无头服务常用于有状态的应用,如 Kafka、Elasticsearch、Zookeeper 等,这类应用需要能够直接访问特定 Pod,而不是通过负载均衡器随机访问。也会通常与 StatefulSet 结合使用,以便于有状态应用能够通过稳定的网络标识直接访问各个 Pod
  4. 自定义负载均衡:在某些情况下,应用可能希望自己管理负载均衡,而不依赖 Kubernetes 提供的负载均衡功能。

无头服务的 DNS 解析

​ 无头服务的 DNS 解析与普通服务不同。普通服务通过单个 ClusterIP 提供服务,而无头服务返回的 DNS 记录是所有匹配的 Pod 的 IP 地址列表。以下是几种 DNS 解析方式:

  • Pod 级别的 DNS 解析:客户端可以通过 <pod-name>.<svc-name>.namespace.svc.cluster.local 直接访问特定 Pod。
  • 服务级别的 DNS 解析:无头服务会返回一个包含所有相关 Pod 的 IP 地址的列表,客户端可以选择其中一个进行通信。

无头服务与 Pod 的关联

​ 无头服务(Headless Service)与 Pod 的关联主要是通过选择器(selector)来完成的。无头服务通过选择器将流量路由到符合条件的 Pod,而 Deployment 负责创建和管理这些 Pod,它定义了要运行的 Nginx Pod 的副本和配置。使用标签(label)来标识这些 Pod。Kubernetes 中的服务选择器只能选择与服务位于同一命名空间中的 Pod。因此,定义无头服务的 selector 必须匹配它所管理的 Pod 的标签,而这些 Pod 必须在同一命名空间中。

关联流程
  1. 创建 Deployment:Deployment 会创建多个 Pod,并将这些 Pod 赋予 app: nginx 标签。
  2. 创建无头服务:无头服务根据选择器 app: nginx 查找所有带有该标签的 Pod。
  3. DNS 解析:无头服务会为每个 Pod 创建 DNS 记录,格式为 <pod-name>.nginx-headless.<namespace>.svc.cluster.local,允许直接通过 DNS 名称访问每个 Pod。

创建无头服务

​ 要创建一个无头服务,只需在服务的 spec 中将 clusterIP 字段设置为 None。以下是一个创建无头服务的示例:

apiVersion: v1
kind: Service
metadata:name: nginx-headlessnamespace: test
spec:clusterIP: None  # 无头服务,不分配 ClusterIPselector:app: nginx-headless  # 选择带有 app: nginx 标签的 Podports:- port: 80targetPort: 80
  • clusterIP: None:表示这是一个无头服务,不会分配 ClusterIP。无头服务直接返回匹配 Pod 的 IP 地址。
  • selector: app: nginx-headless:选择所有带有 app: nginx-headless 标签的 Pod。
  • ports:定义服务监听的端口和目标端口,port: 80 是服务端口,targetPort: 80 是 Pod 上的容器端口。

创建 nginx deployment

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-headlessname: nginx-headlessnamespace: test
spec:replicas: 2selector:matchLabels:app: nginx-headlesstemplate:metadata:labels:app: nginx-headlessspec:containers:- image: m.daocloud.io/docker.io/library/nginx:latestname: nginxports:- name: httpcontainerPort: 80       #容器端口
  • metadata.labelsspec.selector.matchLabels:确保 Deployment 和 Service 的标签匹配,使无头服务能够选择这些 Pod。
  • replicas: 2:指定运行两个 Nginx Pod。
  • template.metadata.labels:Pod 模板中的标签,确保 Pod 带有 app: nginx-headless 标签。
  • containers:定义容器的镜像和端口设置,containerPort: 80 是容器中的端口。

测试

image-20240912145504871

测试部署的 nginx 的 PodIP 分别为

pod/nginx-headless-69db456d87-k4x4b 10.244.2.212 node2
pod/nginx-headless-69db456d87-ztdt4 10.244.1.62 node1

本地测试

测试本地服务解析

<service>.<namespace>.svc.cluster.local

# 测试本地DNS解析无头服务
kubectl exec -it nginx -n test -- nslookup nginx-headless.test.svc.cluster.local

image-20240912145804109

测试本地单个 Pod 解析

<pod-name>.nginx-headless.<namespace>.svc.cluster.local

# 测试本地DNS解析单个pod
kubectl exec -it nginx -n test -- nslookup nginx-headless-69db456d87-k4x4b.nginx-headless.test.svc.cluster.local

image-20240912150154523

跨域测试

导出无头服务

# 导出服务
subctl export service --namespace test nginx-headless
# 查看serviceimport
kubectl get serviceimport -A
# 查看serviceexport
kubectl get serviceexport -A

image-20240912150351501

测试跨域服务解析

<service>.<namespace>.svc.clusterset.local 或者

<clusterid>.<service>.<namespace>.svc.clusterset.local

kubectl exec -it nginx -n test -- nslookup nginx-headless.test.svc.clusterset.local
# 或者
kubectl exec -it nginx -n test -- nslookup pve3.nginx-headless.test.svc.clusterset.local

image-20240912150700976

image-20240912150737154

测试跨域单个 Pod 解析

<pod-name>.<clusterid>.<service>.<namespace>.svc.clusterset.local

kubectl exec -it nginx -n test -- nslookup nginx-headless-69db456d87-ztdt4.pve3.nginx-headless.test.svc.clusterse
t.local

image-20240912150926039

以上可解析的情况均可访问
image-20240912151046982

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis常用操作及springboot整合redis

1. Redis和Mysql的区别 数据模型&#xff1a;二者都是数据库,但是不同的是mysql是进行存储到磁盘当中,而Redis是进行存储到内存中. 数据模型 : mysql的存储的形式是二维表而Redis是通过key-value键值对的形式进行存储数据. 实际的应用的场景: Redis适合于需要快速读写的场景&…

FreeRTOS学习笔记(二)任务基础篇

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2…

python安装包的三种区别

python安装包的三种区别&#xff1a; Download Windows x86 web-based installer Download Windows x86 executable installerDownload Windows x86 embeddable zip fileDownload Windows x86-64 web-based installerDownload Windows x86-64 executable installerDownload W…

使用mingw64 编译 QT开发流程

1. 安装QT5 QT5.12.12 安装时选择mingw的开发包 2. 使用qtdesigner 进行ui设计 生成ui文件 3. 将ui文件转换为.h 文件 uic mywindow.ui -o ui_mywindow.h代码中指向生成的 UI 对象的地方 要改成这个Form 4. 编译 创建mainwindow.cpp #include "mainwindow.h"…

Python Flask_APScheduler定时任务的正确(最佳)使用

描述 APScheduler基于Quartz的一个Python定时任务框架&#xff0c;实现了Quartz的所有功能。最近使用Flask框架使用Flask_APScheduler来做定时任务&#xff0c;在使用过程当中也遇到很多问题&#xff0c;例如在定时任务调用的方法中需要用到flask的app.app_context()时&#…

绍兴视角下的广州温暖:星贝育园——自闭症儿童的关怀之家

在绍兴这座充满人文情怀的城市里&#xff0c;人们对自闭症儿童的关注与关怀如同涓涓细流&#xff0c;汇聚成爱的海洋。当谈及为这些特殊孩子寻找一个温馨、专业的成长环境时&#xff0c;广州的星贝育园自闭症儿童寄宿制学校无疑是众多家庭心中的理想之选。这所学校以其独特的关…

代码随想录Day 42|leetcode题目:188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;188.买卖股票的最佳时机IV解题思路&#xff1a; 题目二&#xff1a;309.最佳买卖股票时机含冷冻期解题思路&#xff1a; 题目三&#xff1a; 714.买卖股票的最佳时机含手续…

摊牌了!一文教会你轻松上手豆包MarsCode 编程助手!

豆包MarsCode 编程助手是豆包旗下的 AI 编程助手&#xff0c;提供以智能代码补全为代表的 AI 功能。豆包MarsCode 编程助手支持主流的编程语言和 IDE&#xff0c;在开发过程中提供单行代码或整个函数的编写建议。此外&#xff0c;它还支持代码解释、单测生成和问题修复等功能&a…

有关采用parallelStream并行流处理List并使用自定义线程池和lettuce redis客户端一起使用的问题

在使用parallelStream进行处理list时&#xff0c;如不指定线程池&#xff0c;默认的并行度采用cpu核数进行并行&#xff0c;这里采用ForJoinPool来指定线程池&#xff0c;但循环中使用了luttuce 来获取redis的key时&#xff0c;出现没有控制住线程池的线程数问题。具体上代码。…

SAP B1 学习笔记 - 易混淆字段名(持续更新中)

背景 在 SAP B1 的单据中&#xff0c;由于同一单据时常对应着多个后台表单&#xff0c;且后台表单内包含的字段信息往往远大于单据显示出来的&#xff0c;在配置时经常出现多个字段混淆、无系统信息提示字段名模糊的情况&#xff0c;这里总结常见的易混淆难查找的后台字段名。…

AIGC6: 走进腾讯数字盛会

图中是一个程序员&#xff0c;去参加一个技术盛会。AI大潮下&#xff0c;五颜六色&#xff0c;各种不确定。 背景 AI对各行各业的冲击越来越大&#xff0c;身处职场的我也能清晰的感受到。 我所在的行业为全球客服外包行业。 业务模式为&#xff1a; 为国际跨境公司提供不同…

使用C++编写一个语音播报时钟(Qt)

要求&#xff1a;当系统时间达到输入的时间时&#xff0c;语音播报对话框中的内容。定时可以取消。qt界面如上图所示。组件如下&#xff1a; countdownEdit作为书写目标时间的line_edit start_btn作为开始和停止的按钮 stop_btn作为取消的按钮 systimelab显示系统时间的lab tex…

Java后端程序员简单操作Linux系统命令

Linux系统概述 Linux 内核最初是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上 学时而编写的一个开源的操作系统。 Linux&#xff08;管理计算机硬件资源&#xff0c;任务调度&#xff09;支持多用户&#xff0c;支持网络&#xff0c;支持多线…

Vue3:el-table实现日期的格式化

后端如果返回的是时间戳&#xff0c;需要我们进行日期格式化 例如&#xff1a;2024-09-11T14:19:14 定义一个日期解析的工具组件 export function formatDateAsYYYYMMDDHHMMSS(dateStr: any) {const date new Date(dateStr);const year date.getFullYear();const month S…

踩最深的坑,教会自己找到需求

目录 引言 1. 寻找合适的需求 2. 海外市场选择 3. 线下热点判断 4. 线上关注度分析 5. 当前竞争分析 6. 未来潜力分析 引言 在经历了刻骨铭心的合伙创业经历后&#xff0c;我意识到是时候该独立出海了。 捡起早已深埋在心里的创业想法&#xff0c;开始独自创业。 这次…

[笔记] 电机工作制以及软硬特性的本质推导

原始资料来源&#xff1a;某电机厂商 1.电机非常规操作术语和许可次数 1.1 电机操作术语 点动&#xff1a;通电后立即关停&#xff0c;最终速度不到额定转速的1/4电制动&#xff1a;制动到额定转速的1/3逆转&#xff1a;也就是打反车&#xff0c;不等停车&#xff0c;立即翻…

stm32之硬件SPI读写W25Q64存储器应用案例

系列文章目录 1. stm32之SPI通信协议 2. stm32之软件SPI读写W25Q64存储器应用案例 3. stm32之SPI通信外设 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例代码分析3.1 基本思路3.2 相关库函数介绍3.3 MySPI模块3.3.1 模块初始化3.3.2 SPI基本时序单元模…

01_Python基本语法

Hello Python 与其他编程一样&#xff0c;第一个程序都是输出Hello World!。 print("Hello World!")print() 函数由两部分构成 &#xff1a; 指令&#xff1a;print指令的执行对象&#xff0c;在 print 后面的括号里的内容 Hello World!。 Python程序的执行流程如…

机器学习中最常见的50个问题(进阶篇)

机器学习中最常见的50个问题 进阶篇 1.解释SVM的工作原理。 SVM&#xff0c;全称支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种有监督学习算法&#xff0c;主要用于解决数据挖掘或模式识别领域中的数据分类问题。 SVM的工作原理是建立一个最…

【排序算法】之基数排序

一、算法介绍 基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按低位到高位或者高位到低位的顺序&#xff0c;依次根据每一位的数值进行排序。通常情况下&#xff0c;基数排序会使用桶排序来处理每一位上的数值。 实现方法主要有如下&#xff1a; 最高位优先(…