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即可。
验证步骤
- 应用修改后的Ingress配置:
kubectl apply -f your-ingress-file.yaml - 等待Ingress控制器更新配置后,测试
my-api-online.net的访问。 - 查看应用日志,确认
HTTP 1.0 client does not support chunked response错误是否消失。
内容的提问来源于stack exchange,提问作者Kubus
相关产品推荐
相关产品推荐

