从Ingress切换到IngressRoute:CertManager与Let's Encrypt配置问题
解决Traefik IngressRoute结合cert-manager自动签发Let's Encrypt证书的问题
核心原因
cert-manager仅对Kubernetes标准Ingress资源提供原生支持,会监听其注解触发证书签发;而Traefik的IngressRoute是自定义CRD,cert-manager不会主动处理它的配置,所以直接套用Ingress的注解或尝试关联ClusterIssuer都会失效。
方案一:复用现有ClusterIssuer,手动创建Certificate资源(推荐)
通过手动定义cert-manager的Certificate资源,让它利用已有的ClusterIssuer生成证书,再在IngressRoute中直接引用生成的证书Secret。
- 创建Certificate资源:
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: other-host-tls # 注意:使用ClusterIssuer无需指定namespace;若用Issuer则需与IngressRoute同namespace spec: secretName: other-host-tls-secret # 证书生成后存储的Secret名称 issuerRef: name: letsencrypt-prod kind: ClusterIssuer group: cert-manager.io dnsNames: - other.host.com
- 修改IngressRoute配置,引用上述Secret:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: myapp-other-name-websecure spec: entryPoints: - websecure routes: - match: Host(`other.host.com`) kind: Rule services: - name: linkingservice port: 80 tls: secretName: other-host-tls-secret # 直接引用cert-manager生成的证书Secret
方案二:使用Traefik自带certResolver直接对接Let's Encrypt(无需cert-manager)
如果不想依赖cert-manager,可以直接用Traefik内置的ACME客户端(certResolver)签发证书,这和cert-manager是两套独立体系,不能复用已有的ClusterIssuer。
- 修改Traefik静态配置(以Helm部署为例,修改values.yaml):
additionalArguments: - "--certificatesresolvers.letsencrypt.acme.email=my@email.com" - "--certificatesresolvers.letsencrypt.acme.storage=acme.json" - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" # 生产环境用正式服务器,测试可替换为staging地址:https://acme-staging-v02.api.letsencrypt.org/directory - "--certificatesresolvers.letsencrypt.acme.server=https://acme-v02.api.letsencrypt.org/directory"
- 修改IngressRoute配置,指定certResolver:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: myapp-other-name-websecure spec: entryPoints: - websecure routes: - match: Host(`other.host.com`) kind: Rule services: - name: linkingservice port: 80 tls: certResolver: letsencrypt # 对应Traefik静态配置中定义的certResolver名称
验证方法
- 检查cert-manager证书状态:
kubectl get certificates,状态为Ready则签发成功 - 检查证书Secret是否存在:
kubectl get secret other-host-tls-secret - 查看Traefik日志确认流程:
kubectl logs -n traefik <traefik-pod-name>
内容的提问来源于stack exchange,提问作者Danielson
相关产品推荐
相关产品推荐

