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

相关推荐
闲云自留地8 小时前
告别敲命令!DockerUI 与 Portainer 可视化容器管理实战
docker·容器
wdfk_prog8 小时前
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环
运维·缓存·docker·容器·ros
程序猿阿越9 小时前
containerd如何创建Pod
后端·kubernetes·源码阅读
安易算力12 小时前
昇腾生态开发深度实践:CANN算子库架构解析与MindSpore模型优化
网络·容器·架构·kubernetes·vllm
闲云自留地12 小时前
不用 docker!containerd 镜像 crctl 命令一把梭
容器
周先生FullStack13 小时前
Mac + 容器本地 MySQL/Redis 环境搭建与网络原理实战
java·spring boot·微服务·容器·架构·个人开发
Dovis(誓平步青云)14 小时前
突破 32 位瓶颈:64 位 XID 如何化解事务号回卷危机
运维·服务器·人工智能·docker·容器
宋均浩14 小时前
告警规则 243 砍到 27:Prometheus 降噪实战,日均打扰 47 次 → 3 次
云原生·监控·devops
闲云自留地15 小时前
nerdctl 实战全解:替代 docker 的 containerd 客户端,镜像 / 容器 / 网络 / 存储 / Namespace 一把抓
容器
运维老郭15 小时前
别再让 Liveness Probe 背锅了:initialDelaySeconds 和 failureThreshold 的坑,一次讲透
云原生