Kubernetes集群中Traefik与Ingress间端到端流量加密方案咨询
实现Traefik到后端服务的端到端TLS加密
我之前也遇到过完全一样的需求——不想让Traefik把前端的HTTPS请求降级成HTTP转发给后端,要实现从用户浏览器到后端服务的全程加密。下面是我验证过的可行方案,分三个核心步骤:
1. 给后端服务配置内部TLS证书
首先得让你的后端服务本身支持HTTPS,因为Traefik要以HTTPS方式和它通信。推荐用cert-manager来管理集群内部的自签证书,这样不用手动维护证书:
- 先创建一个集群级的内部CA Issuer(或者命名空间级的Issuer,看你的需求):
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: internal-ca spec: selfSigned: {} - 然后给后端服务的集群域名(格式为
服务名.命名空间.svc.cluster.local,比如my-app.default.svc.cluster.local)签发证书:apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: my-app-tls namespace: default spec: secretName: my-app-tls-secret issuerRef: name: internal-ca kind: ClusterIssuer commonName: my-app.default.svc.cluster.local dnsNames: - my-app.default.svc.cluster.local isCA: false privateKey: algorithm: RSA size: 2048 usages: - server auth - 最后把这个证书挂载到你的后端Pod里,配置服务监听HTTPS端口(比如443),具体配置要看你的后端技术栈(比如Nginx、Spring Boot等)。
2. 配置Traefik信任后端证书(可选但推荐)
如果后端用的是自签内部证书,Traefik默认会拒绝这个证书,所以需要让它信任我们的内部CA:
把
internal-ca的CA证书导出成Secret:kubectl get secret internal-ca -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt kubectl create secret generic traefik-trust-ca --from-file=ca.crt=ca.crt修改Traefik的Deployment,把这个Secret挂载到Traefik的信任目录里(比如
/etc/traefik/certs),然后在Traefik的静态配置里添加:serversTransport: rootCAs: - /etc/traefik/certs/ca.crt如果你用Helm安装Traefik,可以通过
values.yaml里的additionalArguments或者serversTransport配置项来设置。要是你只是在测试环境,也可以临时关闭证书验证(生产环境绝对不推荐),通过Ingress注解实现:
traefik.ingress.kubernetes.io/serverstransport.insecureSkipVerify: "true"
3. 修改Ingress资源,指定后端协议为HTTPS
最后一步是告诉Traefik,转发请求到后端时要用HTTPS协议,而不是默认的HTTP:
- 你的Ingress资源需要保留前端的TLS配置(比如Let's Encrypt的证书),然后添加关键注解,同时指定后端的HTTPS端口:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress namespace: default annotations: # 告诉Traefik用HTTPS访问后端服务 traefik.ingress.kubernetes.io/service.protocol: https # 如果后端端口不是默认的443,指定端口号 traefik.ingress.kubernetes.io/service.port: "443" # 可选:如果没配置全局信任CA,这里单独关闭验证(仅测试用) # traefik.ingress.kubernetes.io/serverstransport.insecureSkipVerify: "true" spec: tls: - hosts: - my-app.example.com secretName: my-app-external-tls # 你的外部HTTPS证书(比如Let's Encrypt) rules: - host: my-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app-service port: number: 443
这样配置后,用户浏览器发HTTPS请求到Traefik,Traefik会用HTTPS把请求转发到你的后端服务,实现真正的端到端加密。
内容的提问来源于stack exchange,提问作者Valentin
相关产品推荐
相关产品推荐

