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

相关推荐
returnthem17 小时前
Docker 整体架构(C/S 模式)
docker·容器·架构
爱学习的程序媛17 小时前
Docker常用指令速查手册
运维·docker·容器
ai_coder_ai17 小时前
如何在自动化脚本中使用云原生功能(FaaS和BaaS)?
云原生·autojs·自动化脚本·冰狐智能辅助·easyclick
Benszen18 小时前
K8S存储管理:Volume、PV/PVC与StorageClass详解
容器·rpc·kubernetes
在荒野的梦想18 小时前
Docker + K8s 部署若依微服务 | 从 0 到 1 实战指南(Dockerfile + Harbor + Helm)
docker·微服务·kubernetes
fengyehongWorld18 小时前
kubernetes Argo简介
云原生·容器·kubernetes
键盘鼓手苏苏1 天前
Kubernetes与GitOps最佳实践
云原生·kubernetes·k8
Y3ai1 天前
Windows 11 Docker Desktop 保姆级安装使用教程
windows·docker·容器
星辰徐哥1 天前
大模型工程化部署:Docker Compose批量部署
运维·docker·容器
biubiubiu07061 天前
Docker 快速通关
docker·容器·eureka