Service 服务发现与负载均衡
理解 Service 的作用与四种类型
掌握 ClusterIP、NodePort、LoadBalancer 的使用
理解服务发现的原理
核心讲解
Pod 是临时的,IP 会变,Service 提供固定的访问入口,自动负载均衡到后端 Pod。
(1)核心作用
固定访问入口,Pod 变化不影响访问
内部服务发现,通过服务名就能访问
负载均衡,自动分发流量到后端多个 Pod
解耦访问和后端 Pod
(2)四种类型
表格
类型 | 作用 | 适用场景 |
|---|---|---|
ClusterIP | 集群内部 IP,只能集群内访问 | 内部服务调用,默认类型 |
NodePort | 每个节点开一个端口,外部可以通过节点 IP + 端口访问 | 测试、临时外部访问 |
LoadBalancer | 绑定云厂商负载均衡器,公网 IP 访问 | 生产环境公网入口,需要云厂商支持 |
ExternalName | 别名,指向外部域名 | 内部访问外部服务 |
(3)工作原理
Service 通过标签选择器匹配后端 Pod,自动维护端点列表。
kube-proxy 在每个节点维护转发规则
访问 Service IP 自动转发到后端 Pod
轮询负载均衡
操作示例
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80 # 服务端口
targetPort: 80 # 容器端口
protocol: TCP
# 创建服务
kubectl apply -f service.yaml
# 查看服务
kubectl get svc
# 查看后端端点
kubectl get endpoints nginx-svc
# 集群内访问测试
kubectl run test --image=busybox --rm -it -- wget -O - http://nginx-svc
# ===== NodePort 类型 =====
# 修改 type 为 NodePort
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 节点端口,30000-32767
# 浏览器访问 节点IP:30080 即可
常见误区
Service 转发是七层:默认是四层 TCP/UDP 转发,不是七层,不识别路径
selector 匹配不上:selector 和 Pod 的 label 对不上,endpoints 就是空的,服务不通
NodePort 可以随便选端口:默认范围 30000-32767,超出范围会报错
服务名不能解析:同命名空间直接用服务名,跨命名空间要用
服务名.命名空间.svc.cluster.local
课后练习
给之前的 nginx 部署创建 ClusterIP 服务
验证集群内部可以通过服务名访问
修改为 NodePort 类型,用浏览器访问测试
说明 Service 和 Deployment 的关系是什么?
