k8s中的service解析

news2025/3/22 0:51:49

k8s中的service解析

在k8s中,我们可以通过pod来创建服务。

然而,当我们创建多个 Pod 来提供同一项服务时,直接通过 Pod IP 进行访问会变得复杂且不可维护。因此,Kubernetes 提供了 Service 这一抽象概念,用于对外暴露和管理 Pod 组,使得外部可以通过 Service 访问应用,而无需记住和维护多个 Pod 的 IP。

在 Kubernetes 中,Service 是一种逻辑抽象,专门用于定义一组 Pod 的访问策略,例如 负载均衡服务发现。它本身并不涉及 Pod 的调度,也不会占用任何节点资源。Service 的 IP 是 集群内部的虚拟 IP,由 Kubernetes 控制平面自动分配和管理。

值得注意的是,Service 不运行任何代码,它只是一个规则集合,指示集群如何将流量正确路由到后端 Pod。

在创建 Service 时,可以通过 selector 字段指定一组标签(例如 app: my-app)。Kubernetes 会自动关联所有匹配这些标签的 Pod,并将其纳入该 Service 的管理范围。

Kubernetes 内部的 Endpoints Controller 会持续监控 Pod 的状态,并动态更新 Service 的后端目标。当某个 Pod 被调度到节点上(由调度器决定)且其标签匹配 Service 的 selector 时,该 Pod 的 IP 和端口会自动加入到 Service 的 Endpoints 列表中。

此外,每个节点上的 kube-proxy 组件会监听 Service 和 Endpoints 的变化,并相应地更新本地的 iptablesIPVS 规则。当请求到达 ClusterIP(即 Service 的虚拟 IP)时,流量会根据这些规则被分发到实际运行的 Pod,确保服务能够正确访问。

为什么要用到service

在 Kubernetes 中,Service 是一种核心资源对象,专门用于将一组 Pod 上运行的应用程序公开为网络服务的抽象方式。

当我们使用 Deployment、DaemonSet 或 StatefulSet 等控制器部署 Pod 时,可以为这些 Pod 创建一个 Service。Service 负责监控这些控制器管理的 Pod,无论是新增还是移除 Pod,Service 都会自动更新其后端目标,并提供稳定的网络访问入口。此外,Service 通过 Label Selector 机制,动态管理与其匹配的 Pod,确保流量能够正确转发。

举个例子,假设我们有一组 Web 服务 Pod,如果由于 自动扩缩容 或 Pod 重新调度,导致 Pod 的 IP 地址或端口发生变化,客户端将很难直接跟踪和访问这些 Web 服务。又比如,Web 服务和 MySQL 数据库分别部署在不同的 Pod 中,Web 应用如何准确查找并连接 MySQL 的 IP 地址?

Service 可以完美解决这个问题。 Kubernetes Service 定义了一种通常称为 微服务 的抽象,提供了一种稳定的访问方式,无论 Pod 规模如何变化,Service 都能确保访问路径的一致性。当 Web 服务访问后端数据库时,不需要关心 MySQL Pod 具体运行在哪个节点,也无需跟踪其 IP 地址的变化,因为 Service 通过抽象封装了 Pod 之间的关联,解耦了服务的依赖关系,提高了可维护性和可靠性。

Service 的定义和创建

  1. 首先,我们需要创建一个 Deployment 对象,该 Deployment 将管理 3 个 nginx Pod 实例:
    kubectl create deployment nginx --image=nginx:latest --replicas=3

  2. 接着,我们为这些 Pod 创建一个 Service,用于对外提供稳定的访问入口:
    kubectl expose deployment nginx --type=ClusterIP --port=6666 --target-port=80

    需要注意的是,Pod 和 Deployment 并不是一一对应的关系。Deployment 会监控所有标签(Labels)与其选择器(selector)中定义的标签相匹配的 Pod。

  3. 可以使用以下命令查看 Service 的详细信息:
    kubectl get service -o wide

    示例输出:

    root@master:~# kubectl get service -o wide
    NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                              
    nginx          ClusterIP   10.107.200.232   <none>        6666/TCP
    

    从上面的信息可以看到,Kubernetes 为 Service 随机分配了一个集群内部的 IP 地址(如 10.107.200.232),并将 Service 的 6666 端口 映射到 Pod 的 80 端口。

  4. 测试 Service
    我们可以使用 curl 命令测试该 Service 是否可用: curl 10.107.200.232:6666

    注意:

    • 该 IP 地址仅在 Kubernetes 集群内部 可用,因此只能在集群内部的机器上进行访问。
    • Service 会自动代理所有符合条件的 Pod,并动态感知 Pod 的变化,无论 Pod 的数量如何增减,Service 都能确保流量正确转发。
  5. 通过 YAML 定义 Service
    除了使用 kubectl expose 命令,我们还可以使用 YAML 文件来定义 Service。以下是一个 Service 的 YAML 配置示例:

    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    spec:
    selector:
    	app: MyApp
    ports:
    	- protocol: TCP
      	port: 6666
      	targetPort: 80
    type: ClusterIP
    

    在此 YAML 配置中:

    • selector 字段定义了 Service 需要管理的 Pod(即 app=MyApp 的 Pod)。
    • port 定义了 Service 对外暴露的端口(6666)。
    • targetPort 指定了 Pod 内部实际监听的端口(80)。
    • type 设为 ClusterIP,表示 Service 仅在集群内部可访问。

service服务提供

clusterIP类型的Service 的访问和路由机制

访问方式

在上一部分中,我们通过 ClusterIP 创建了 Service。ClusterIP 是 Kubernetes 集群内部的虚拟 IP,仅在集群内部可见(可供 Pod、节点及 Kubernetes 组件访问)。

无论 Pod 运行在哪个节点,集群内的任何组件(如其他 Pod、节点上的进程)都可以通过 ClusterIP:Port 访问该 Service。这种机制使得应用无需关注 Pod 的具体调度位置,只需通过 Service 访问,即可透明地连接到后端 Pod。

然而,ClusterIP 仅适用于集群内部通信,不会绑定到节点的公网 IP,因此外部请求无法直接访问。

路由路径

在使用 ClusterIP 时,集群内部的请求访问路径如下:

  1. 发起请求的客户端(如另一个 Pod)向 ClusterIP:Port 发送请求。

  2. kube-proxy 通过 ​iptables/IPVS 规则,将请求转发到后端 Pod 的 IP 和端口。

  3. 负载均衡方式默认采用 轮询(Round Robin),无论 Pod 分布在哪个节点,请求都会均匀地分发给所有可用的 Pod。

那么,我们如何将service向外部暴漏呢?

Kubernetes 提供了 ServiceType 选项,允许用户控制 Service 的暴露方式,从而使外部流量能够访问集群内部的服务。不同的 ServiceType 适用于不同的外部访问需求。

四种 Service 类型 :

  • ClusterIP(默认)
    通过集群内部 IP 暴露服务,ClusterIP 是 ServiceType 的默认值。

  • NodePort
    通过集群每个节点的 Node IP + 静态端口(NodePort) 对外暴露,允许外部流量访问。

  • LoadBalancer
    通过云平台提供的负载均衡器向外暴露服务,通常用于生产环境。

  • ExternalName
    通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。

ClusterIP、NodePort、LoadBalancer 三者是有关系的,前者是后者的基础。创建一个 NodePort 类型的 Service,必定带有一个 ClusterIP。

NodePort类型的Service 的访问和路由机制

访问方式

当使用 NodePort 类型创建 Service 时,Kubernetes 会在每个节点上分配一个静态端口(通常在 30000-32767 范围内),并将该端口映射到 Service。此时,外部用户可以通过 节点 IP + NodePort 访问该服务,而无需直接与 Pod 交互。

  • 可以在本机节点通过 127.0.0.1:NodePort 访问 Service。
  • 也可以使用 任意集群节点的公网 IP + NodePort 访问 Service,即使 Pod 运行在不同的节点上,Kubernetes 仍能确保流量正确转发。
路由机制
  1. 外部请求到达 节点IP:NodePort(如 203.0.113.1:30080)。

  2. kube-proxy 通过 ​iptables/IPVS 规则,将请求转发到后端 Pod 的 IP 和端口。

  3. ​跨节点转发:如果 Pod 不在当前节点,请求会通过集群网络(如 CNI 插件)转发到目标 Pod 所在节点。

关键特性

​负载均衡:无论请求到达哪个节点的 NodePort,流量会被均匀分发到所有 Pod(包括其他节点的 Pod)。

​高可用性:即使某个节点宕机,其他节点的 NodePort 仍可响应请求。

LoadBalancer类型的Service 的访问和路由机制

访问方式

在通过 NodePort 将服务暴露到外部时,虽然 Pod 之间已经实现了负载均衡,但节点本身并未具备负载均衡能力。此外,外部用户需要知道节点的 公网 IP 才能访问 Service,而节点 IP 可能较多,不利于统一管理。

为了解决这些问题,Kubernetes 提供了 LoadBalancer 类型的 Service,它依赖于 云服务商提供的负载均衡器,为 Service 绑定一个 外部 IP(公网 IP),使外部用户能够直接通过该 IP 访问服务。

路由机制

请求流程如下:

  1. 外部用户访问 LoadBalancer 分配的公网 IP(如 35.233.49.12:80)。

  2. 负载均衡器会将流量分发至 集群节点的 NodePort(如 NodeIP:30080)。

  3. kube-proxy 根据 iptables/IPVS 规则,将流量转发至后端 Pod。

  4. 若目标 Pod 并不在当前节点,流量将通过集群网络转发到目标节点。

特点
  • 自动分配公网 IP:需要云服务商(如 AWS、GCP、Azure)支持,Kubernetes 会自动申请和管理负载均衡器的外部 IP。

  • 更优的负载均衡:流量先由 外部负载均衡器 进行全局均衡,然后进入集群内部的 NodePort 和 Pod 级负载均衡。

  • 简化外部访问:外部用户无需感知集群节点 IP,直接通过 LoadBalancer 分配的 公网 IP 访问服务。

注意:LoadBalancer 类型需要集群运行在支持云平台负载均衡器的环境中(如 AWS ELB、GCP Cloud Load Balancing)。在本地或开发环境中,可通过 MetalLB 或 kubectl port-forward 临时暴露服务。

Endpoints

在 Kubernetes 中,Service 通过 Endpoints 动态绑定 后端实际的服务地址,无论这些地址是 集群内的 Pod,还是 集群外的服务。

通常,当我们为 Deployment 等资源创建 Service 时,Kubernetes 会 自动 生成对应的 Endpoints,并将匹配 selector 的 Pod 绑定到该 Service。

然而,如果 Service 未定义 selector,Kubernetes 不会自动创建 Endpoints,此时需要 手动定义 Endpoints,以便将外部服务的 IP 和端口 绑定到 Service,从而让集群内部可以透明地访问外部资源。

  1. 创建无 Selector 的 Service

    # 创建一个没有 selector 的 Service
    apiVersion: v1
    kind: Service
    metadata:
    name: external-mysql
    spec:
     ports:
    	- protocol: TCP
      	port: 3306   # Service 暴露的端口
      	targetPort: 3306  # 后端实际服务的端口(这里是 MySQL 的端口)
    
  2. 手动定义 Endpoints,指向外部 MySQL 实例

    apiVersion: v1
    kind: Endpoints
    metadata:
      name: external-mysql  # 必须与 Service 同名
    subsets:
      - addresses:
          - ip: 111.111.111.111  # 外部 MySQL 实例的 IP
          - ip: 222.222.222.222  # 另一个 MySQL 实例的 IP
        ports:
          - port: 3306  # 必须与 Service 的 targetPort 一致
    

运行机制

当 kube-proxy 监听到 Kubernetes API Server 发现 Endpoints 配置了外部 IP 时,它会自动更新本地的 iptables/IPVS 规则,以实现流量转发。整个请求流程如下:

  1. 应用向 external-mysql:3306(即 Service 的 ClusterIP)发起访问请求。

  2. kube-proxy 根据 iptables/IPVS 规则,将请求均衡地分发至 111.111.111.111:3306 或 222.222.222.222:3306。

  3. 请求通过 集群网络 转发至外部 MySQL 实例,完成数据交互。

这种方式允许 Kubernetes 无缝集成外部服务,使集群内的应用能够像访问本地服务一样访问外部资源,同时提供透明的负载均衡和服务发现能力。

参考痴者工良的博客

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

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

相关文章

案例:图书管理

掌握图书管理案例的实现&#xff0c;能够使用Spring Boot整合Thymeleaf完成图书管理案例。 1.任务需求 &#xff08;1&#xff09;项目使用Spring Boot整合Thymeleaf&#xff0c;项目展示的页面效果全部通过Thymeleaf的模板文件实现。 &#xff08;2&#xff09;查询所有图书。…

Docker和Dify学习笔记

文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…

【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计

欢迎来到Java集合框架系列的第一篇文章&#xff01;&#x1f339; 本系列文章将以通俗易懂的语言&#xff0c;结合实际开发经验&#xff0c;带您深入理解Java集合框架的设计智慧。&#x1f339; 若文章中有任何不准确或需要改进的地方&#xff0c;欢迎大家指出&#xff0c;让我…

线性代数(1)用 excel 计算鸡兔同笼

线性代数excel计算鸡兔同笼 案例&#xff1a;鸡兔同笼问题的三种解法&#xff08;递进式教学&#xff09;一、问题描述二、方程式解法&#xff08;基础版&#xff09;步骤解析 三、线性代数解法&#xff08;进阶版&#xff09;1. 方程组转化为矩阵形式2. 矩阵求解&#xff08;逆…

Grokking System Design 系统设计面试问题

《Grokking the System Design Interview》列举了多个经典的系统设计题目,通常按照 不同的业务场景和技术难点 进行分类。以下是一些常见的分类和题目示例: 1. 社交网络类 设计 Twitter(支持关注/取关、推文、Feed 流) 设计 Facebook Messenger(即时聊天,支持在线/离线状…

hubilder打包ios app, 并上传TestFlight

目录 一 前提条件 不是该项目成员解决 1. 直接找到该项目的管理人员去设置你的账号 2. 直接重新生成APPID(一般不建议的&#xff0c;可以查看) 3. 如果是离职人员&#xff0c;可以让他将项目权限转让出来 - 如何转让应用 - DCloud问答 未申请ios证书和描述文件 APP ID 的…

Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统

Java集成MQTT和Kafka实现高可用方案 1. 概述 在物联网(IoT)和分布式系统中,消息传递的可靠性和高可用性至关重要。本文将详细介绍如何使用Java集成MQTT和Kafka来构建一个高可用的消息处理系统。 MQTT(消息队列遥测传输)是一种轻量级的发布/订阅协议,适用于资源受限的设备和…

【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势

java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…

剑指 Offer II 107. 矩阵中的距离

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20107.%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E8%B7%9D%E7%A6%BB/README.md 剑指 Offer II 107. 矩阵中的距离 题目描述 给定一个由 0 和 1 组成的矩阵 mat …

雅可比行列式

定义和推导 雅可比行列式&#xff0c;它是以n个n元函数的偏导数为元素的行列式。以下是雅可比式的推导过程&#xff1a; 二阶雅可比式的推导以二重积分中的极坐标变换为例&#xff0c;设 &#xff1a; &#xff0c;则 x 和 y 的全微分分别为&#xff1a; 可以将 dx 与 dy 视作…

【大模型基础_毛玉仁】3.2 上下文学习

目录 3.2 上下文学习3.2.1 上下文学习的定义3.2.2 演示示例选择1&#xff09;直接检索2&#xff09;聚类检索3&#xff09;迭代检索 3.2.3 性能影响因素 3.2 上下文学习 随模型训练数据规模和参数量的扩大&#xff0c;大语言模型涌现出了上下文学习&#xff08;In-Context Lea…

Oraclelinux问题-/var/log/pcp/pmlogger/目录超大

有套19c rac环境&#xff0c;操作系统是oracle linux 8.10&#xff0c;日常巡检时发现/var/log/pcp/pmlogger/目录超大&#xff0c;如下 [rootdb1 ~]# du -sh /var/log/pcp/pmlogger/* 468G /var/log/pcp/pmlogger/db 1.3G /var/log/pcp/pmlogger/oracle06-106 754M /…

【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证

背景&#xff1a; vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现&#xff1a; rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

Microsoft Edge浏览器的取证分析(基于Chromium)

概述 早在2019年&#xff0c;微软就用Chromium替换了EdgeHTML浏览器引擎&#xff0c;这是微软支持谷歌Chrome浏览器的一个开源项目。通过切换到Chromium&#xff0c;Edge与Chrome浏览器共享一个共同的架构&#xff0c;这意味着用于Chrome浏览器调查的取证技术也适用于Edge。 …

汽车一键启动系统使用方便,舒适出行,轻松匹配

汽车一键启动系统 系统定义 移动管家汽车一键启动系统是装置在智能汽车上的一部分&#xff0c;是实现简约打火和熄火过程的一个按钮装置。它可以在原车钥匙锁头的位置改装&#xff0c;也能独立面板改装&#xff0c;现在很多高低配置的车辆都可安装。 功能特点 基本功能 启…

C语言复习笔记--数组

今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始. 数组的概念 数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组. 下面从一维数组说起. 一维数组的创建和…

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…

腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践

项目背景与发展历程 在金融科技快速发展的今天&#xff0c;股票分析作为投资决策的核心环节&#xff0c;正面临数据量激增和复杂性提升的挑战。传统股票分析依赖人工处理&#xff0c;效率低下且成本高昂&#xff0c;而人工智能&#xff08;AI&#xff09;的引入为这一领域带来…

【工具】C#防沉迷进程监控工具使用手册

一、软件简介 本工具用于监控指定进程的运行时长&#xff0c;当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒&#xff0c;帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…