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

相关推荐
sbjdhjd3 小时前
RHCE | Web 服务器与 Nginx 全栈详解
linux·nginx·http·云原生·oracle·架构·web
我爱学习好爱好爱3 小时前
Kubernetes 1.29集群上部署Java网站项目
java·容器·kubernetes
执笔为剑3 小时前
1.2、docker环境部署
运维·docker·容器
qhqh3105 小时前
K8S的PV、PVC和storageClass的相关概念及实验
云原生·容器·kubernetes
中国IT6 小时前
第3章:Docker与传统虚拟化比较
运维·docker·容器
luom01027 小时前
使用 Docker 部署 RabbitMQ 的详细指南
docker·容器·rabbitmq
阿望要努力上研究生8 小时前
Docker入门常用指令和Docker概念
运维·docker·容器
战南诚8 小时前
docker的使用技巧
运维·docker·容器
無限神樂9 小时前
docker,docker compose,k8s之间的区别
docker·容器·kubernetes