Skip to content

Service、Ingress 与网络访问

这篇笔记聚焦 Kubernetes 里最容易让人“对象都认识,但访问路径讲不清”的一条主线:

  1. Pod 为什么不能直接作为稳定入口
  2. Service 到底解决什么问题
  3. Ingress 在入口流量里扮演什么角色
  4. 集群内部和外部访问路径有什么区别

1. 为什么 Pod 不能直接作为服务入口

因为 Pod 本身是动态变化的。

它可能会:

  1. 被重建
  2. 被重新调度到别的节点
  3. 获得新的 IP

所以如果别的服务或者外部客户端直接依赖某个 Pod IP,系统会非常脆弱。

这就是 Service 存在的原因。


2. Service 到底是什么

Service 可以理解成 为一组满足标签选择条件的 Pod 提供稳定访问入口的一层抽象

它解决的是:

  1. Pod IP 不稳定
  2. 调用方不应该感知底层实例变化
  3. 一组副本需要统一被访问

把分工拉开看:Pod 负责跑服务,Service 负责把一组会变动的 Pod 包装成一个相对稳定的服务地址。


3. 标签和选择器为什么很重要

label 是对象上的标记。
selector 是按标签去选对象的规则。

Service 之所以能把请求导向某一组 Pod,本质上就是因为它会按 selector 找到对应 Pod。

例如:

yaml
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  selector:
    app: demo-app
  ports:
    - port: 80
      targetPort: 8080

这份配置表达的是:

  1. 找到所有带有 app: demo-app 标签的 Pod
  2. 对外暴露 Service 端口 80
  3. 最终转发到 Pod 的 8080

4. Service 常见类型怎么理解

4.1 ClusterIP

ClusterIP 是最常见的默认类型。

它可以理解成 只在集群内部可访问的稳定服务地址

它适合:

  1. 微服务之间互相调用
  2. 集群内部服务发现

4.2 NodePort

NodePort 可以理解成 在每个节点上打开一个端口,把外部请求转发到集群内部服务

它适合:

  1. 测试环境
  2. 比较简单的对外暴露场景

但它通常不是生产环境最优雅的入口方式。

4.3 LoadBalancer

LoadBalancer 可以理解成 由云平台或底层基础设施提供一个外部负载均衡入口,再把流量接入到 Service

它常见于云环境中。


5. Ingress 又是什么

Ingress 可以理解成 把集群外部的 HTTP/HTTPS 请求按域名、路径等规则路由到内部 Service 的入口规则

它解决的是:

  1. 一个集群里有多个服务需要统一接入
  2. 不同域名、不同路径应该去不同服务
  3. HTTPS 证书和入口规则希望统一管理

这里要注意:

Ingress 本身更像规则定义,真正执行这些规则,通常还需要 Ingress Controller


6. Ingress Controller 是什么

Ingress Controller 可以理解成 负责监听 Ingress 规则,并真正把流量按规则转发出去的入口控制器

常见实现会基于:

  1. Nginx
  2. 云厂商网关
  3. 其他入口控制器方案

所以如果只创建了 Ingress 规则,却没有对应 Controller,这些规则通常不会真正生效。


7. 一个典型的访问链路长什么样

可以用一条常见路径理解:用户 -> 域名 -> Ingress Controller -> Service -> Pod

这条链路里每一层的职责分别是:

  1. Ingress:定义入口路由规则
  2. Service:稳定暴露一组 Pod
  3. Pod:真正处理业务请求

8. DNS 和服务发现怎么理解

Kubernetes 通常会为 Service 提供集群内部 DNS 名称。

这意味着:

  1. 调用方不需要记具体 Pod IP
  2. 更倾向于按服务名访问
  3. 底层实例变动时,调用方式仍然保持稳定

例如一个服务常见会通过类似下面的名字被访问:demo-service.default.svc.cluster.local

这里可以不用死记全名,关键是理解:Kubernetes 会把服务访问从“找实例 IP”提升成“找服务名字”。


9. 网络访问里最常见的几个误区

9.1 误区一:Pod 能访问,就说明服务入口设计对了

不一定。

Pod 直连通常只能说明实例活着,不代表服务发现和稳定入口设计合理。

9.2 误区二:有 Ingress 就不需要 Service

通常不是这样。

Ingress 更常是把外部流量导入内部,而 Service 负责内部稳定服务抽象,这两层职责不同。

9.3 误区三:NodePort 就等于生产级入口方案

NodePort 能用,但很多生产场景会更倾向于结合 Ingress 或外部负载均衡来做统一入口。


10. 一句话总结

Service、Ingress 与网络访问这条主线,本质上是在解决:

动态变化的 Pod 如何对内形成稳定服务,对外形成统一入口,以及集群里的流量到底应该按什么路径流转。

基于 VitePress 构建的个人技术笔记。