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
相关产品推荐
相关产品推荐

