找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

300

积分

0

好友

40

主题
发表于 6 天前 | 查看: 13| 回复: 0

在Kubernetes集群中,Service和Pod之间是一种关键的解耦访问关系。Service的核心作用是为动态变化的Pod集合提供一个稳定的访问入口,并实现负载均衡

核心关系:解耦的访问模型

1. Service是网络抽象层
  • Pod 是Kubernetes中最小的部署与调度单元,每个Pod都拥有独立的IP地址(Pod IP)。然而,Pod的生命周期是短暂的,其IP地址会随着Pod的重启、重建或迁移而动态变化
  • Service 则是一个稳定的网络抽象。它拥有一个固定不变的虚拟IP(ClusterIP)和DNS名称,充当了一组功能相同Pod的统一代理
2. 通过标签选择器(Label Selector)关联

Service通过定义 selector 来匹配Pod上附着的标签(Labels),从而动态地发现并关联后端Pod。

Service定义示例

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector: # 标签选择器
    app: myapp  # 选择所有包含 `app: myapp` 标签的Pod
  ports:
    - port: 80        # Service对外暴露的端口
      targetPort: 9376 # 转发到Pod容器内的端口

Pod标签定义示例

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp  # 此标签使Pod被上面的Service选中
spec:
  containers:
    - name: myapp
      image: myapp:1.0
3. 内置负载均衡

Service会自动将接收到的客户端请求流量,均匀地分发到所有匹配到的后端Pod上。

客户端请求 → Service (ClusterIP: 10.96.1.1)
                        ↓ (负载均衡)
        +---------+---------+---------+
        ↓         ↓         ↓         ↓
      Pod A     Pod B     Pod C     Pod D

关键特性对比

特性 Pod Service
IP地址 动态变化(Pod IP) 固定不变(ClusterIP)
生命周期 短暂,随应用更新而重建 长期稳定,独立于Pod存在
网络标识 通常仅在集群内部可访问 可通过多种类型暴露(ClusterIP/NodePort/LoadBalancer)
DNS名称 无独立的稳定DNS记录 拥有固定DNS格式:<service-name>.<namespace>.svc.cluster.local
扩展性 水平扩展会产生多个副本Pod 自动发现并关联所有匹配的副本Pod

实际工作流程

  1. 创建Pod:为Pod定义明确的标签,例如 app: frontend
  2. 创建Service:定义Service,并通过 selector 指定需要匹配的Pod标签。
  3. Service Controller
    • 持续监控集群中Pod的变化。
    • 动态维护一个名为 Endpoint 的对象,其中保存了所有匹配Pod的IP地址列表。
    • 通知每个节点上的 kube-proxy 组件更新网络规则(如 iptables 或 ipvs)。
  4. 流量转发
    • 当客户端访问Service的IP或DNS时,请求会被节点的 kube-proxy 拦截。
    • kube-proxy 根据负载均衡策略,将请求转发到 Endpoint 列表中某个真实的Pod。

这个过程是Kubernetes 云原生 架构中服务发现的核心,也是实现运维/DevOps自动化与高可用的基础。

访问方式示例

# 1. 集群内部通过DNS访问(最常用)
curl http://my-service.default.svc.cluster.local

# 2. 通过NodePort在集群外访问(节点端口映射)
# 访问集群中任意节点的IP和指定的NodePort
curl http://<任意Node-IP>:30080

# 3. 通过LoadBalancer访问(云平台)
# 访问云服务商自动提供的外部负载均衡器IP
curl http://<云厂商LB-IP>

特殊Service类型

  • Headless Service:通过设置 clusterIP: None 来创建。DNS查询将直接返回所有后端Pod的IP地址列表,而非Service的虚拟IP,常用于有状态应用如数据库主从集群。
  • ExternalName Service:将Service映射到一个外部域名(例如 my.database.example.com),用于将集群内访问导向外部服务。
  • 无Selector的Service:用户可以手动创建和维护对应的 Endpoint 对象,从而将Service与集群外部的服务端点关联起来。

总结

Pod是容器工作负载的实际运行载体,而Service是访问这些工作负载的稳定网络抽象层。这种设计实现了至关重要的解耦,带来了以下核心优势:

  • 对动态性的屏蔽:Pod可以自由地扩缩容、滚动更新或故障迁移,客户端无需感知后端实例的具体变化。
  • 内置服务发现与负载均衡:自动发现健康Pod并提供流量分发。
  • 部署与访问的解耦:应用部署(Pod)和网络访问策略(Service)可以独立管理和配置。
  • 提供稳定的服务标识:通过固定的DNS名称,为微服务之间提供了可靠的调用地址。



上一篇:Python数据库全解析:10个纯Python实现方案从入门到实战
下一篇:Spring Boot实战:规范设计与实现RESTful API用户模块CRUD接口
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 18:57 , Processed in 0.274561 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表