Traefik 2 Kubernetes环境配置LetsEncrypt不修改原部署方案咨询
Traefik v2 对接 LetsEncrypt 免修改原有部署方案
核心疑问解答
- 是否可以通过ConfigMap、Secret完成LetsEncrypt的相关配置?
仅当你所使用的预装Traefik 2默认开启了ACME证书解析器的动态配置加载能力时可以实现,否则无法仅通过ConfigMap、Secret完成配置,不需要修改Traefik部署的优先方案是使用Cert-Manager。
- 是否可以通过ConfigMap、Secret完成LetsEncrypt的相关配置?
- 该场景是否需要使用Cert-Manager?Cert-Manager是不是该场景的必备依赖?
Cert-Manager不是该场景的必备依赖。Traefik原生自带ACME证书签发能力可直接对接LetsEncrypt,但原生能力默认将证书存储在Traefik Pod本地,且需要修改Traefik启动参数配置ACME规则,不符合你不修改原有部署的要求。使用Cert-Manager的方案完全不需要触碰Traefik的原有部署配置,所有资源均为独立声明,更适配后续GitOps管理需求。
- 该场景是否需要使用Cert-Manager?Cert-Manager是不是该场景的必备依赖?
- 如果上述方案不可行,是否必须自行通过GitOps重新部署整套Traefik Chart?
不需要重新部署Traefik Chart,使用Cert-Manager的方案可完全实现需求,全程不需要修改原有Traefik的任何配置。只有当你必须使用Traefik原生ACME的特殊能力时,才需要重新部署Traefik。
- 如果上述方案不可行,是否必须自行通过GitOps重新部署整套Traefik Chart?
- 生成的证书是否需要存储在volume中以避免丢失?
如果你使用Traefik原生ACME能力,必须挂载持久化Volume存储acme.json文件,否则Pod重建后证书会丢失,频繁重签容易触发LetsEncrypt的限流规则。如果你使用Cert-Manager方案,证书默认存储在Kubernetes etcd的Secret资源中,不需要额外挂载持久化Volume。
- 生成的证书是否需要存储在volume中以避免丢失?
免修改原有Traefik部署实操方案
该方案全程不需要调整原有Traefik的部署、Chart配置,所有资源均可通过GitOps做声明式管理,操作步骤如下:
- 部署Cert-Manager组件,所有资源均独立部署在专属命名空间下,不与原有Traefik组件产生耦合。
- 创建LetsEncrypt集群级签发者,配置示例如下:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@domain.com # 替换为你的邮箱,证书到期会收到提醒 privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: traefik
- 调整你现有的IngressRoute配置,增加HTTPS入口、TLS配置和HTTP跳转HTTPS中间件,调整后的配置如下:
# 新增HTTP跳转HTTPS中间件 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: redirect-https namespace: default spec: redirectScheme: scheme: https permanent: true --- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: annotations: kubernetes.io/ingress.class: traefik cert-manager.io/cluster-issuer: letsencrypt-prod # 自动触发证书签发 name: demo-ingress-route-http namespace: default spec: entryPoints: - web routes: - kind: Rule match: Host(`demo.mydomain.at`) priority: 0 middlewares: - name: redirect-https services: - name: frontend-app port: 80 - kind: Rule match: Host(`demo.mydomain.at`) && PathPrefix(`/backend/`) middlewares: - name: demo-middleware-backend - name: redirect-https priority: 0 services: - name: backend-api port: 80 --- # HTTPS入口配置 apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: annotations: kubernetes.io/ingress.class: traefik name: demo-ingress-route-https namespace: default spec: entryPoints: - websecure routes: - kind: Rule match: Host(`demo.mydomain.at`) priority: 0 services: - name: frontend-app port: 80 - kind: Rule match: Host(`demo.mydomain.at`) && PathPrefix(`/backend/`) middlewares: - name: demo-middleware-backend priority: 0 services: - name: backend-api port: 80 tls: certResolver: letsencrypt-prod domains: - main: demo.mydomain.at secretName: demo-mydomain-at-tls # Cert-Manager会自动将签发的证书存入该Secret --- # 原有路径剥离中间件保留 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: demo-middleware-backend namespace: default spec: stripPrefix: prefixes: - /backend
配置提交后,Cert-Manager会自动完成域名校验、证书签发、证书续期全流程,Traefik会自动读取Secret中的证书完成HTTPS卸载,全程不需要调整原有Traefik的任何配置。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

