当前位置: 首页 > news >正文

第六篇:《Service 与 Ingress:服务暴露与负载均衡》

Pod 的 IP 是动态的,不能直接作为稳定访问入口。Kubernetes 通过 Service 抽象为一组 Pod 提供固定的访问端点(IP/DNS),并实现负载均衡。而 Ingress 则提供七层路由(基于域名、路径),将外部流量路由到集群内的 Service。本文将详细讲解 Service 的四种类型(ClusterIP、NodePort、LoadBalancer、ExternalName)以及 Ingress 的工作原理和典型配置。

一、为什么需要 Service?
Pod 可能被重建,IP 变化。

多副本 Pod 需要负载均衡。

需要对内部服务发现提供稳定的 DNS 名称。

需要将外部流量引入集群。

Service 通过标签选择器匹配 Pod,并自动维护 Endpoints 列表(Pod IP + 端口)。

二、Service 的四种类型
2.1 ClusterIP(默认)
分配一个虚拟 IP(仅集群内部可访问)。

用于集群内部通信,例如后端服务调用数据库。

YAML 示例:

apiVersion:v1kind:Servicemetadata:name:nginx-svcspec:type:ClusterIPselector:app:nginxports:-protocol:TCPport:80# Service 暴露的端口targetPort:80# Pod 上的端口

访问方式:nginx-svc.default.svc.cluster.local 或直接 nginx-svc(同命名空间下)。

2.2 NodePort
在 ClusterIP 基础上,在每个节点上打开一个端口(默认 30000-32767)。

外部可以通过 : 访问。

适合开发测试或不想用负载均衡器的场景。

YAML 示例:

apiVersion:v1kind:Servicemetadata:name:nginx-nodeportspec:type:NodePortselector:app:nginxports:-port:80targetPort:80nodePort:30080# 可选,不指定则自动分配

访问:curl http://任意节点IP:30080

2.3 LoadBalancer
在 NodePort 基础上,自动向云厂商申请一个外部负载均衡器(如 AWS ELB、GCE LB、Azure LB)。

本地测试可使用 MetalLB 模拟。

适用于公有云生产环境。

YAML 示例:

apiVersion:v1kind:Servicemetadata:name:nginx-lbspec:type:LoadBalancerselector:app:nginxports:-port:80targetPort:80

查看外部 IP:kubectl get svc nginx-lb 等待 EXTERNAL-IP 分配。

2.4 ExternalName
将 Service 映射到外部的 DNS 名称,不会创建任何代理或负载均衡。

用于集群内部访问外部服务(如数据库、第三方 API)。

YAML 示例:

apiVersion:v1kind:Servicemetadata:name:external-dbspec:type:ExternalNameexternalName:mydb.example.com

集群内 Pod 可通过 external-db.default.svc.cluster.local 访问 mydb.example.com。

三、Service 的工作原理
kube-proxy 在每个节点上运行,监控 Service 和 Endpoints 的变化。

维护 iptables 或 IPVS 规则,将 Service 的虚拟 IP 流量负载均衡到后端 Pod。

默认使用轮询算法(iptables 随机选择,IPVS 支持更多调度算法)。

四、Headless Service
当 clusterIP: None 时,Service 不分配虚拟 IP,Kube-DNS 直接返回 Pod IP 列表。适用于 StatefulSet 或需要直接访问每个 Pod 的场景。

apiVersion:v1kind:Servicemetadata:name:mysql-headlessspec:clusterIP:Noneselector:app:mysqlports:-port:3306

查询 DNS:nslookup mysql-headless 返回所有符合标签的 Pod IP。

五、Ingress:七层路由
Ingress 提供 HTTP/HTTPS 路由,根据域名和路径将外部流量转发到不同的 Service。需要部署 Ingress Controller(如 Nginx Ingress、Traefik、Contour)才能生效。

5.1 部署 Nginx Ingress Controller

kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

5.2 Ingress YAML 示例

apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:web-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target:/spec:rules:-host:www.example.comhttp:paths:-path:/apipathType:Prefixbackend:service:name:api-serviceport:number:8080-path:/pathType:Prefixbackend:service:name:web-serviceport:number:80tls:-hosts:-www.example.comsecretName:example-tls

host:可选,不指定则匹配所有域名。

pathType:Prefix(前缀匹配)、Exact(精确匹配)、ImplementationSpecific(由 Controller 决定)。

tls:引用包含证书的 Secret。

5.3 创建 TLS Secret

kubectl create secret tls example-tls--cert=path/to/tls.crt--key=path/to/tls.key

5.4 查看 Ingress 地址

kubectl get ingress

输出会显示 ADDRESS(通常是 LB 的 IP)。

六、访问测试与调试
测试 ClusterIP:kubectl run test --image=busybox -it --rm – sh,然后 wget -O- http://nginx-svc。

测试 NodePort:确保集群节点防火墙开放了 NodePort 端口,用浏览器访问 http://:。

测试 Ingress:配置本地 hosts 或真实域名,访问 http://www.example.com。

七、常见问题与解决

八、最佳实践
内部通信使用 ClusterIP,避免不必要的节点端口暴露。

外部访问优先使用 Ingress(七层),而非直接 NodePort,以获得域名、TLS、路径路由能力。

为 LoadBalancer Service 设置 externalTrafficPolicy: Local,保留客户端真实 IP。

对于 TCP/UDP 服务(如数据库、消息队列),可使用 NodePort 或 LoadBalancer,因为 Ingress 主要支持 HTTP/HTTPS。

使用 NetworkPolicy 控制 Service 访问权限(后续文章介绍)。

九、小结
Service 解决了 Pod 动态 IP 和负载均衡问题,Ingress 提供了灵活的七层路由。理解这几种资源,你可以设计出安全、可伸缩的服务暴露方案。

http://www.gsyq.cn/news/1504846.html

相关文章:

  • 南方潮湿天关节总发僵酸胀?5个实用养护技巧,轻松呵护关节舒适
  • 【桌面自动化】 AI 工具 OpenClaw 2.7.9 安装调试实操手册(包含安装包)
  • 2026黔西全城高金价回收黄金回收店铺盘点 TOP 铂金白银旧料回收正规门店联系方式全收录 - 中业金奢再生回收中心
  • Keil uVision工程文件图标与描述乱码修复:从注册表根源到一键脚本
  • Beekeeper Studio 5.7.3 官方版下载(夸克网盘+百度网盘,SHA256校验)
  • 2026年6月济南热门婚纱照机构实力榜单 十强精选 - 江湖评测
  • 贵港车棚供应商是什么?主要有哪几种类型?
  • 终极跨平台iOS应用包管理解决方案:解密ipatool的强大功能
  • ISO 15765-2网络层实战解析:从协议到诊断通信
  • Qt Quick 粒子系统(四):渲染器对比与选型指南
  • Windows 11系统清理终极指南:如何用Win11Debloat让你的电脑重获新生
  • OmenSuperHub深度解析:通过WMI BIOS控制彻底释放惠普OMEN硬件性能的终极指南
  • 5步掌握Mirth Connect医疗数据集成平台
  • Spring Security实战:手把手教你为若依系统添加会员登录模块(附完整代码)
  • Windows 11优化终极指南:如何用Win11Debloat让你的系统运行更流畅
  • 高温台车炉哪家强?基于品牌实力与用户口碑前三推荐 - 品牌推荐大师1
  • 大麦自动化抢票终极指南:告别手速限制,高效抢到心仪门票
  • MPC8306S时钟架构与PLL配置实战:从原理到硬件实现
  • 告别手速焦虑:大麦自动化抢票系统让你秒杀心仪演唱会门票
  • DeepVoice:如何用深度学习实现高质量的文本转语音?
  • Chrome-Charset终极指南:3分钟解决网页乱码问题的完整方案
  • 基于Proteus与STC15W4K32S4的按键中断流水灯实现(C语言)——其二
  • 如何在老旧Mac上安装最新macOS:OpenCore Legacy Patcher完整4步指南
  • Open-Lyrics:基于Whisper与LLM的多语言智能字幕生成架构
  • PCA9641硬件仲裁器:解决多主控I2C总线冲突与锁死的实战指南
  • 收藏!2026年AI校招占比超80%,小白程序员如何抓住大模型时代红利?
  • GD32F4芯片原厂USB CDC虚拟串口例程,支持Win10+/Linux/macOS免驱通信
  • MSC8122 DSP复位与时序设计:嵌入式硬件稳定性的基石
  • Balena Etcher:三分钟掌握安全高效的跨平台镜像烧录方案
  • 黄金已跌至890,国际金价4086