
📝Notes: 本文讲的是 Linux crontab → K8s CronJob 的迁移设计与验证策略。acme.sh + DNSPod 的签发流程、腾讯 CDN 与七牛的推送细节,在另一篇里已经写过,这里只做背景交代,一笔带过。
书接上回,旧方案三句话就能说完:
~/.acme.sh、能跑,但问题不少:
Kubernetes 的 CronJob 是这套环境里唯一同时具备「声明式」和「有历史记录」两个属性的定时器。
能拿到的是这些:
kubectl get jobs 查到,不用登录某台机器翻日志。骨架大致是这个样子,字段按实际环境调整。
apiVersion: batch/v1
kind: CronJob
metadata:
name: cert-renew
namespace: certs
spec:
schedule: "17 3 * * *"
timeZone: "Asia/Shanghai"
concurrencyPolicy: Forbid
startingDeadlineSeconds: 3600
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 5
jobTemplate:
spec:
backoffLimit: 2
activeDeadlineSeconds: 1800
template:
spec:
restartPolicy: Never
serviceAccountName: cert-renew
containers:
- name: acme
image: neilpang/acme.sh:latest
command: ["/bin/sh", "-c"]
args:
- |
acme.sh --issue --dns dns_dp \
-d ewhisper.cn -d '*.ewhisper.cn'
envFrom:
- secretRef:
name: acme-dns-credential
volumeMounts:
- name: acme-home
mountPath: /acme.sh
volumes:
- name: acme-home
persistentVolumeClaim:
claimName: acme-home详细说明如下:
concurrencyPolicy: Forbid 是必须的。两轮重叠时同时去写 DNS TXT 记录,会互相覆盖,签发直接失败。startingDeadlineSeconds: 3600 给了一小时容错窗口。集群短暂不可用时不至于整轮丢失。timeZone 字段要求 K8s 1.27 以上(我的昨天刚升级到 1.37,最新 stable 版本的 k3s),低于这个版本得靠容器内 TZ 环境变量兜底。restartPolicy: Never 配合 backoffLimit: 2,失败两次就停,避免无限重试把 DNS API 打爆。密钥管理一定一定要注意,避免泄露:
📌示例:占位符的作用是让 spec 可以提交、CI 可以跑、PR 可以 review,而 Secret 本体永远不进 Git 历史。
密钥挂载方案:CronJob 通过 Secret 挂载环境变量,readOnly,不落盘到镜像层,也不出现在 kubectl describe pod 的明文输出里。
第一跑之前,一条一条过一遍:
*。concurrencyPolicy: Forbid 确认生效。startingDeadlineSeconds 不小于一轮执行时长。最终成功完成迁移。🎉🎉🎉
Linux crontab 到 K8s CronJob 的迁移,YAML 部分照着官方文档就能写出来。难点是实践过程中的细节考量。
本文总结了我从 Linux crontab 迁移证书续期到 Kubernetes CronJob 的设计、密钥管理、与上线前检查等步骤。收益是:
相关代码已经打包成 helm chart,感兴趣的可以看看:https://github.com/east4ming/homelab2/tree/master/apps/acme-ewhisper
希望对你有所帮助。
🎉🎉🎉
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。