Kubernetes基础(二)-Headless Service

news2024/11/24 2:08:27

1 简介

Headless Service是一种特殊的服务类型,它不会分配虚拟 IP,而是直接暴露所有 Pod 的 IP 和 DNS 记录。这客户端可以直接访问 Pod IP 地址,并使用这些 IP 地址进行负载均衡。

Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP。也被称为无头服务。

案例:

创建一个 Headless Service 如下:

apiVersion: v1
kind: Service
metadata:
    name: statefulset-service
spec:
    clusterIP: None
    selector:
        app: statefulset-app
    ports:
        - name: http
          port: 80

这样就创建了一个名为 statefulset-service 的 Headless Service,并且选择了标签为 app: statefulset-app 的所有 Pod 作为其后端。

当查询该 Service 的 DNS 记录时,就会得到如下结果:

$ nslookup statefulset-service.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10#53

Name: statefulset-service.default.svc.cluster.local
Address: 10.244.0.5
Name: statefulset-service.default.svc.cluster.local
Address: 10.244.0.6
Name: statefulset-service.default.svc.cluster.local
Address: 10.244.0.7

可以看到,返回了三个 IP 地址,分别对应于三个 Pod 的 IP 地址。

如果想要访问其中一个 Pod,比如 pod-1,可以使用 pod-1.statefulset-service.default.svc.cluster.local 这样的域名来访问。

2 Headless 工作原理

当创建一个名为 statefulset-service 的 Headless 服务时,Kubernetes 将为每个 Pod 创建一个 DNS 记录。这个 DNS 实体的名称采用形式:“{podname}.{headless-name}.{namespace}.svc.cluster.local”。

  • {podname}是 Pod 名称
  • {headless-name}是 Headless 服务名称
  • {namespace}是命名空间名称

当查询"pod-1.statefulset-service.default.svc.cluster.local"时,将以 DNS 方式返回一个 A 记录,其中包含所有匹配的 Pod IP 地址。这意味着可以通过 Pod IP 地址直接访问 Headless 服务,并使用 CoreDNS 返回 A 记录中的 IP 地址进行负载均衡(当然可以使用配置的 LoadBalancer,而不是 Kubernetes 提供的负载均衡)。

3 Headless 优缺点

3.1 优点

  • 高度动态和可扩展:由于没有虚拟 VIP,Headless 服务对 Pod 的数量没有限制,具有高度动态和可扩展的特性。
  • 直接访问 Pod IP 地址:与 ClusterIP 相比,在 Headless 服务中没有默认负载均衡器,因此可以直接访问 Pod 的实际 IP 地址。
  • API 选择器的支持:在 Headless 服务中,支持 API 选择器。这使得我们可以根据标签选择特定的 Pod。

3.2 缺点

  • 没有默认负载均衡器:由于没有默认负载均衡器,所以我们需要手动进行负载均衡。

4 Headless 与 ClusterIP 区别

ClusterIP 是 Kubernetes 默认的服务类型。它为 Pod 组提供了一个虚拟 IP,并通过代理模式进行负载均衡。当在编写 Service 配置文件时,通常会指定 ClusterIP 类型。这样就可以使用 Virtual IP 在 Kubernetes 中跨节点访问 Pod 组。

另一方面,Headless 服务类型并不分配虚拟 IP,而是直接暴露所有 Pod 的 DNS 记录。没有默认负载均衡器,可直接访问 Pod IP 地址。因此,当需要与集群内真实的 Pod IP 地址进行直接交互时,Headless 服务就派上用场了。

5 headless svc和 普通svc 区别

普通 svc

可以看作是有头svc, 表示svc本身也有一个地址(cluster ip), dns查询时只会返回Service的地址, 具体client访问的是哪个Real Server,是由iptables来决定的。

headless svc
headless 无头, 无头表示这个svc的负载均衡是没有clusterip的, dns查询会如实的返回2个真实的endpoint。
 

6 Headless 使用场景

Headless 服务类型通常适用于需要直接访问 Pod IP 地址的分布式应用程序,尤其是以下几种场景:

  • 数据库集群:数据库集群需要高可用性和可扩展性,并且要求能够在任何时候访问每个节点。Headless 服务可以为每个节点分配一个唯一的 DNS 实体名称,从而支持直接访问 Pod IP 地址,实现负载均衡和故障转移。
  • 消息队列:消息队列需要高吞吐量和低延迟,以支持实时数据处理和流式计算。Headless 服务可以为每个节点分配一个唯一的 DNS 实体名称,从而支持与节点的直接交互和负载均衡,实现数据传输的高效性。
  • 分布式缓存:分布式缓存需要支持多个节点之间的数据同步和复制,并且要求能够在任何时候访问每个节点。Headless 服务可以为每个节点分配一个唯一的 DNS 实体名称,从而支持直接访问 Pod IP 地址,实现数据的高可用性和可靠性。
  • 超高性能应用程序:超高性能应用程序需要支持动态扩展和负载均衡,并且要求能够在任何时候被每个节点,同时对延迟敏感。Headless 服务可以为每个节点分配一个唯一的 DNS 实体名称,从而支持直接访问 Pod IP 地址,实现高可用性和可靠性。在这些情况下,每个节点都有自己的身份和状态,需要使用持久化存储进行数据共享。

在调用某个节点时,单个服务和端点并不太重要,而是要保证在数据共享期间追踪正确的节点。这种情况下,使用 Headless 服务就非常有用了。

7 为什么要用headless service+statefulSet部署有状态应用?

headless service一般和statefulSet结合使用,其关联关系是:

  • headless service会为关联的Pod分配一个域<service name>.$<namespace name>.svc.cluster.local
  • StatefulSet会为关联的Pod保持一个不变的Pod Name,statefulset中Pod的hostname格式为$(StatefulSet name)-$(pod序号)
  • StatefulSet会为关联的Pod分配一个dnsName,域名标准是:$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local。

Headless Service首先是Service,一般的Service能被内部和外部访问。之所以叫Headless Service是因为只对内提供访问,需要提供稳定的访问能力,否则就没什么作用了。比如说拥有固定的Pod名称和存储,所以一般会结合StatefulSet一起使用,用来部署有状态的应用。

8 Headless 对 Kube-proxy 的影响

Headless 服务对 Kube-proxy 的影响主要体现在其负载均衡的实现方式上。在 Kubernetes 中,Kube-proxy 负责为 Service 提供负载均衡功能,以便客户端能够直接连接到任意一个 Pod。对于 ClusterIP 类型的 Service,Kube-proxy 会创建一个虚拟 IP 地址,并将请求发送到该地址所绑定的一个或多个 Pod 上。

而对于 Headless Service,Kube-proxy 创建的是一组 DNS 记录,用于解析到每个 Pod 的 IP 地址。这样,客户端就可以通过 DNS 解析来得到 Pod 的 IP 地址,并与它直接建立连接,完全绕过了 Kube-proxy 组件。

对于 Kube-proxy + IPVS 方式(即使用 IPVS 实现 Kube-proxy 的负载均衡),Headless 服务同样不会受到 IPVS 的影响,因为它们都是通过直接访问 Pod IP 地址来实现负载均衡的。在这种情况下,IPVS 只会提供网络层转发的功能,并没有更深层次的介入。

因此,当使用 Headless 服务时,需要手动进行负载均衡。

9 CoreDNS 如何与 Headless 协作的

CoreDNS 是 Kubernetes 中的默认 DNS 服务器,它管理着整个集群的服务发现。CoreDNS 是一种单独的容器,可以在每个节点上运行。当 CoreDNS 启动时,它会检索 kube-apiserver 中的整个服务定义,并将其转换为 DNS 记录。

当创建一个 Headless 服务时,CoreDNS 将为每个 Pod 创建一个 DNS 记录,该记录直接指向 Pod 的实际 IP 地址。这将有助于在 Headless 服务类型中对 Pod 进行直接访问。

使用Headless service的流量均衡负载的能力是由 CoreDNS 的 RR 轮询算法来实现的。

10 Headless 和 Endpoint 之间的关系

Headless 服务类型下所有 Pod 将作为独立的 Endpoint 发布到 Kubernetes API 服务器中。这使得其他适用于 ClusterIP 服务类型的 Kubernetes 组件可以对其进行发现和路由。

在 Headless 服务中,可以使用 Endpoints 对象来访问所有 Pod IP 地址。这是一个由 Kubernetes 自动生成的对象,其中包含了相应 Service 的全部 Endpoint 信息。

在 Endpoint 对象方面,它的主要作用是管理具体的 Pod IP 地址,并与 Headless 服务保持同步。当 Pod 发生故障或需要进行扩容时,Endpoint 对象会及时更新,并确保 Headless 服务始终具有最新的 Pod IP 地址。这样可以确保开发者能够始终访问到可用的 Pod,并保证应用程序的稳定性和可靠性。

11 Selector 是如何影响 Headless 和 CoreDNS?

使用了 CoreDNS 的集群默认会配置自动服务发现,它能够根据 Service 和 Endpoint 对象自动生成 DNS 解析记录。对于普通的 Service 对象,CoreDNS 会将其 ClusterIP 映射到一个域名下,这个域名为 {service-name}.{namespace}.svc.cluster.local。而对于 Headless Service,由于没有 Selector 对象,CoreDNS 将不会生成对应的 A 记录,只会生成 SRV 记录。

具体来说,在使用了 CoreDNS 的 Kubernetes 集群中,对于 Headless Service,CoreDNS 会在域名 .{service-name}.{namespace}.svc.cluster.local 下生成一个 SRV 记录,这个记录包含了每个 Pod 的 IP 地址和端口号。客户端可以通过查询这个 SRV 记录来获取所有 Pod 的地址和端口号,并进行连接。换句话说,使用了 CoreDNS 的 Kubernetes 集群,Headless Service 可以正常工作,并且提供了更加灵活的负载均衡方式,客户端可以通过查询 SRV 记录,灵活选择需要连接的 Pod。

需要注意的是,在使用了 CoreDNS + Headless Service 的场景中,如果想要实现服务发现和负载均衡功能,客户端必须支持 SRV 记录类型。因此,在开发应用时,需要确保客户端能够正确地解析并使用 SRV 记录。

12 使用 Headless 的风险

  • 直接暴露所有 Pod 的 DNS 记录可能导致安全漏洞。恶意用户可能会利用 Headless 服务类型攻击系统。
  • 由于没有默认负载均衡器,因此需要手动进行负载均衡。这可能导致一些人员工作量过大,管理变得复杂。
  • 使用 Headless 服务可能会增加 DNS 服务器的工作量。在具有大量 Pod 和 Headless 服务的较大集群中,DNS 服务器可能会成为瓶颈。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

封装了一个中间放大效果的iOS轮播视图

效果图 计算逻辑 设定在中间展示的size&#xff0c;即正常size&#xff0c;然后设置水平和竖直方向上的margin, 在view的origin和scrollView的contentoffset相等的时候&#xff0c;即 视图处在正中间的时候&#xff0c;最大&#xff0c;然后通过计算其他视图的origin和scrollV…

计算机基础 堆和栈

首先我们需要知道的是栈和堆是两种数据结构 1.栈和堆的定义 栈&#xff1a;是一种先进后出的数据结构&#xff0c;是一种线性结构 堆是一种树形结构&#xff0c;是一颗完全二叉树&#xff0c; 其存储的元素可以通过指针或引用访问 最大堆【大根堆】 &#xff1a;堆中的每一个…

js-cookie使用 js深度克隆(判断引用类型是数组还是对象的方法)

cookie和深度拷贝的使用 1、js-cookie使用2、js深度克隆 1、js-cookie使用 前端的本地存储分为 localstorage、sesstionstorage、cookie 但是咱们有时候需要做7天免登录的需求时&#xff0c;选择 cookie 作为前端的本地存储是在合适不过的了 直接操作 cookie 可以&#xff0c; …

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关&#xff0c;在 Profinet 侧做为 Profinet 主站控制器&#xff0c;接 Profinet 设备&#xff0c;如伺服驱动器&#xff1b;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站&#xff0c;接 PLC、上位机、wincc 屏等。 拓扑…

Spring事务1+入门案例(简约银行转账)

0、事务基础概念 1.事务角色&#xff1a; 2.事务相关配置 一、配置文件的书写 1.JDBC配置文件 public class JdbcConfig {Value("${jdbc.driver}")private String driver;Value("${jdbc.url}")private String url;Value("${jdbc.username}")p…

win11安装h3c lab无法启动putty终端的解决方法

文章目录 问题记录作者自己的解决方法第一步&#xff1a;安装MobaXterm第二步&#xff1a;修改h3c lab的终端工具 问题记录 win11可以同时安装vm、virtualBox、typer-v安装&#xff0c;因为在最新的系统中已经兼容但是可能出现win11安装h3c lab无法启动putty终端的问题&#x…

数据结构_顺序表_尾插、尾删、头插、头删(附带详解)

文章目录 前言一. 线性表二. 顺序表 - - - 数组2.1 什么是顺序表2.2 顺序表一般可以分为2.2.1 静态顺序表&#xff08;使用定长数组存储元素&#xff09;2.2.2 动态顺序表&#xff1a;使用动态开辟的数组存储2.2.3 顺序表的接口实现 三. SeqList.c 中各个接口的实现。3.1 初始化…

Java实现Modbus Tcp协议读写模拟工具数据

标题 前言一、读写模拟工具中数据(1) 定义Controller层(2) 定义Service层实现 二、调试(1) 读数据(2) 向寄存器写单个数据(3) 向寄存器写多个数据 前言 参考文章&#xff1a;https://www.cnblogs.com/ioufev/p/10831289.html 该文中谈及常见的几种读取设备数据实现&#xff0…

无硬盘的版本 1099,14寸笔记本,而且无硬盘的,特别有有意思,可以自己购买个硬盘,安装linux系统或者windows。

1&#xff0c;千元笔记本&#xff0c;金属外壳 有人进行评测了&#xff1a; https://www.bilibili.com/video/BV1Td4y1K7Cp 1499元的全新笔记本&#xff0c;有什么猫腻&#xff1f; 看了下价格&#xff0c;现在还优惠400&#xff0c;变成了1099。 https://item.jd.com/100851…

Django — 请求和响应

目录 一、请求1、概念2、请求参数方式分类3、案例3.1、URL 路径参数3.2、查询字符串参数3.3、form 表单传参3.4、Json 格式参数3.5、上传文件 二、响应1、HttpResponse2、JsonResponse 三、GET 和 POST 区别1、相同点2、不同点 一、请求 1、概念 请求&#xff08;Request&…

DDR4 眼图测试方法

DDR的全拼是Double Data Rate SDRAM双倍数据速率同步动态随机存取内存。主要就是用在电脑的内存。他的特点就是走线数量多&#xff0c;速度快&#xff0c;操作复杂&#xff0c;给测试和分析带来了很大的挑战。目前DDR技术已经发展到了DDR5&#xff0c;性能更高&#xff0c;功耗…

【算法练习Day4】 两两交换链表节点删除链表倒数第 N 个结点环形链表 II

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 两两交换链表中的节点一…

毫米波雷达 TI IWR1443 在 ROS 中进行 octomap 建图

个人实验记录 /mmwave_ti_ros/ros_driver/src/ti_mmwave_rospkg/launch/1443_multi_3d_0.launch <launch><!-- Input arguments --><arg name"device" value"1443" doc"TI mmWave sensor device type [1443, 1642]"/><arg…

一例“msvc编译器O2优化导致的崩溃”的分析

1. 初步分析 某进程崩溃必现。 打开崩溃dmp&#xff0c;结合c源代码&#xff0c;崩溃大致发生在某dll代码里的这句&#xff1a;SAFE_DELETE(pContentData); En_HP_HandleResult CTcpOperation::OnClintReceive(HP_Client pSender, HP_CONNID dwConnID, const BYTE * pdata, i…

组队竞赛(int溢出问题)

目录 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 &#xff08;二&#xff09;正确代码 1. long long sum0 2. #define int long long 3. 使用现成的sort函数 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 #include <iostream&g…

机器学习的主要内容

分类任务 回归任务 有一些算法只能解决回归问题有一些算法只能解决分类问题有一些算法的思路既能解决回归问题&#xff0c;又能解决分类问题 一些情况下&#xff0c; 回归任务可以转化为分类任务&#xff0c; 比如我们预测学生的成绩&#xff0c;然后根据学生的成绩划分为A类、…

js制作柱状图的x轴时间, 分别展示 月/周/日 的数据

背景 有个需求是要做一个柱状图, x 轴是时间, y 轴是数量. 其中 x 轴的时间有三种查看方式: 月份/周/日, 也就是分别查看从当前日期开始倒推的最近每月/每周/每日的数量. 本篇文章主要是用来制作三种不同的 x 轴 从当前月开始倒推月份 注意 getMonth() 函数可以获取当前月份…

【【萌新的FPGA学习之实战流水灯】】

萌新的FPGA学习之实战流水灯 实验任务 本节的实验任务是使用领航者底板上的两个 PL LED 灯顺序点亮并熄灭&#xff0c;循环往复产生流水灯的效 果&#xff0c;流水间隔时间为 0.5s。 1MHz&#xff1d;1000000Hz 10的6次方 1ns&#xff1d;10的-9次方秒 开发板晶振50Mhz 计算得…

如何看待Unity新的收费模式?

文章目录 背景Unity的论点开发者的担忧如何看待Unity新的收费模式&#xff1f;1. 理解Unity的立场2. 考虑小型开发者3. 探索替代方案4. 对市场变化保持敏感5. 提高游戏质量 结论 &#x1f389; 如何看待Unity新的收费模式&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1…

R语言柱状图直方图 histogram

柱状图简介 柱状图也叫直方图&#xff0c;是展示连续性数值的分布状况。在x轴上将连续型数值分为一定数量的组&#xff0c;y轴显示对应值的频数。 R基本的柱状图 hist 我们用R自带的Orange数据来画图。 > head(Orange)Tree age circumference(圆周长) 1 1 118 …