一、Kubernetes Service 的核心作用
Service 是 Kubernetes 中实现服务发现与负载均衡的核心资源,它为一组后端 Pod 提供一个稳定的访问入口(ClusterIP/NodePort/LoadBalancer),让前端客户端无需关心后端 Pod 的 IP 变化,就能稳定访问服务。
二、两种主流代理模式对比
表格
| 代理模式 | 实现方式 | 负载均衡策略 | 性能特点 | 适用场景 |
|---|---|---|---|---|
| iptables 模式 | 基于 Linux netfilter,在节点上配置 iptables 规则 | 默认随机选择后端 Pod | 系统开销低,流量在内核空间处理 | 小规模集群、对性能要求不高的场景 |
| IPVS 模式 | 基于 netfilter 钩子,使用哈希表作为数据结构,在内核空间工作 | 支持更多负载均衡算法(如轮询、最小连接等) | 延迟更低、规则同步性能更好、吞吐量更高 | 大规模集群、高并发服务场景 |
三、实操步骤拆解(基于图片中的示例)
1. 准备后端 Deployment
创建一个包含 3 个 Nginx Pod 的 Deployment,作为服务的后端:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-servicetest
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行创建:
kubectl create -f deployment-service.yml
2. 创建 NodePort 类型的 Service
通过 kubectl expose 命令为 Deployment 创建一个 NodePort 服务,将容器端口 80 映射到节点端口 9000:
kubectl expose deployment nginx-deployment-servicetest \
--port=9000 --name=myservice --target-port=80 --type=NodePort
3. 验证服务与端点
查看 Service 和对应的 Endpoints(后端 Pod 列表):
kubectl get service,endpoints
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15d
service/myservice NodePort 10.110.19.123 <none> 9000:32420/TCP 7s
NAME ENDPOINTS AGE
endpoints/kubernetes 192.168.30.130:6443 15d
endpoints/myservice 172.16.245.19:80,172.16.245.20:80,172.16.93.216:80 7s
可以看到,myservice 的 Endpoints 自动关联了 3 个 Nginx Pod 的 IP 和端口。
4. 访问服务
通过节点 IP + NodePort(32420)访问服务:
curl http://192.168.30.130:32420
返回 Nginx 默认页面,说明服务访问正常。
5. 清理资源
kubectl delete service myservice
四、关键概念补充
- ClusterIP:仅在集群内部可访问的虚拟 IP,是 Service 的默认类型。
- NodePort :在每个节点上开放一个端口,外部可通过
节点IP:NodePort访问服务。 - Endpoints:由 Service 的 selector 自动生成,包含所有匹配标签的后端 Pod 的 IP 和端口。
- kube-proxy:运行在每个节点上的代理,负责维护 Service 的代理规则(iptables/IPVS),实现流量转发。
9000:32420/TCP 是 NodePort 类型 Service 的端口映射关系,我们可以把它拆成三部分来理解:
1. 各部分含义
- 9000 :Service 在集群内部的端口(
port)- 这是 Service 自身暴露的端口,集群内的其他 Pod 或服务可以通过
Service ClusterIP:9000来访问这个服务。
- 这是 Service 自身暴露的端口,集群内的其他 Pod 或服务可以通过
- 32420 :节点上的端口(
nodePort)- 这是 Kubernetes 自动分配的节点端口(范围默认是 30000-32767),外部客户端可以通过
任意节点IP:32420访问到这个服务。
- 这是 Kubernetes 自动分配的节点端口(范围默认是 30000-32767),外部客户端可以通过
- /TCP :协议类型
- 表示这个端口映射使用的是 TCP 协议(也可以是 UDP)。
2. 完整的访问链路
外部请求 → 节点 IP:32420 → Service ClusterIP:9000 → 后端 Pod IP:80(容器端口)
在你的示例中:
- 节点 IP 是
192.168.30.130 - 所以访问地址是
http://192.168.30.130:32420 - 流量会被转发到 Service 的 9000 端口,再转发到后端 Nginx Pod 的 80 端口。
3. 为什么需要两层端口?
- 集群内访问 :用
ClusterIP:9000,高效且安全,只在集群内部可见。 - 外部访问 :用
节点IP:32420,让外部流量可以进入集群,再由 Service 转发到后端。
4. 对应命令参数
这个映射关系来自你之前的 kubectl expose 命令:
kubectl expose deployment nginx-deployment-servicetest \
--port=9000 --target-port=80 --type=NodePort
--port=9000定义了 Service 内部端口 9000--target-port=80定义了转发到 Pod 的 80 端口--type=NodePort触发了自动分配节点端口 32420
