【k8s、docker】Headless Service(无头服务)

文章目录

  • 问题背景
  • 1、什么是Headless Service
    • 1.2 为什么 Zookeeper 使用 Headless Service?
    • 1.2 Headless Service 的 DNS 行为
    • 1.3 验证示例
    • 1.4 如何创建 Headless Service?
  • 2. zk-0.zookeeper.default.svc.cluster.local 域名是如何创建出来的? 是无头服务自动映射的吗

问题背景

zookeeper ClusterIP None 这中svc作用是什么,为什么没有cluster ip

1、什么是Headless Service

在 Kubernetes 中,ClusterIP 类型的 Service 被设置为 None(即 ClusterIP: None)时,表示这是一个 Headless Service(无头服务)。这种设计有特定的用途和行为模式:
Headless Service 的核心作用:

  1. 直接访问 Pod IP,跳过 Service 代理

    • 普通 Service:会分配一个虚拟 ClusterIP,流量通过 kube-proxy 负载均衡到后端 Pod。

    • Headless Service:没有 ClusterIP,DNS 查询直接返回所有后端 Pod 的 IP 地址(而非 Service 的虚拟 IP)。

  2. 适用场景

  • 有状态应用(如 Zookeeper、Kafka、MongoDB):需要直接访问特定 Pod(如通过 Pod 域名)。

  • 自定义服务发现:应用需要自行处理负载均衡或直接连接 Pod。

  • StatefulSet 配套使用:StatefulSet 的 Pod 具有稳定的域名(如 pod-name.svc-name.namespace.svc.cluster.local)。

1.2 为什么 Zookeeper 使用 Headless Service?

简单来说,当一个pod 是sts类型,每个副本的名称,都是固定的(固定名称是前提,不像deployment生成的pod都会带随机字符串 ),如 zk-0、zk-1,此时需要无头服务,被访问时,都是指定访问,不能直接负载均衡随机调度。

Zookeeper 是一个有状态分布式协调服务,它的典型配置需求:

支持应用层的负载均衡或服务发现:

  • 客户端应用(或应用内置的逻辑)可以获取到所有后端 Pod 的 IP 列表,然后自己决定如何连接(例如,轮询、根据角色选择 leader 等)。
  • 对于像 ZooKeeper 这样的集群,成员之间需要互相知道彼此的地址来形成集群,Headless Service 提供了完美的解决方案。

支持直接的 Pod-to-Pod 通信:

  • 当你需要直接连接到某个特定的 Pod 实例时(比如访问主节点进行写操作,或进行健康检查),可以通过其唯一的 DNS 名称直接访问。:StatefulSet + Headless Service 能为每个 Pod 提供固定域名

1.2 Headless Service 的 DNS 行为

对于 Service zookeeper:

  • 普通查询(非 Headless):

    nslookup zookeeper.mano-2.svc.cluster.local
    

    返回一个虚拟 ClusterIP。

  • Headless 查询:

    nslookup zookeeper.mano-2.svc.cluster.local
    

    返回所有后端 Pod 的 IP 地址(例如):

    Name:   zookeeper.mano-2.svc.cluster.local
    Address: 10.244.1.10  # zk-0 的 IP
    Address: 10.244.2.20  # zk-1 的 IP
    Address: 10.244.3.30  # zk-2 的 IP
    

如果您的 ZooKeeper StatefulSet 有 3 个副本,名为 zk-0, zk-1, zk-2,那么 DNS 会解析:

  • zookeeper.default.svc.cluster.local -> 返回 zk-0, zk-1, zk-2 的 IP 地址列表(A 记录)。
  • zk-0.zookeeper.default.svc.cluster.local -> 返回 zk-0 Pod 的 IP 地址。
  • zk-1.zookeeper.default.svc.cluster.local -> 返回 zk-1 Pod 的 IP 地址。
  • zk-2.zookeeper.default.svc.cluster.local -> 返回 zk-2 Pod 的 IP 地址。

1.3 验证示例

1、查看 Service 定义

kubectl get svc zookeeper -o yaml
输出关键字段:

spec:clusterIP: None  # 明确标记为 Headlessports:- port: 2181targetPort: 2181selector:app: zookeeper

2、通过 DNS 直接访问 Pod
每个 StatefulSet 的 Pod 会获得独立域名:

# 查询单个 Pod 的 DNS
nslookup zk-0.zookeeper.mano-2.svc.cluster.local# 客户端连接示例(Zookeeper 客户端)
zkCli.sh -server zk-0.zookeeper:2181,zk-1.zookeeper:2181,zk-2.zookeeper:2181

与普通 Service 的对比:

特性Headless Service普通 Service
ClusterIPNone自动分配虚拟 IP (如 10.96.x.x)
DNS 解析结果返回所有 Pod IP返回 Service 的 ClusterIP
负载均衡由客户端或应用层实现由 kube-proxy 实现(iptables/IPVS)
典型应用场景有状态服务(如 Zookeeper、MySQL)无状态服务(如 Nginx、微服务)

1.4 如何创建 Headless Service?

Headless 示例:

apiVersion: v1
kind: Service
metadata:name: zookeepernamespace: default
spec:clusterIP: None # 这是关键,指定为 Noneports:- port: 2181name: client- port: 2888name: server- port: 3888name: leader-electionselector:app: zookeeper # 选择后端 Pod 的标签# 注意:Headless Service 通常不指定 type,默认就是 ClusterIP
  • clusterIP: None:这不是“不想要 IP”,而是明确地、主动地要求创建一个 Headless Service(无头服务)。它告诉 Kubernetes:“我不要你为这个服务分配一个虚拟的 ClusterIP,我要直接访问后端的 Pod”。
  • 自动分配 ClusterIP:这是 Kubernetes Service 的默认行为。你不需要做任何特殊配置来“开启”自动分配。

有头示例:

apiVersion: v1
kind: Service
metadata:name: my-web-service
spec:# 注意:这里完全不写 clusterIP 字段ports:- port: 80targetPort: 8080protocol: TCPname: httpselector:app: my-web-app# type: ClusterIP # type 字段也可以省略,默认就是 ClusterIP

当你创建这个 Service 时,Kubernetes 会:

  • 自动从集群的 Service IP 池(由 --service-cluster-ip-range 参数定义)中选择一个可用的 IP 地址。
  • 将这个 IP 地址分配给该 Service。
  • 你可以在 kubectl get svc 的输出中看到这个分配的 IP(不再是 None)。

2. zk-0.zookeeper.default.svc.cluster.local 域名是如何创建出来的? 是无头服务自动映射的吗

是的,zk-0.zookeeper.default.svc.cluster.local 这个域名是由 Kubernetes 的 Headless Service(无头服务)机制自动创建的,其核心原理依赖于 Kubernetes DNS 系统(如 CoreDNS)的自动服务发现功能。

下面简述其工作原理:

1、 前提条件:Headless Service + StatefulSet
这个域名的自动生成,通常发生在以下组合中:

  • 一个 Headless Service:clusterIP: None
  • 一个 StatefulSet:管理有状态应用的 Pod,如 zk-0, zk-1, zk-2

2、DNS 自动映射原理
当满足上述条件时,Kubernetes DNS 组件(如 CoreDNS)会根据以下规则自动为每个 Pod 生成稳定的 DNS 记录:

规则一:Pod 主机名 DNS 记录
对于每一个由 StatefulSet 创建的 Pod(如 zk-0),DNS 会生成一条 A 记录:

<pod-name>.<service-name>.<namespace>.svc.cluster.local  -->  <pod-ip>

在你的例子中:

pod-name = zk-0
service-name = zookeeper
namespace = default
cluster.local = 集群默认域名

在这里插入图片描述

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

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

相关文章

scikit-learn/sklearn学习|套索回归Lasso解读

【1】引言 前序学习进程中&#xff0c;对用scikit-learn表达线性回归进行了初步解读。 线性回归能够将因变量yyy表达成由自变量xxx、线性系数矩阵www和截距bbb组成的线性函数式&#xff1a; y∑i1nwi⋅xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n​wi​⋅xi​bwTxb实…

暴雨服务器:以定制化满足算力需求多样化

在数字经济与实体经济深度融合的浪潮下&#xff0c;互联网行业正经历着前所未有的技术变革。大数据分析、云计算服务、人工智能算法等技术的快速演进&#xff0c;推动着企业对于高性能计算基础设施的需求呈现指数级增长。据IDC数据显示&#xff0c;互联网行业已成为全球服务器采…

JavaScript字符串详解

创建字符串&#xff1a; 1.使用字面量(推荐)&#xff1a; 这是最常用、最直接的方式。你可以用单引号 ()、双引号 (") 或反引号 () 把文本包起来 let singleQuote 单引号; let doubleQuote "双引号"; let templateLiteral 反引号;2.使用String 构造函数&…

Kiro Preview 应用评测

Kiro应用评测 Kiro 是一个由亚马逊推出的 AI 驱动的智能开发环境&#xff0c;从原型到生产全程陪伴您的开发过程。它将"灵感编程"的流畅性与规范的清晰性相结合&#xff0c;帮助您更快地构建更好的软件。 昨天收到了Kiro的试用邮件&#xff0c;收到邮件后第一时间下载…

Flink2.0学习笔记:Flink服务器搭建与flink作业提交

一&#xff0c;下载flink:Downloads | Apache Flink,解压后放入IDE工作目录&#xff1a;我这里以1.17版本为例 可以看到&#xff0c;flink后期的版本中没有提供window启动脚本:start-cluster.bat 所以这里要通过windows自带的wsl 系统启动它 打开终端依次运行下列命令完成w…

MySQL锁的分类

MySQL锁可以按照多个维度进行分类&#xff0c;下面我用最清晰的方式为你梳理所有分类方式&#xff1a;一、按锁的粒度分类&#xff08;最常用分类&#xff09;锁类型作用范围特点适用引擎示例场景表级锁整张表开销小、加锁快&#xff0c;并发度低MyISAM, MEMORY数据迁移、全表统…

电脑上搭建HTTP服务器在局域网内其它客户端无法访问的解决方案

在电脑上开发一套HTTP服务器的程序在调试时&#xff0c;在本机内访问正常&#xff0c;但是在本机外访问就不正常&#xff0c;外部客户端无法访问或无法连接到本机的服务器的问题&#xff0c;这可能涉及网络配置、防火墙、端口转发或服务绑定等问题&#xff0c;在这里提供了解决…

双指针和codetop2(最短路问题BFS)

双指针和codetop21.双指针1.[复写0](https://leetcode.cn/problems/duplicate-zeros/)2.动态规划1.[珠宝的最高价值](https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/)2.[解码方法](https://leetcode.cn/problems/decode-ways/)3.[下降路径最小和](ht…

基于K邻近算法(KNN)的数据回归预测模型

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB代码实现了一个基于…

【123页PPT】化工行业数字化解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91654005 资料解读&#xff1a;【123页PPT】化工行业数字化解决方案 详细资料请看本解读文章的最后内容。化工行业作为国民经济的重要支柱之…

c++--文件头注释/doxygen

文件头注释 开源项目&#xff1a; /*** file robot_base.cpp* author Mr.Wu* date 2025-05-28* version 1.0.0* brief Robot basic drive to communicate with controller** copyright Copyright (c) 2025 google.** Licensed under the Apache License, Version 2.…

【教程】笔记本安装FnOS设置合盖息屏不休眠

重装FnOS好几次了&#xff0c;合盖后屏幕关闭但不休眠的问题每次都要网上找参差不齐的教程&#xff0c;麻烦死了&#xff0c;索性记录一下方便以后复制粘贴。 使用root登录 sudo -i修改系统配置文件编辑logind.conf文件&#xff1a; 打开终端&#xff0c;输入以下命令以编辑log…

深入解析 Monkey OCR:本地化、多语言文本识别的利器与实践指南

在信息爆炸的时代&#xff0c;从图片、扫描文档中高效提取结构化文本的需求日益迫切。OCR&#xff08;光学字符识别&#xff09;技术成为解决这一问题的核心工具。尽管市面上有 Abbyy FineReader、Adobe Acrobat 等商业巨头&#xff0c;以及 Tesseract、PaddleOCR 等开源方案&a…

动态规划法 - 53. 最大子数组和

什么是动态规划法&#xff1f; 简单说&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09; 是一种**「把复杂问题拆解成小问题&#xff0c;通过解决小问题来解决大问题」**的方法。 核心思路有两个&#xff1a; 1.拆分问题&#xff1a;把原问…

STM32CUBEMX配置stm32工程

1.新建工程2.选择芯片3.配置各种片上外设和时钟4.创建工程5.根据文件内容进行修改工程注意&#xff1a;最好根据工程规范来做&#xff0c;因为有时我们需要更改配置并重新生成&#xff0c;如果不按规范来会导致部分代码会被系统清除&#xff0c;在工程中中有很多成对的BEGIN和E…

Day07 缓存商品 购物车

缓存菜品问题说明用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。结果&#xff1a;系统响应慢&#xff0c;用户体验差实现思路通过 Redis 来缓存菜品数据&#xff0c;减少数据库查询操作。缓存逻辑分…

Jenkins(集群与流水线配置)

Jenkins&#xff08;集群与流水线配置&#xff09; Jenkins集群 集群化构建可以提升构建效率&#xff0c;也可以并发在多台机器上执行构建。 安装前提&#xff1a;内存至少512MB、Java 17 以上、Maven环境、Git环境 配置集群步骤 配置节点菜单新建节点查看节点配置状态 新建完节…

深入剖析ROS参数服务器通信机制 ——共享全局数据的“云端仓库”实现原理

​1. 核心概念&#xff1a;分布式数据共享容器​ ​定位​&#xff1a;ROS参数服务器&#xff08;Parameter Server&#xff09;是ROS架构中的全局共享存储系统&#xff0c;相当于机器人的“云端仓库”。 ​作用​&#xff1a; 存储多节点共享的静态配置参数&#xff08;如机器…

21.AlexNet

虽然LeNet在手写数字识别上取得了不错的结果&#xff0c;但是他在对于更大的数据集效果就十分有限。 一方面&#xff0c;对于更大尺寸的图像效果有限 另一方面&#xff0c;对于更多分类的任务效果有限 自LeNet后的十几年&#xff0c;计算机视觉领域步入寒冬&#xff0c;神经网络…

Shell脚本-条件判断相关参数

一、前言在 Shell 脚本编程中&#xff0c;条件判断 是实现流程控制的核心机制之一。无论是判断文件是否存在、字符串是否相等&#xff0c;还是数值大小比较&#xff0c;都离不开条件判断语句。本文将带你全面掌握 Shell 脚本中与条件判断相关的参数和语法&#xff0c;包括&…