1. Kubernetes Service 基础概念解析
在Kubernetes集群中,Service是连接应用组件的关键网络抽象层。我刚开始接触Kubernetes时,最困惑的就是Pod动态创建销毁后如何保持稳定的网络访问。直到理解了Service的工作原理,才真正掌握了Kubernetes服务暴露的精髓。
Service本质上是一个四层(TCP/UDP)负载均衡器,它通过标签选择器(Label Selector)动态关联一组Pod,并为这些Pod提供稳定的虚拟IP(ClusterIP)和DNS名称。当Pod因扩缩容或故障重建时,Service会自动更新端点列表,确保流量始终被路由到健康的Pod实例。
重要提示:Service的稳定性来源于其与Pod的解耦设计。即使所有Pod全部更换,只要标签匹配规则不变,Service的访问入口就保持不变。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Service YAML 结构深度拆解
2.1 核心字段解析
一个标准的Service YAML包含以下关键字段:
yaml复制apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: ClusterIP
- selector:通过标签选择要代理的Pod,本例中会路由到所有包含
app: my-app标签的Pod - ports:定义端口映射关系
port:Service暴露的端口targetPort:Pod实际监听的端口(可省略,默认与port相同)
- type:决定Service的暴露方式(ClusterIP/NodePort/LoadBalancer)
2.2 端口配置的三种典型场景
-
单端口映射(最常见):
yaml复制ports: - port: 80 targetPort: 8080 -
多端口服务(如同时暴露HTTP和HTTPS):
yaml复制ports: - name: http port: 80 targetPort: 8080 - name: https port: 443 targetPort: 8443 -
端口重命名(增强可读性):
yaml复制ports: - name: web protocol: TCP port: 80 targetPort: web
避坑指南:当Pod使用命名端口时(如
containerPort: name: web),务必确保YAML中的targetPort与容器定义完全一致,包括大小写。
3. Service 类型详解与选型建议
3.1 ClusterIP:默认的内部服务
yaml复制spec:
type: ClusterIP
clusterIP: 10.96.0.1 # 可指定或自动分配
特点:
- 仅在集群内部可访问
- 自动分配虚拟IP(可通过
kubectl get svc查看) - 配套DNS解析格式:
<service-name>.<namespace>.svc.cluster.local
适用场景:
- 微服务间的内部通信
- 前端应用访问后端API
3.2 NodePort:直接节点暴露
yaml复制spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 可选,范围默认30000-32767
特点:
- 在每个Node上开放静态端口(NodePort)
- 外部可通过
<NodeIP>:<NodePort>访问 - 同时仍保留ClusterIP功能
注意事项:
- 生产环境建议配合负载均衡器使用
- 避免直接暴露敏感服务
- 端口冲突是常见问题(建议不指定nodePort让系统自动分配)
3.3 LoadBalancer:云厂商集成
yaml复制spec:
type: LoadBalancer
loadBalancerIP: "1.2.3.4" # 部分云平台支持指定IP
特点:
- 自动创建云负载均衡器(AWS ELB、GCP LB等)
- 外部流量直接到达Service
- 会产生云服务费用
最佳实践:
- 结合Ingress使用,避免为每个服务创建LB
- 检查云厂商的Annotations支持(如会话保持配置)
3.4 ExternalName:CNAME别名
yaml复制spec:
type:
