You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes Ingress对接LoadBalancer Service异常及HTTP协议适配求助

问题描述

有一个类型为LoadBalancer的Kubernetes Service,配置带主机名的Ingress后无法正常工作。可通过Service的LoadBalancer IP(10.194.32.219:9002)访问服务,但无法通过my-api-online.net访问。后台使用VMWare NSX-T网络虚拟化,应用抛出错误:

play.api.UnexpectedException: Unexpected exception[ServerResultException: HTTP 1.0 client does not support chunked response]

现有Ingress规则

Rules:
  Host                                            Path  Backends
  ----                                            ----  --------
  my-api-online.net  
                                                  /   my-api-frontend:9002 (10.176.21.36:9002)
Annotations:                             ncp/internal_ip_for_policy: 100.64.144.9

Service详情

Name:                     my-api
Namespace:                default
Selector:                 app=my-api
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       192.168.12.23
IPs:                      192.168.12.23
LoadBalancer Ingress:     10.194.32.219
Port:                     http  9002/TCP
TargetPort:               http/TCP
NodePort:                 http  31969/TCP
Endpoints:                10.176.21.36:9002
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason  Age   From                Message
  ----    ------  ----  ----                -------
  Normal  Type    52m   service-controller  ClusterIP -> LoadBalancer

相关配置文件

apiVersion: v1
kind: Service
metadata:
  name: my-api
  namespace: default
spec:
  type: LoadBalancer
  selector:
    app: my-api
  ports:
    - name: http
      port: 9002
      protocol: TCP
      targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-api-ingress
spec:
  rules:
    - host: my-api-online.net
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: my-api
              port:
                number: 9002
问题分析与解决

从应用报错可以确定,问题根源是NSX-T的Ingress控制器(NCP)将HTTP/1.1请求转换为HTTP/1.0转发给后端服务,但后端返回了分块编码(chunked)的响应,而HTTP/1.0本身不支持分块传输,导致请求失败。

配置调整方案

1. 强制Ingress控制器用HTTP/1.1与后端通信

针对NSX-T的NCP控制器,添加Ingress注解指定后端通信的HTTP版本:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-api-ingress
  annotations:
    ncp/http_version: "1.1"  # 强制NCP用HTTP/1.1转发请求到后端
spec:
  rules:
    - host: my-api-online.net
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: my-api
              port:
                number: 9002

2. 禁用后端服务的分块编码(可选)

如果无法修改Ingress控制器配置,可在Play Framework应用层面禁用分块传输,确保响应包含Content-Length头:
在application.conf中添加:

play.server.http.chunked = false

3. 检查Ingress后端服务名称匹配

注意到Ingress规则中显示的后端是my-api-frontend:9002,但你的Service名称是my-api,需确认是否存在名称拼写错误,或其他命名空间有同名Service。如果是名称错误,修正Ingress中的service.name为my-api即可。

验证步骤

  1. 应用修改后的Ingress配置:
    kubectl apply -f your-ingress-file.yaml
    
  2. 等待Ingress控制器更新配置后,测试my-api-online.net的访问。
  3. 查看应用日志,确认HTTP 1.0 client does not support chunked response错误是否消失。

内容的提问来源于stack exchange,提问作者Kubus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:48:22