K8s学习笔记:03-Service网络
对应章节:第三章 Service 网络 / 3.1~3.7
日期:2026年7月13日
Pod 的网络困境与 Service 的诞生
问题:Pod 的 IP 是”临时”的
第二章你见过:删一个 Pod,Deployment 立刻补一个新的。但新 Pod 的 IP 和旧的不一样。
1 | |
扩缩容更是如此:3 个 Pod 有 3 个不同 IP,缩到 1 个又只剩 1 个。Pod IP 是牛,不是宠物——随时会变。
真实困境
| 场景 | 直接用 Pod IP 的问题 |
|---|---|
| 前端要连后端 | 后端 Pod 一重建,IP 变了,前端连不上 |
| 3 个后端副本 | 前端该连哪个 IP?怎么负载均衡? |
| 扩缩容 | Pod 数量一变,IP 列表全乱 |
Service 出场
Service 给一组 Pod 提供一个固定不变的虚拟 IP(ClusterIP)和 DNS 名字,并自动把流量负载均衡到后面的 Pod。
1 | |
类比 Docker:
| Docker | K8s |
|---|---|
docker run -p 8080:80(端口映射) |
Service(NodePort) |
| Nginx 反向代理 + upstream 列表 | Service 自动维护后端 Pod 列表 |
关键认知:你访问 Service,Service 帮你转发到某个健康的 Pod。Pod 怎么变,Service 的 IP 和名字都不变。
Service 靠 label 关联 Pod(核心机制)
Service 不关心 Pod 的 IP,它靠 label selector(标签选择器) 动态找 Pod。
1 | |
- Pod 有 labels(标签,键值对,如
app=nginx) - Service 有 selector(选择器,如
app=nginx) - selector 匹配上哪些 Pod,流量就转发给哪些——动态的,新起的 Pod 只要标签对,自动加入
背后有个对象叫 Endpoints(或 EndpointSlice),实时记录”当前匹配到的 Pod IP 列表”:
1 | |
这就是为什么 Pod IP 变了不要紧——Endpoints 会自动跟着更新,Service 的入口始终不变。
三种 Service 类型
| 类型 | 作用范围 | 谁能访问 | 典型用途 |
|---|---|---|---|
| ClusterIP(默认) | 集群内部 | 只有集群内的其他 Pod | 后端服务、数据库,内部互调 |
| NodePort | 集群外 | 通过 节点IP:端口 从外部访问 |
开发测试、临时对外暴露 |
| LoadBalancer | 集群外 | 云厂商给一个公网 IP | 生产环境对外服务(需云平台/MetalLB) |
层层递进的关系:
1 | |
记忆法:ClusterIP 对内,NodePort 对外(土办法),LoadBalancer 对外(云上正规办法)。
ClusterIP:集群内部稳定入口(默认类型)
创建
先确保有一个 Deployment(第二章那个),然后 expose 出一个 Service:
1 | |
--port=80:Service 自己监听的端口--target-port=80:转发到 Pod 容器的端口
验证 selector 关联
1 | |
对比 kubectl get pods -o wide 的 IP,Endpoints 里应该正好是这些 Pod 的 IP。
集群内访问测试
ClusterIP 只能在集群内部访问。起一个临时 Pod 从内部 curl:
1 | |
试着多 wget 几次,如果后端有多个 Pod,请求会被分发到不同 Pod(负载均衡)。
NodePort:把服务暴露到集群外
ClusterIP 集群外访问不了。要从虚拟机外部(物理机浏览器)访问,用 NodePort。
1 | |
80:31234 的含义:
1 | |
NodePort 端口范围默认 30000-32767,不指定会随机分配。
Kind 环境的坑(重要)
Kind 的”节点”是 Docker 容器,NodePort 端口默认不会自动映射到宿主机。有两种解决办法,我们实操时再详细走:
- 办法 A:建集群时在
kind-config.yaml里配extraPortMappings把节点端口映射出来(需重建集群) - 办法 B:临时用
kubectl port-forward svc/my-nginx-np 8080:80 --address 0.0.0.0转发(简单,适合测试)
这与第一章坑 4(port-forward 只绑 127.0.0.1)一脉相承——Kind 的网络模型和真实集群有差异,NodePort 在真机上直接就能用,在 Kind 里要多一步。
DNS 服务发现
集群内的 Service 都有 DNS 名字,Pod 之间靠名字互相找,不用记 IP。
1 | |
这是微服务互调的基础:前端配置里写 http://backend-svc,K8s 的 DNS(CoreDNS)自动解析到对应 Service 的 ClusterIP,再转发到后端 Pod。代码里写服务名,不写 IP——这是 K8s 服务发现的精髓。
1 | |
章节练习
练习 1:ClusterIP + 关联验证
1 | |
练习 2:集群内访问 + 负载均衡
1 | |
练习 3:NodePort 对外暴露
1 | |
练习 4:DNS 服务发现
1 | |
自检清单
- 能说清为什么不能直接用 Pod IP(IP 会变)
- 理解 Service 靠 label selector 动态关联 Pod
- 知道 Endpoints 是”当前匹配的 Pod IP 列表”,自动更新
- 分得清 ClusterIP / NodePort / LoadBalancer 三种类型的用途
- 能 expose 出 ClusterIP 并在集群内用 DNS 名字访问
- 能建 NodePort 并从集群外访问(Kind 里知道要多一步)
- 理解 DNS 服务发现:代码里写服务名不写 IP
本章核心认知回顾
1 | |