其他 Pod --DNS--> backend(Service,稳定虚拟 IP 10.96.x.x)
│
kube-proxy 的转发规则(iptables/IPVS)
│
负载到 Endpoints 列表(当前 Ready 的 Pod IP:端口)
│
┌────────────┼────────────┐
Pod A Pod B Pod C (app=backend 且 Ready)
type
作用域
典型场景
ClusterIP
仅集群内
服务互访(默认),backend/redis/mysql
NodePort
节点 IP:30000-32767
本地演示、临时外部访问
LoadBalancer
云厂商负载均衡器
云上把服务暴露到公网/内网
ExternalName
DNS CNAME
引用集群外地址(如托管 MySQL)
跟着做
步骤 1:确认有带标签的 Deployment
沿用上一课的 backend(2 副本 nginx 占位):
kubectl get deploy backend
kubectl get pods -l app=backend --show-labels
DNS 解析失败(nslookup 不出名字):确认调用方与 Service 同命名空间或用了 FQDN;查 CoreDNS 是否正常:kubectl get pods -n kube-system -l k8s-app=kube-dns。
面试常问
Service 有哪几种类型?分别什么场景?
ClusterIP(默认):集群内互访,虚拟 IP + DNS;NodePort:在每个节点开 30000-32767 端口映射到 Service,适合测试暴露;LoadBalancer:在云厂商创建外部负载均衡器指向 NodePort,是生产暴露的基座;ExternalName:返回 DNS CNAME,用于引用集群外服务。生产实践通常是 LoadBalancer 承载 Ingress Controller,再由 Ingress 按域名/路径分发。
ClusterIP 的实现原理?
用户创建 Service 时 API Server 分配虚拟 IP 并写入 etcd;kube-proxy 监听变化,在每个节点生成 iptables(或 IPVS)规则,把发往虚拟 IP 的流量按概率 DNAT 到 Endpoints 里的健康 Pod。特点:虚拟 IP 不绑定任何网卡、不需要进程监听、天然具备负载均衡与容错(Pod 挂掉被摘出 Endpoints 即不再命中)。IPVS 模式适合大规模集群,规则查找更高效并支持更多调度算法。
Endpoints 是什么时候更新的?
EndpointSlice(新版本拆分对象)由 EndpointSlice 控制器维护:selector 匹配的 Pod 且 readiness 通过才会进入;Pod 创建、删除、Ready 状态翻转都会实时增删条目。所以「Service 通不通」的第一手证据永远是 kubectl get endpoints——它直接反映「当前有哪些可用后端」。
自测三问
Service 的「稳定」到底稳定的是什么?不保证什么?
Endpoints 为空时,你的排查顺序是什么?
本站 platform 容器内访问 backend,URL 的主机名应该写什么?
小结一句话
Service 用标签选中「当前 Ready 的 Pod」,提供稳定 DNS 与负载均衡,让应用彻底告别 Pod IP——下一课把配置和密钥从镜像里拆出去,交给 ConfigMap 与 Secret。