公网 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。
目录
- 要解决什么
- 2026-06-04(CST)
- 两个 webhook
- 先装 cert-manager
- 再装 DNSPod webhook
- 当天连升两次
- 为什么是 DNS-01,不是 HTTP-01
- 第一张对外证
- 怎么用
要解决什么
读者读完应能分清:
- 两份 helm,同一命名空间,有顺序。 先
cert-manager,再cert-manager-webhook-dnspod。solver 的 serving 证要控制器签;ClusterIssuer 又要等 APIServicev1alpha1.acme.dnspod.com。 - CRD 跟正统 chart 走。
crds.enabled: true,不要另 apply 一份 crds.yaml,也不要让 DNSPod chart 再嵌一套 cert-manager。 - ClusterIssuer
dnspod是 webhook chart 渲的。clusterIssuer.enabled: true。先 staging 注册账号,再改staging: false切生产。不要手建第二份 Issuer 抢这个名字。 - 第一张对外证不是 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: myresolver,spec.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 3:staging: false,ClusterIssuer 改生产目录 |
helm values + CR generation 2 |
| 14:40 | JumpServer rev 2:去掉 certresolver,加上 cluster-issuer: dnspod 和 secretName: 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 upgrade。rev 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-dnspod,groupName: acme.dnspod.com,solverName: 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 分不出来,不编。形是:
helm install cert-manager <v1.20.2 那份 chart> \ -n cert-manager --create-namespaceUSER-SUPPLIED 是整份 1.20.2 values.yaml,不是后来那份三键覆盖。相对上游能看出来的改动:
crds.enabled: true(keep: true,installCRDs: false)。CRD 在 charttemplates/里,Helm 会装。不要另kubectl applycrds.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。形是:
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 600。selector.dnsZones当天就是三个区,不是后来才加;正文不展开区表。- DNSPod
secretId/secretKey写进 values,chart 渲成 Secretcert-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 3:staging: 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 仍是 false,certificatesResolvers 是空的。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,hostjumpserver.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: dnspod,spec.tls[].secretName 写上。Ingress Shim 会建 Certificate。JumpServer、RGW 都是这条。
多份 Ingress 共用一张 Secret,或要通配符(08 月以后的 GitLab / Harbor,不是装上当天):手建 Certificate,issuerRef.kind: ClusterIssuer、name: dnspod。GitLab 三份 Ingress 共用 gitlab-wildcard-tls(gitlab.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.1、DNSPod webhook 1.5.2 升到 1.5.3。