K8s Service

在 Kubernetes 中,Service 是一种抽象,用于定义一组逻辑上相关的 Pod 的访问策略,并为它们提供一个稳定的网络入口。由于 Pod 是动态创建和销毁的,其 IP 地址会变化,Service 解决了这个问题,让客户端能够通过固定的地址访问后端 Pod。


1. 为什么需要 Service?

  • Pod 的不稳定性:Pod 可能因故障、更新、扩缩容等原因被重建,每次重建 IP 地址都会改变。直接使用 Pod IP 会导致客户端无法可靠访问。
  • 服务发现:客户端需要知道后端 Pod 的地址,Service 提供了一种发现机制(通过环境变量或 DNS)。
  • 负载均衡:当多个 Pod 副本提供相同服务时,Service 可以将流量分发到各个 Pod,实现负载均衡。
  • 稳定的访问入口:Service 拥有自己的虚拟 IP(ClusterIP)和 DNS 名称,不会随 Pod 变化而变化。

2. Service 的核心功能

  • 稳定的 IP 和端口:每个 Service 被分配一个虚拟 IP(ClusterIP),客户端通过该 IP 和端口访问服务。
  • 内置负载均衡 :Service 自动将请求轮询转发到后端的多个 Pod 上(默认基于 iptablesIPVS)。
  • 服务发现 :Kubernetes 支持两种服务发现方式:
    • 环境变量:Pod 创建时,集群会在其环境中注入当前命名空间下所有 Service 的 IP 和端口信息。
    • DNS :集群 DNS(如 CoreDNS)为 Service 创建内部域名,格式为 <service-name>.<namespace>.svc.cluster.local,Pod 可直接通过域名访问。

3. Service 的类型

Kubernetes Service 有四种主要类型,适用于不同场景:

类型 描述 访问范围
ClusterIP(默认) 在集群内部暴露 Service,分配一个虚拟 IP,仅集群内可访问。 集群内部
NodePort 在每个节点的固定端口上暴露 Service,通过 NodeIP:NodePort 从集群外部访问。 集群外部(节点网络)
LoadBalancer 在 NodePort 基础上,自动创建一个云负载均衡器(如 AWS ELB、阿里云 SLB),将流量引入集群。 集群外部(通过云厂商 LB)
ExternalName 将 Service 映射到外部的 DNS 名称,不创建代理,而是返回 CNAME 记录。 集群内外(通过 DNS)

4. Service 的工作原理

Service 通过 标签选择器(selector) 确定后端 Pod 集合。例如,一个 Service 可能选择所有带有 app: myapp 标签的 Pod。

当 Service 创建后,Kubernetes 控制平面会创建对应的 Endpoint 对象 (或 EndpointSlice),记录所有匹配 Pod 的 IP 和端口。集群中每个节点上运行的 kube-proxy 组件负责监听 API Server 中 Service 和 Endpoint 的变化,并动态更新节点上的网络规则(如 iptables、IPVS),将发往 Service IP 的流量转发到后端 Pod。


5. 一个简单的 Service 示例

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp          # 选择带有 app=myapp 标签的 Pod
  ports:
    - protocol: TCP
      port: 80           # Service 的端口
      targetPort: 8080   # Pod 上容器监听的端口
  type: ClusterIP        # 默认类型,可省略

创建后,集群内其他 Pod 可以通过 my-service.default.svc.cluster.local 或 ClusterIP 访问该服务,流量会被轮询转发到后端的 Pod 上。


6. 特殊情况:Headless Service

如果设置 spec.clusterIP: None,则创建一个 Headless Service。它不分配 ClusterIP,也不执行负载均衡,而是直接返回后端 Pod 的 IP 列表。通常用于需要自己控制负载均衡的场景(如 StatefulSet 的有状态应用)或配合 Service Mesh。


7. Service 与 Ingress 的关系

  • Service 主要提供四层(TCP/UDP)负载均衡和访问入口。
  • Ingress 是七层(HTTP/HTTPS)的入口控制器,可以将外部流量路由到不同的 Service,并提供域名、TLS 终结等高级功能。Ingress 通常需要配合 Service 使用。

总结

Kubernetes Service 是连接客户端与后端 Pod 的关键抽象,它提供了稳定的网络端点、服务发现和负载均衡能力,使得微服务架构中的动态 Pod 管理成为可能。通过不同类型的 Service,你可以灵活地控制服务的内部和外部访问方式。

相关推荐
2601_962218471 分钟前
万象生鲜系统跨仓调拨算法助力生鲜企业供应链数字化协同运营
大数据·运维·微服务·云原生·架构
智购科技无人售货机工厂13 分钟前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
2601_962218471 小时前
万象生鲜系统多仓协同同步技术支撑生鲜企业多仓模式数字化转型
大数据·运维·微服务·云原生·架构
2601_962218611 小时前
万象生鲜系统大数据采购预测算法降低库存积压稳居第一
分布式·微服务·云原生·架构
Larru-Sun1 小时前
从零开始用 Docker 部署 Node.js 后端服务
docker·容器·node.js
Henry-SAP2 小时前
SAP MRP类型与计划策略配置精髓解析
人工智能·云原生·sap·erp
深念Y3 小时前
视频平台架构重构:从微服务到可插拔基础设施
后端·微服务·云原生·架构·rabbitmq·音视频·rocketmq
凤山老林3 小时前
Spring Boot 3.x 集成 Spring Cloud Kubernetes:原生服务发现、配置注入与优雅下线
spring boot·spring cloud·kubernetes
深念Y4 小时前
06-移动端三技术栈优劣对比-理论推演
服务器·云原生·架构·音视频·短视频
mister_guo4 小时前
Docker、Docker Compose 与 Kubernetes:分别解决什么问题?
docker·容器·kubernetes