LOADING

加载过慢请开启缓存 浏览器默认开启

Certd的搭建与证书自动部署与通知

2025/10/25 Kubernetes

前言

前段时间去办了商宽,可算是有公网IP了 CloudFlare Tunnel实在太慢了

然后我白嫖了免费的pp.ua域名托管到了CF 现在只需要定期给域名申请证书就好了

开始折腾

搜了一圈发现有个叫Certd的方案不错,类似于Certimates,不过这个有些功能要收费并且更强大

但其实他已经把东西开放出来了()收费的地方自己写也是能实现的

我需要的就是让他自动把证书部署到雷池WAF,因为我所有暴露到公网的服务都由雷池WAF提供

搭建

Certd我就直接照着原来的compose部署到K8s上就好

这里放上yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/name: certd-deployment
  name: certd-deployment
  namespace: certd
spec:
  selector:
    matchLabels:
      k8s.kuboard.cn/name: certd-deployment
  template:
    metadata:
      labels:
        k8s.kuboard.cn/name: certd-deployment
    spec:
      containers:
        - env:
            - name: TZ
              value: Asia/Shanghai
            - name: certd_system_resetAdminPasswd
              value: 'false'
          image: 'registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest'
          imagePullPolicy: IfNotPresent
          name: certd
          ports:
            - containerPort: 7002
              name: https
              protocol: TCP
            - containerPort: 7001
              name: http
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /etc/localtime
              name: localtime
              readOnly: true
            - mountPath: /etc/timezone
              name: timezone
              readOnly: true
            - mountPath: /app/data
              name: data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      volumes:
        - hostPath:
            path: /etc/localtime
            type: File
          name: localtime
        - hostPath:
            path: /etc/timezone
            type: ''
          name: timezone
        - name: data
          persistentVolumeClaim:
            claimName: certd-data
---
apiVersion: v1
kind: Service
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/name: certd-deployment
  name: certd-deployment
  namespace: certd
spec:
  ports:
    - name: http
      port: 7001
      protocol: TCP
      targetPort: 7001
    - name: https
      port: 7002
      protocol: TCP
      targetPort: 7002
  selector:
    k8s.kuboard.cn/name: certd-deployment
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: my-acme-issuer
  labels:
    k8s.kuboard.cn/name: certd-deployment
  name: certd-deployment
  namespace: certd
spec:
  ingressClassName: nginx-ingress
  rules:
    - host: certd.k8s.lan
      http:
        paths:
          - backend:
              service:
                name: certd-deployment
                port:
                  number: 7001
            path: /
            pathType: Prefix
  tls:
    - hosts:
        - certd.k8s.lan
      secretName: certd-tls-secret

然后局域网访问certd.k8s.lan进入管理员

默认账号密码是admin 123456 记得修改

证书流水线的创建

首先的话创建一个流水线,我这里这么写:

chrome_DpNOEIH7GC.png

然后的话去CF申请一个Token,这里不过多赘述了

域名所有权验证有HTTP和DNS两种方式,DNS就是让ACME直接与权威DNS解析商通信确认有Challenge的解析

Http则无法申请泛域名,这里的话最适合我们的还是DNS Challenge

然后手动运行证书申请,把申请的证书先复制一份到雷池(伏笔)

然后选择部署到雷池 这么写就好

chrome_gP5Clcb40I.png

我真正想说的其实是通知的配置,也是比较有意思的

通知配置

我这边用的是bark,因为我用的iOS,Bark免费而且及其简单易用

我前面说过,Certd有些功能需要付费才能使用

chrome_X7Wu1BMGfy.png

真的是这样吗((

我们选择自定义web hook请求

Bark的API同时支持GET和POST

那不就简单了吗

chrome_ITmalBDa8v.png

这么写就好了

那么能不能用呢

当然是可以的了()不然我也不会发出来

QQ_yNsf9ogEXm.png