跳到正文
cyxc.club

cert-manager 怎么接 DNSPod

/ 约 8 分钟

更新于

公网 HTTPS 在这套集群里不是 Traefik 自己签的,也不是 kubeasz 那张 100 年 CA。2026-06-04 下午先装 cert-manager v1.20.2,大约半小时后装 cert-manager-webhook-dnspod 1.5.2,ClusterIssuer 名叫 dnspod,走 Let’s Encrypt DNS-01

这篇写这两份 chart 怎么装上。 1.20.2 → 1.21.1 见 cert-manager 1.20.2 升到 1.21.1。 webhook 1.5.2 → 1.5.3 见 DNSPod webhook 1.5.2 升到 1.5.3

目录


要解决什么

读者读完应能分清:

  1. 两份 helm,同一命名空间,有顺序。cert-manager,再 cert-manager-webhook-dnspod。solver 的 serving 证要控制器签;ClusterIssuer 又要等 APIService v1alpha1.acme.dnspod.com
  2. CRD 跟正统 chart 走。 crds.enabled: true,不要另 apply 一份 crds.yaml,也不要让 DNSPod chart 再嵌一套 cert-manager。
  3. ClusterIssuer dnspod 是 webhook chart 渲的。 clusterIssuer.enabled: true。先 staging 注册账号,再改 staging: false 切生产。不要手建第二份 Issuer 抢这个名字。
  4. 第一张对外证不是 Traefik ACME。 当天早上 JumpServer 还写着 certresolver: myresolver;签发链 Ready 之后改成 Ingress Shim。

不要把这篇当成通用 helm install 教程。当天具体 argv 没留下;能对上的是 release 名、chart 版本、USER-SUPPLIED 里改过什么、对象创建时间。


2026-06-04(CST)

helm history 按 UTC 存,这里换成 CST。

时间 发生了什么 依据
12:14 JumpServer helm rev 1。Ingress 还是 Traefik certresolver: myresolverspec.tls helm
13:29 命名空间 cert-manager;helm cert-manager rev 1,chart v1.20.2 ns + helm
13:55 helm cert-manager-webhook-dnspod rev 1,chart 1.5.2;ClusterIssuer dnspod 出现(当时 staging);Let’s Encrypt 账号 Secret 出现 helm + CR
14:02 同一 chart rev 2:凭据换成 API 密钥形态 helm values
14:20 rev 3staging: false,ClusterIssuer 改生产目录 helm values + CR generation 2
14:40 JumpServer rev 2:去掉 certresolver,加上 cluster-issuer: dnspodsecretName: jumpserver-tls helm
14:41 / 14:42 Certificate / Secret jumpserver-tls Certificate
06-05 00:26 ceph-objectstore-tls / ceph-dashboard-tls Certificate

webhook chart 号当天一直是 1.5.2。rev 5 才是 09-15 的 1.5.3。cert-manager 后来 rev 2–5(09-01 / 09-02 / 09-04)appVersion 仍是 v1.20.2,那是裸机之后原样 helm upgraderev 6 才是 09-15 的 v1.21.1。


两个 webhook

现网 cert-manager 命名空间里四个 Deployment,装上当天就是这四个:

Deployment 干什么 哪份 chart
cert-manager 控制器。看 Certificate,去 ACME 下单 cert-manager
cert-manager-cainjector 给 admission webhook 注入 CA 同上
cert-manager-webhook Kubernetes admission(Validating / Mutating) 同上
cert-manager-webhook-dnspod ACME DNS-01 solver。APIService v1alpha1.acme.dnspod.com cert-manager-webhook-dnspod

网上说的「cert-manager webhook」多半是第三行。第四行是另一份 chart:imroc/cert-manager-webhook-dnspodgroupName: acme.dnspod.comsolverName: dnspod。ClusterIssuer 里的 dns01.webhook.groupName 必须和这个 APIService 对上,对不上就是 InvalidSolver

所以不能一份 helm install 了事,也不能先装 solver。


先装 cert-manager

release 名叫 cert-manager,命名空间 cert-manager。ns 和 helm rev 1 同一秒出现,--create-namespace 对得上。chart v1.20.2(Jetstack 那份,home 是 cert-manager.io)。

包现在在 /root/helm-chart/cert-manager。当天 argv 是本地目录还是 jetstack/cert-manager / OCI,history 分不出来,不编。形是:

Terminal window
helm install cert-manager <v1.20.2 那份 chart> \
-n cert-manager --create-namespace

USER-SUPPLIED 是整份 1.20.2 values.yaml,不是后来那份三键覆盖。相对上游能看出来的改动:

  • crds.enabled: truekeep: trueinstallCRDs: false)。CRD 在 chart templates/ 里,Helm 会装。不要另 kubectl apply crds.yaml。
  • 镜像 imageRegistry: quay.io。06-04 还没有 Harbor。
  • dns01RecursiveNameservers 空着。AliDNS 是后来才加的,不要倒写成装上当天就有。

控制器 / admission webhook / cainjector 都是 1 副本,PDB 关着。已签发的 Secret 不受滚动影响,新挑战会排队。这是当时的选择,不是 1.33 改的。

装完应有三个 Deployment Ready,以及 Secret cert-manager-webhook-ca(admission 那条,13:29)。这时还没有 ClusterIssuer,也还不能签 jumpserver.cyxc.club


再装 DNSPod webhook

必须等控制器 Ready。这份 chart 会建自签 Issuer → CA Certificate → CA Issuer → serving Certificate,再挂 APIService。没有 cert-manager,serving 证签不出来,solver 起不来。

release 名叫 cert-manager-webhook-dnspod,同一个 cert-manager 命名空间。chart 1.5.2。包现在在 /root/helm-chart/cert-manager-webhook-dnspod。形是:

Terminal window
helm install cert-manager-webhook-dnspod <1.5.2 那份 chart> \
-n cert-manager

当天同样是整份 values 进 helm。相对上游要开的:

  • cert-manager.enabled: false(1.5.2 还有这个嵌套块)。不要让它再装一套 cert-manager。CRD 已经由上一份 chart 管。
  • groupName: acme.dnspod.com(和 APIService 对上)。
  • clusterIssuer.enabled: true,名字 dnspod,ttl 600selector.dnsZones 当天就是三个区,不是后来才加;正文不展开区表。
  • DNSPod secretId / secretKey 写进 values,chart 渲成 Secret cert-manager-webhook-dnspod-secret。ClusterIssuer 只引用,不把 AK 写进 CR。凭据不进这篇。
  • 镜像直拉 Docker Hub imroc/cert-manager-webhook-dnspod。Harbor 代理是 09-04 才改上的。

13:55 同时出现:APIService、ClusterIssuer dnspod、Let’s Encrypt 账号 Secret cert-manager-webhook-dnspod-letsencrypt、serving 证。ClusterIssuer Ready 当天就是 ACMEAccountRegistered不要删这个 Secret 再装一次,会换账号。

卸这份 chart 会把 ClusterIssuer 一起拿掉。不要 helm uninstall 试手。


当天连升两次

rev 2、rev 3 版本号没变,改的是 values。

14:02 rev 2:换成 DNSPod API 密钥形态。rev 1 的 secretId 不是密钥,solver 调不了 DNSPod API。Secret 被 helm 重渲,ClusterIssuer spec 没变(仍是 staging)。

14:20 rev 3staging: false。chart 把 ACME server 从 acme-staging-v02 改成 https://acme-v02.api.letsencrypt.org/directory。ClusterIssuer generation 变成 2。账号 Secret 名字没换

所以:第一张对外证确实是生产;「从没走过 staging」不对。staging 只存在 13:55–14:20,中间没有对外 Certificate。


为什么是 DNS-01,不是 HTTP-01

ClusterIssuer dnspod 的 solver 只有 DNS-01 webhook,没有 HTTP-01。

HTTP-01 要让 Let’s Encrypt 打到主机名的 :80。现网入口是 Traefik,allowACMEByPass 仍是 falsecertificatesResolvers 是空的。JumpServer 早上那个 myresolver 对不上任何 resolver。外面 HTTPS 还有客户端走 :7443(公网 DNAT,不是 Traefik 自己听 7443),不要假设公网 :80 一定能按域名落到对的 Ingress。

DNS-01 改的是 DNSPod 上的 TXT,不依赖 80/443 怎么 DNAT。通配符也只能走这条。


第一张对外证

JumpServer 比签发链早大约一小时。rev 1 的 Ingress 走 Traefik ACME 注解,没有 spec.tls

14:20 生产 ClusterIssuer Ready 之后,14:40 JumpServer helm rev 2:

  • 去掉 traefik.ingress.kubernetes.io/router.tls.certresolver: myresolver
  • 加上 cert-manager.io/cluster-issuer: dnspod
  • spec.tls[].secretName: jumpserver-tls,host jumpserver.cyxc.club

Ingress Shim 14:41 建 Certificate,14:42 Secret 签出来。这才是现网第一张对外证。

第二天凌晨才轮到 RGW ceph-objectstore-tls / oss.cyxc.club。不要把 RGW 写成签发链的第一张。


怎么用

对外证都指向 ClusterIssuer dnspod。两条路,按 Ingress 和 Secret 的关系选,不要两条一起打

一份 Ingress、一张 Secret(06-04 当天、也是大多数业务):注解 cert-manager.io/cluster-issuer: dnspodspec.tls[].secretName 写上。Ingress Shim 会建 Certificate。JumpServer、RGW 都是这条。

多份 Ingress 共用一张 Secret,或要通配符(08 月以后的 GitLab / Harbor,不是装上当天):手建 Certificate,issuerRef.kind: ClusterIssuername: dnspod。GitLab 三份 Ingress 共用 gitlab-wildcard-tlsgitlab.cyxc.club + *.gitlab.cyxc.club);Harbor 手建 harbor-tls。这些 Ingress 上不要再打 cluster-issuer:Shim 只会按其中一份 host 签,其余域名会对不上。

Traefik 终 TLS,后端还是 HTTP。cert-manager 只把 Secret 填进集群。要加新区,改 webhook 覆盖里的 selector.dnsZones,不是再装一个 cert-manager。

cert-manager 不要顺手 helm upgrade DNSPod chart,也不要改 groupName / selector / Let’s Encrypt Secret 名字。两份分开升。覆盖怎么拆、Harbor、AliDNS,是 09-15 那两篇的事。

2026-09-15 cert-manager 已升到 1.21.1(helm rev 6),webhook 1.5.3(rev 5)。过程:cert-manager 1.20.2 升到 1.21.1DNSPod webhook 1.5.2 升到 1.5.3