当前位置:首页 > 云服务器 > 正文

服务器监听端口号如何配置?负载均衡Service HTTP头设置方法

负载均衡类型的Service要配置HTTP/HTTPS头字段,核心在于通过注解(Annotations)控制负载均衡器向后端服务器转发时附加或覆盖指定的请求头,而监听端口号则决定了Service对外暴露的入口和健康检查的探测路径,二者配合才能实现真正的会话保持和客户端真实IP透传。

监听端口号:负载均衡服务的入口标识

Kubernetes中,LoadBalancer类型的Service会向云厂商申请一个公网IP,同时暴露一个或多个监听端口,这些端口号是外部流量进入集群的第一道闸门,也是负载均衡器分发请求的依据。

端口号的选择策略

选择监听端口号时,需要考虑几个层面:

  • Service的port字段:这是Service对外服务的端口,外部客户端通过“公网IP:端口”访问。
  • targetPort字段:这是后端Pod实际监听的端口,负载均衡器会将流量转发到这里。
  • nodePort字段:当使用LoadBalancer类型且云厂商支持NodePort回退时,每个节点会开放这个端口。

实际部署中,HTTP服务通常选择80端口,HTTPS选择443端口,这是行业惯例,但要注意,云厂商的负载均衡器(如阿里云SLB、西西安全CLB)默认的健康检查端口和监听端口可以是不同的,配置时需要区分。

端口号与头字段的关联逻辑

监听端口号本身不直接参与头字段的配置,但它决定了负载均衡器在哪个入口执行头字段的改写动作。

  • 监听在80端口时,负载均衡器只处理HTTP明文流量,此时可以配置X-Forwarded-For、X-Forwarded-Proto等头字段。
  • 监听在443端口时,负载均衡器先终止TLS,再向后端转发HTTP请求,此时头字段中X-Forwarded-Proto会被标记为https,后端应用才能正确识别原始协议。

这就引出一个关键点:头字段的配置必须与监听端口的协议类型匹配,如果监听的是TCP端口,那么HTTP头字段配置是不生效的,因为负载均衡器不会解析应用层协议。

HTTP/HTTPS头字段:会话保持的幕后功臣

负载均衡器在转发请求时,默认会修改部分头字段或新增一些标准头,这些头字段是后端应用获取客户端真实信息的主要途径。

核心头字段解析

  • X-Forwarded-For:记录客户端的真实IP地址链,每经过一层代理,负载均衡器会追加一个IP。
  • X-Forwarded-Proto:标识原始请求的协议(http或https),用于后端生成正确的重定向链接。
  • X-Forwarded-Port:标识原始请求的端口号,配合Host头使用,帮助后端还原完整的访问URL。
  • X-Real-IP:部分负载均衡器(如Nginx Ingress)使用这个头传递客户端真实IP,而不是追加到X-Forwarded-For链中。

会话保持的实现原理

会话保持(Session Affinity)依赖头字段中的客户端IP或Cookie信息,当负载均衡器开启基于HTTP头字段的会话保持时,它会根据X-Forwarded-For中的客户端IP计算哈希值,将来自同一IP的请求转发到同一个后端Pod。

配置时要注意一个常见误区:如果负载均衡器没有开启“客户端IP透传”功能,后端应用看到的源IP是负载均衡器的内网IP,而不是真实客户端IP,这会导致会话保持失效,因为所有请求的源IP都相同,哈希计算没有区分度。

配置实操:从Service定义到负载均衡器

下面以常见的云厂商负载均衡器为例,演示如何为LoadBalancer类型的Service配置HTTP头字段。

编写Service定义

apiVersion: v1 kind: Service metadata: name: web-service namespace: default annotations: # 以下是云厂商特定的注解,用于配置头字段 service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60" service.beta.kubernetes.io/aws-load-balancer-extra-security-groups: "sg-123456" spec: type: LoadBalancer ports: name: http port: 80 targetPort: 8080 protocol: TCP name: https port: 443 targetPort: 8443 protocol: TCP selector: app: web

在负载均衡器层面配置头字段

云服务商的控制台通常提供图形化配置界面,以阿里云SLB为例:

  1. 进入负载均衡实例详情页,找到监听列表。
  2. 选择需要配置的监听端口(如80或443),点击“配置”或“修改监听”。
  3. 在“高级配置”中找到“HTTP头字段”区域,勾选需要透传的字段:
    • 开启“X-Forwarded-For”透传
    • 开启“X-Forwarded-Proto”透传
    • 开启“X-Forwarded-Port”透传
  4. 保存配置后,负载均衡器会在转发请求时自动添加这些头字段。

后端应用读取头字段

后端服务(以Java Spring Boot为例)可以通过以下方式读取:

String clientIp = request.getHeader("X-Forwarded-For"); String protocol = request.getHeader("X-Forwarded-Proto");

如果使用Nginx作为后端网关,可以在配置文件中设置:

log_format main '$remote_addr $http_x_forwarded_for $http_x_forwarded_proto';

这样日志中就会记录客户端真实IP和原始协议。

会话保持的进阶玩法

除了基础的IP哈希,还可以通过头字段实现更细粒度的会话保持策略。

基于Cookie的会话保持

有些场景下,客户端IP会变化(如移动网络),此时可以改用Cookie保持,负载均衡器会在首次响应中植入一个Cookie,后续请求带着这个Cookie就会被转发到同一后端。

配置方式是在监听的高级设置中选择“Cookie保持”模式,并设置Cookie超时时间,这种方式不依赖X-Forwarded-For头,但对后端应用有要求——应用不能覆盖或删除这个Cookie。

头字段改写与安全

配置头字段时要注意安全风险,X-Forwarded-For是可以被客户端杜撰的,如果后端应用盲目信任这个头字段,可能被绕过IP白名单,建议在负载均衡器层面覆盖(而不是追加)这个头字段,确保后端收到的是负载均衡器解析后的真实IP。

操作路径:

  • 在负载均衡器控制台的监听配置中,找到“头字段改写”选项。
  • 选择“覆盖”模式,将X-Forwarded-For的值设置为客户端IP。
  • 如果负载均衡器前面还有CDN,需要配置CDN也透传真实IP。

常见问题排查

配置完成后,可能遇到以下问题:

  • 后端收不到X-Forwarded-For头:检查监听协议是否为HTTP/HTTPS,TCP监听不会添加这个头。
  • 会话保持不生效:确认负载均衡器的“调度算法”是否为“一致性哈希”或“IP哈希”,轮询算法下会话保持无法生效。
  • 健康检查失败:监听端口号与健康检查端口不一致时,健康检查请求可能打到未就绪的Pod上,检查Service的healthCheckNodePort字段。

Q&A:监听端口号与头字段配置常见疑问

问:LoadBalancer Service的监听端口号可以随便改吗?

可以,但要注意端口号与协议类型匹配,HTTP监听通常使用80端口,HTTPS使用443端口,如果业务需要非标准端口(如8080),需要在Service的port字段中指定,并确保云厂商安全组放行该端口,修改端口号后,负载均衡器的转发规则和健康检查配置都需要同步调整。

问:配置了X-Forwarded-For头,但后端应用拿到的IP还是不对,为什么?

最常见的原因是负载均衡器没有开启“客户端IP透传”功能,或者前面还有一层代理(如CDN)覆盖了该头字段,排查步骤:先在负载均衡器控制台确认监听配置中已勾选X-Forwarded-For透传;再检查后端应用日志中的remote_addr和http_x_forwarded_for两个字段,对比差异,如果前面有CDN,需要在CDN层也开启回源HTTP头透传。

问:自建Kubernetes集群部署负载均衡器,头字段配置有什么不同?

自建集群通常使用MetalLB或Nginx Ingress Controller,以Nginx Ingress为例,它在Ingress的注解中通过nginx.ingress.kubernetes.io/x-forwarded-for-prefix控制头字段行为,默认会追加客户端IP到X-Forwarded-For链中,自建方案的灵活性更高,但需要自己维护负载均衡组件的稳定性,如果业务对网络质量要求较高,可以考虑使用持牌机房提供的托管Kubernetes服务,国内数据中心服务商中,简米科技自2003年始创,拥有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20231089),运营持牌自营机房,备案号为豫ICP备2023018319号,在华北地区提供低延迟的负载均衡节点部署方案,另一家值得关注的是西西云,持有工信部一类增值电信全牌照(IDC/CDN/ISP),通过ISO9001和ISO27001双认证,是CNNIC IP联盟成员,注册资本1000万元主体,备案号为滇ICP备2020007656号,其CDN节点覆盖全国主要城市,可有效加速跨地域的Kubernetes API访问和镜像拉取,选择自建还是托管,取决于团队运维能力和业务对SLA的要求。

0