在K3s中用Traefik反向代理自签名HTTPS服务遇内部错误求助
解决K3s+Traefik代理自签名HTTPS上游服务的Internal Service Error问题
核心问题在于Traefik默认会严格验证上游HTTPS服务的证书有效性,家庭设备(路由器、NAS)的自签名证书不被Traefik信任,导致建立连接失败,最终返回Internal Service Error。你之前尝试的ServersTransport思路是对的,但大概率是配置细节或者引用方式有误,以下是完整的解决步骤:
1. 创建忽略SSL验证的ServersTransport资源
这个资源告诉Traefik跳过对上游服务的证书校验,配置如下:
apiVersion: traefik.containo.us/v1alpha1 kind: ServersTransport metadata: name: ignore-ssl-verify namespace: default # 确保和你的Ingress在同一个命名空间 spec: insecureSkipVerify: true # 关键配置:禁用证书验证 # 若上游服务需要特定SNI,可以设置serverName字段,否则留空即可 serverName: ""
2. 在Ingress中正确关联ServersTransport
除了引用ServersTransport,还需要明确指定上游服务的协议为HTTPS,通过Traefik的annotation实现:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nas-ingress namespace: default annotations: # 指定上游服务使用HTTPS协议 traefik.ingress.kubernetes.io/serversscheme: https # 关联刚才创建的ServersTransport,跨命名空间的话用「命名空间/资源名」格式 traefik.ingress.kubernetes.io/servers-transport: ignore-ssl-verify spec: tls: - hosts: - nas.yourdomain.com # 你的自定义域名 secretName: nas-tls # cert-manager生成的有效证书Secret rules: - host: nas.yourdomain.com http: paths: - path: / pathType: Prefix backend: service: name: nas-headless # 你的无头服务名称 port: number: 443
3. 确认无头服务与Endpoints配置正确性
确保你的无头服务和Endpoints正确指向家庭设备的443端口:
# 无头服务配置 apiVersion: v1 kind: Service metadata: name: nas-headless namespace: default spec: clusterIP: None # 标记为无头服务 ports: - name: https port: 443 targetPort: 443 --- # 自定义Endpoints配置 apiVersion: v1 kind: Endpoints metadata: name: nas-headless namespace: default subsets: - addresses: - ip: 192.168.1.100 # 替换为你的NAS/路由器局域网IP ports: - name: https port: 443
4. 额外排查要点
- 命名空间一致性:如果ServersTransport和Ingress不在同一个命名空间,引用时必须加上命名空间前缀,比如
traefik/ignore-ssl-verify - Traefik日志排查:临时将Traefik日志级别调为DEBUG(在Traefik Deployment的命令行参数中添加
--log.level=DEBUG),查看日志中是否有证书验证失败的具体报错,确认问题根源 - 网络连通性:在K3s集群节点上执行
curl -k https://<设备局域网IP>,确认节点能正常访问上游服务的443端口,排除网络不通的问题
内容的提问来源于stack exchange,提问作者DanielM
相关产品推荐
相关产品推荐

