当前位置: 首页 > news >正文

8. kubernetes的service原理

Kubernetes 的 Service 是集群内部和外部访问 Pod 的核心抽象层,解决了 Pod 动态 IP 变化及负载均衡问题。以下是其核心概念、原理及使用方法:


一、Service 的核心概念

概念说明
服务发现通过标签选择器(selector)动态关联一组 Pod,提供稳定的访问入口(虚拟 IP + DNS 名称)。
负载均衡自动将流量分发到后端 Pod(支持轮询等策略)。
抽象网络端点屏蔽 Pod 的动态变化(如扩缩容、重启导致的 IP 变化)。
暴露服务类型支持 ClusterIP(集群内访问)、NodePort(节点端口)、LoadBalancer(云厂商负载均衡器)、ExternalName(外部服务别名)等类型。

二、Service 的工作原理

  1. 核心组件协作
    • kube-proxy:运行在每个节点上的网络代理,负责维护 Service 的虚拟 IP(VIP)到后端 Pod IP 的映射规则(通过 iptables 或 IPVS 实现)。

    • Endpoint Controller:监控 Pod 变化,更新 Service 对应的 Endpoints 对象(记录当前健康 Pod 的 IP 和端口)。

    • CoreDNS:为 Service 提供 DNS 解析(如 my-svc.my-namespace.svc.cluster.local)。

  2. 流量转发流程
    • 当请求到达 Service 的虚拟 IP(如 ClusterIP)时,kube-proxy 根据规则将流量转发到后端 Pod。

    • 具体实现方式:

    ◦ iptables 模式:通过 iptables 规则匹配目标 IP 和端口,随机选择后端 Pod。

    ◦ IPVS 模式:基于内核级负载均衡(支持更多算法如轮询、加权轮询等)。

  3. 服务发现机制
    • DNS 发现:每个 Service 在 CoreDNS 中自动注册 DNS 记录,格式为 <service-name>.<namespace>.svc.cluster.local

    • 环境变量注入:Pod 启动时会将 Service 的 IP 和端口注入环境变量(如 MY_SVC_SERVICE_HOST)。


三、Service 的典型使用场景

  1. 集群内部服务通信
    • 通过 ClusterIP 类型服务实现微服务间的内部调用。

  2. 对外暴露服务
    • 使用 NodePortLoadBalancer 类型服务暴露应用给外部用户。

  3. 无头服务(Headless Service)
    • 设置 clusterIP: None,直接返回 Pod IP(适用于 StatefulSet 或需要直接访问 Pod 的场景)。

  4. 代理外部服务
    • 使用 ExternalName 类型服务将请求转发到集群外部的服务(如数据库)。


四、Service 的配置示例
1. ClusterIP 类型(默认)

apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: ClusterIP    # 默认类型,可省略selector:app: my-app      # 关联 Pod 的标签ports:- protocol: TCPport: 80       # Service 的端口targetPort: 80 # Pod 的端口

2. NodePort 类型(通过节点端口暴露服务)

apiVersion: v1
kind: Service
metadata:name: my-nodeport-service
spec:type: NodePortselector:app: my-appports:- port: 80targetPort: 80nodePort: 30007  # 可选,范围 30000-32767

3. LoadBalancer 类型(云厂商负载均衡器)

apiVersion: v1
kind: Service
metadata:name: my-lb-service
spec:type: LoadBalancerselector:app: my-appports:- port: 80targetPort: 80

4. Headless Service(无头服务)

apiVersion: v1
kind: Service
metadata:name: my-headless-service
spec:clusterIP: None    # 关键配置selector:app: my-appports:- protocol: TCPport: 80targetPort: 80

五、Service 的常用操作

操作命令
查看 Service 列表kubectl get services
查看 Service 详情kubectl describe service my-service
查看 Endpoints(后端 Pod)kubectl get endpoints my-service
端口转发(临时访问)kubectl port-forward service/my-service 8080:80
删除 Servicekubectl delete service my-service

六、Service 与 Ingress 的区别

特性ServiceIngress
作用层级L4(TCP/UDP)L7(HTTP/HTTPS)
功能负载均衡、服务发现路由规则、TLS 终止、域名基于路径转发
依赖对象直接关联 Pod依赖 Ingress Controller(如 Nginx)
外部访问通过 NodePort/LoadBalancer通过 Ingress Controller 暴露

七、总结
• Service 是 Kubernetes 网络模型的核心,提供稳定的访问入口和负载均衡。

• 关键能力:

• 服务发现(DNS 或环境变量)。

• 负载均衡(支持多种后端选择策略)。

• 屏蔽 Pod 动态变化。

• 选择服务类型:

• 内部通信用 ClusterIP

• 外部访问用 NodePortLoadBalancer

• 直接访问 Pod 用 Headless Service

• 最佳实践:结合 Deployment 管理 Pod,通过 Service 暴露服务,再通过 Ingress 管理外部访问。

http://www.xdnf.cn/news/101989.html

相关文章:

  • MySQL 8 自动安装脚本(CentOS-7 系统)
  • 【哈希表】1399. 统计最大组的数目
  • 从零开始搭建Django博客③--前端界面实现
  • 如何批量为多张图片(JPG、PNG、BMP、WEBP 等格式)添加自定义水印保护
  • ApacheJmeter使用权威指南
  • 【AI】Trae的MCP配置及使用测试
  • 在统信UOS/麒麟Kylin OS操作系统中配置APT和GIT代理
  • 【论文阅读25】-滑坡时间预测-PFTF
  • 时分复用、频分复用和码分复用简要比较分析
  • Linux进程调度
  • AI PPT创作原理解析:让你的演示文稿更智能
  • Python内置函数---breakpoint()
  • 《算法笔记》10.4小节——图算法专题->最短路径 问题 D: 最短路径
  • JavaScript 中改变 this 指向的方法
  • Python 绘图代码解析:用 Turtle 和 Colorsys 打造绚丽图案
  • sde启动报错:Unable to initialize sockets for listening(-102).
  • 基于STM32_HAL库的HC-08蓝牙插座项目
  • C++:多态
  • UnoCSS原子CSS引擎-前端福音
  • 深入解析大数据的Lambda架构:设计、特点与应用场景
  • HTTP代理基础:网络新手的入门指南
  • 从 pip install lanms 失败到解决:Python开发环境配置深度解析
  • FlinkUDF用户自定义函数深度剖析
  • DC-2寻找Flag1、2、3、4、5,wpscan爆破、git提权
  • 2025知识管理趋势解析:AI、协作与用户体验引领变革
  • Ubuntu使用war包部署Jenkins并通过systemcl管理
  • 电池大脑的基准测试及AI拓展
  • 制作一款打飞机游戏18:敌人子弹
  • 量子金融工程:蒙特卡洛算法误差压缩至0.3%
  • 【刷题Day24】I/O模型(浅)