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,你可以灵活地控制服务的内部和外部访问方式。

相关推荐
nuo5342021 小时前
基础 6 —— Docker 容器数据卷
docker·容器
Sinclair2 小时前
安企CMS的安装-Docker 部署
运维·docker·容器
汪汪大队u3 小时前
【无标题】
运维·docker·kubernetes·prometheus
慧一居士7 小时前
KubePi 功能和使用场景全面介绍
容器
BaiduPHP7 小时前
docker异常断电,出现docker服务,启动失败
docker·容器·eureka
ai_coder_ai8 小时前
编写自动化脚本,在自己后端服务中使用云原生Baas服务进行编码和解码相关操作
数据库·云原生·自动化
云烟成雨TD8 小时前
Kubernetes 系列【20】服务:EndpointSlice 端点分片
云原生·容器·kubernetes
寒冰碧海10 小时前
大模型部署从0到1(三):单机多卡 vLLM 部署Qwen3.6实战|Docker Compose 一键启动
docker·容器·vllm
潘正翔21 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发