1. 为什么需要Service?
当你在Kubernetes集群部署了一组Nginx容器后,会发现这些Pod的IP地址飘忽不定:Pod重启会换IP、水平扩展会产生新IP、滚动更新还会批量更换IP。这时候Service就像个智能管家,为动态变化的Pod提供稳定的访问入口。
举个生活化的例子:Service相当于五星级酒店的前台,无论后台服务员(Pod)如何轮班调岗,客人只要记住总台电话(Service地址)就能获得稳定服务。
2. Service工作原理速览
每个Service通过Label Selector绑定一组Pod,持续监控Pod变化并生成稳定的虚拟IP。它的核心工作流程就像个高效的邮局系统:
- 用户访问Service虚拟IP
- kube-proxy组件实时更新iptables/IPVS规则
- 流量经过负载均衡转发到实际Pod (此处通过类比生活场景解释技术原理)
3. ClusterIP类型深度解析
3.1 基础配置示例
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
type: ClusterIP
selector:
app: user-backend # 绑定携带该标签的Pod
ports:
- protocol: TCP
port: 80 # 服务暴露端口
targetPort: 8080 # 容器实际监听端口
3.2 高级流量控制
apiVersion: v1
kind: Service
metadata:
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" # 允许未就绪端点
spec:
externalTrafficPolicy: Local # 保留客户端源IP
ipFamilyPolicy: RequireDualStack # 双栈IPv4/IPv6支持
典型场景:微服务内部通信、数据库访问中间件、监控采集端连接
避坑指南:
- 避免在7000+节点集群使用ClusterIP,需考虑kube-proxy性能
- 跨命名空间访问需要完整域名:service-name.namespace.svc.cluster.local
- 启用会话保持需设置sessionAffinity: ClientIP
4. NodePort型实战演练
4.1 基础端口映射
apiVersion: v1
kind: Service
metadata:
name: web-nodeport
spec:
type: NodePort
selector:
app: web-frontend
ports:
- port: 80
targetPort: 80
nodePort: 31000 # 手动指定端口(默认范围30000-32767)
4.2 多协议支持配置
ports:
- name: http
protocol: TCP
port: 80
nodePort: 31080
- name: https
protocol: TCP
port: 443
nodePort: 31443
性能实测数据(基于100节点集群):
- 500QPS时延时增加1.2ms
- 直接Pod访问 vs NodePort转发损耗对比
- 大规模部署建议配合外部负载均衡器
5. LoadBalancer集成云服务
5.1 AWS ELB集成示例
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-internal: "true" # 内部LB
spec:
loadBalancerSourceRanges:
- 203.0.113.0/24 # IP白名单
externalTrafficPolicy: Local
5.2 多云配置技巧:
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-health-probe-interval: "15"
# GCP配置示例
annotations:
networking.gke.io/load-balancer-type: "Internal"
费用陷阱提示:
- 意外暴露公网LB导致安全风险
- 闲置LB未删除产生持续计费
- 跨可用区流量费用累积
6. 进阶模式拆解
6.1 Headless Service直连
spec:
clusterIP: None # 无虚拟IP
ports:
- name: dns
port: 53
protocol: UDP
适用场景:StatefulSet有状态服务、DNS服务器集群、自定义服务发现
6.2 服务拓扑感知路由
metadata:
annotations:
service.kubernetes.io/topology-aware-hints: "auto"
spec:
topologyKeys: ["kubernetes.io/hostname"]
该配置实现:优先将请求路由到相同节点的Pod,降低跨节点跳转
7. 关联技术扩展
7.1 Ingress智能路由 通过Nginx Ingress实现七层负载:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20" # 灰度流量比例
spec:
rules:
- http:
paths:
- path: /user
pathType: Prefix
backend:
service:
name: user-service-v2
port:
number: 80
7.2 Service与Helm集成 生产环境推荐使用Helm管理服务配置:
# values.yaml片段
service:
type: LoadBalancer
annotations:
cloud-provider/special-config: "enable"
ports:
- name: web
port: 80
targetPort: 8080
8. 技术选型决策树
通过三维评估模型选择Service类型:
- 网络层级需求(L4/L7)
- 流量来源(内部/外部)
- 云提供商支持能力 (此处可插入决策流程图文字描述)
9. 安全加固方案
9.1 网络策略防护
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
spec:
podSelector:
matchLabels:
app: db-service
ingress:
- from:
- podSelector:
matchLabels:
app: api-service
ports:
- protocol: TCP
port: 3306
9.2 审计日志采集 启用kube-apiserver审计功能:
--audit-log-path=/var/log/kubernetes/audit.log
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
10. 常见故障排查
10.1 服务不通四步法:
- 查Endpoint是否正常(kubectl get endpoints)
- 验kube-proxy规则是否生成
- 抓包分析流量路径
- 查云平台安全组配置
10.2 经典报错处理:
- "no endpoints available"故障树分析
- "port already allocated"解决方案
- 跨集群服务发现失败原因追溯
评论