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

K3s切换Hetzner云负载均衡为HTTPS时返回400 Bad Request报错

故障根因

400错误和你看到的Ingress更新报错没有关联。后者是K8s多控制器并发更新Ingress资源时的常规版本冲突,控制器会自动重试,属于正常日志,完全不影响业务。
核心问题是负载均衡与Traefik的协议配置不匹配:

  • 你新增的load-balancer.hetzner.cloud/protocol: https注解,会让Hetzner云负载均衡把发往后端Traefik的所有流量都用HTTPS协议封装
  • 但你当前Traefik只配置了80端口web入口的转发规则,这个入口只接收明文HTTP请求,收到加密HTTPS流量时根本无法解析,直接返回400响应。
  • 之前HTTP访问正常,就是因为没加这几个HTTPS注解时,LB默认用HTTP协议和后端Traefik通信,和Traefik的入口配置匹配。
修复方案

根据TLS终结位置二选一即可,优先选方案1,和你当前配置的Hetzner托管证书逻辑完全适配:

方案1:Hetzner LB层终结TLS(推荐)

这种模式下用户到LB的流量走HTTPS,LB完成TLS解密后,用明文HTTP把请求转发给Traefik,性能损耗小,也不需要修改你现有的Ingress资源配置。
直接修改traefik-config.yaml内容如下,等K3s自动同步配置、LB更新完后端规则就恢复正常:

# /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    additionalArguments:
      - --entryPoints.web.proxyProtocol.trustedIPs=10.0.2.1
      - --entryPoints.web.forwardedHeaders.trustedIPs=10.0.2.1
      # 给443入口也加上信任IP配置,避免后续获取不到真实客户端IP
      - --entryPoints.websecure.proxyProtocol.trustedIPs=10.0.2.1
      - --entryPoints.websecure.forwardedHeaders.trustedIPs=10.0.2.1
    service:
      annotations:
        load-balancer.hetzner.cloud/name: worker-lb
        load-balancer.hetzner.cloud/use-private-ip: 'true'
        # 把协议改成tcp,让LB按四层规则转发端口,不要强行给后端发HTTPS流量
        load-balancer.hetzner.cloud/protocol: tcp
        load-balancer.hetzner.cloud/certificate-type: managed
        load-balancer.hetzner.cloud/http-managed-certificate-domains: '*.example.org,example.org'
        load-balancer.hetzner.cloud/uses-http2: "true"

方案2:Traefik层终结TLS

如果你需要让Traefik自己处理TLS解密、LB只做四层透传,直接删掉所有Hetzner证书相关注解,保留load-balancer.hetzner.cloud/protocol: tcp配置,再给Traefik配置对应证书、给Ingress资源添加tls配置段即可。你已经申请了Hetzner托管证书,没必要选这个方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:18:22