别再只会 ClusterIP!搞懂 Kubernetes Service 的正确打开方式

184 阅读4分钟

引言

很多人用 Kubernetes 部署服务时,只知道创建 Deployment 和 Pod,却忽略了网络访问这一核心问题。Pod 的 IP 不稳定,随时可能变动,如果直接访问,会导致服务间通讯断开,系统宕机。而这时候,Kubernetes 的 Service 机制就派上用场了。

本文带你全面理解 Kubernetes 中 Service 的类型、原理和最佳实践,从根本上搞懂它的作用,不再一知半解!


一、为什么需要 Service?

在 Kubernetes 中,Pod 是应用的运行单元,但 Pod 有两个特点:

  1. IP 是动态分配的:Pod 重启后 IP 会改变;
  2. 生命周期短:被调度器随时替换、扩缩容频繁。

如果其他服务直接访问 Pod IP,就可能在某次变更中出现 404 或连接失败。

这时候,就需要一个中间层,来屏蔽 Pod 的变化,提供统一、稳定的访问入口。Service 正是为此设计的。


二、什么是 Kubernetes Service?

Service 是对一组 Pod 的抽象,它为这些 Pod 提供一个固定的访问入口,并实现负载均衡。

简单来说,它具备三大能力:

  • 服务发现:自动找到后端 Pod;
  • 负载均衡:分发请求到多个副本;
  • 故障转移:后端 Pod 挂了会自动剔除。

三、Service 的核心组件

创建一个 Service,通常包括以下关键字段:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
  • selector:指定匹配的 Pod;
  • port:Service 暴露的端口;
  • targetPort:Pod 内部监听的端口;
  • type:决定 Service 的访问方式(见下节)。

四、Service 类型全解析

Kubernetes 提供了 4 种 Service 类型,各有不同用途:

1. ClusterIP(默认)

  • 提供集群内部访问;
  • 外部不能访问,只能用于服务间调用。

📌 典型场景:后端服务、数据库、内部 API。

spec:
  type: ClusterIP

2. NodePort

  • 每个 Node 都暴露一个端口(30000~32767);
  • 可以通过 NodeIP:NodePort 访问服务;
  • 容易被公网访问,安全性需注意。

📌 适用于测试环境或临时访问。

spec:
  type: NodePort

3. LoadBalancer

  • 自动申请云厂商的负载均衡器;
  • 分发请求到 NodePort;
  • 一键实现公网访问,适用于生产环境。

📌 典型场景:线上 Web 服务、移动 App 后端。

spec:
  type: LoadBalancer

4. ExternalName

  • 不绑定 Pod,而是将服务名映射到外部 DNS;
  • 用于访问集群外部的服务。

📌 适用于集群内访问外部数据库、第三方接口等。

spec:
  type: ExternalName
  externalName: db.example.com

五、Service 与 DNS:服务发现的核心

K8s 集成了 CoreDNS 插件,每个 Service 都自动分配一个 DNS 域名:

<service-name>.<namespace>.svc.cluster.local

比如:my-service.default.svc.cluster.local

微服务之间只需要知道对方的 Service 名即可调用,真正实现“动态发现 + 解耦通信”。


六、Service 背后的 kube-proxy 是如何工作的?

Service 的网络魔法是通过 kube-proxy 实现的。kube-proxy 有三种工作模式:

模式描述
userspace旧版本机制,用 userspace 代理转发请求
iptables通过 iptables 规则实现流量重定向(主流)
IPVS基于 Linux IPVS 模块,性能更优(推荐)

举个例子:

当用户访问 ClusterIP:Port,kube-proxy 会通过 iptables 转发请求到对应的 Pod,Pod 则返回响应。这个过程对用户是透明的,极大简化了通信流程。


七、最佳实践推荐

内部服务通信:优先使用 ClusterIP,安全又高效。
公网访问需求:结合 Ingress + LoadBalancer,具备高扩展性。
生产环境:考虑开启 IPVS 模式提升性能。
测试环境快速访问:可以临时用 NodePort
跨集群调用:使用 ExternalName 或引入 Service Mesh。


八、常见误区

🚫 误区1:所有 Service 都能被外部访问
✅ 正解:只有 NodePort/LoadBalancer 类型可以。

🚫 误区2:Pod 访问 Service 会影响性能
✅ 正解:内部通信很高效,iptables/IPVS 性能已足够。

🚫 误区3:Service 只能访问 Deployment 创建的 Pod
✅ 正解:只要 Pod 带有匹配的 Label,谁创建的不重要!


结语

Kubernetes 的 Service 并不是简单的端口转发工具,而是构建微服务架构不可或缺的核心组件。从负载均衡到服务发现,再到与 DNS 的完美集成,它让集群内部的网络通信稳定而灵活。

学会正确使用 Service,才能真正发挥 Kubernetes 的威力!


📬 关注我:David爱编程

坚持原创技术内容,让你在修行中成长,在成长中突破。 欢迎留言交流、点赞分享,一起进阶架构师之路!