SSL 证书更新操作手册
1. 背景说明
本集群中三个核心 Web 服务均通过 K3s 内置的 Traefik 作为入口 对外暴露 HTTPS:
服务 | 域名 | 证书管理方式 | 存放位置 |
|---|---|---|---|
Prometheus |
| Kubernetes Ingress → TLS Secret |
|
Grafana |
| Kubernetes Ingress → TLS Secret |
|
ArgoCD |
| Traefik IngressRoute → TLS Secret |
|
Prometheus 和 Grafana 的证书由标准 Kubernetes Ingress 引用,Secret 类型为
kubernetes.io/tls。ArgoCD 未使用标准 Ingress,而是通过 Traefik CRD
IngressRoute直接引用 Secret,TLS 在入口层统一终结,后端argocd-server以 HTTP 明文运行。这些 Secret 不在 ArgoCD 的 GitOps 管理范围内,必须由运维人员手动更新。
K3s 内置的 Traefik 会监听 Secret 变更并自动热加载,更新后无需重启任何 Pod(若不生效可手动重启 Traefik)。
2. 前置条件
检查项 | 如何确认 |
|---|---|
能通过 |
|
已从腾讯云下载新的 SSL 证书(包含私钥) | 至少得到 |
证书文件已上传到服务器(建议放在统一目录) | 如 |
本地安装了 | 通常已预装 |
3. 准备证书文件
从腾讯云下载的证书压缩包文件名类似:
grafana.jiaweiwang.tech_nginx.zipprometheus.jiaweiwang.tech_nginx.zipargocd.jiaweiwang.tech_nginx.zip
解压后,每个文件夹内包含两个文件(注意是 .pem 和 .key):
grafana.jiaweiwang.tech_bundle.pem← 证书链文件(服务器证书 + 中间 CA)grafana.jiaweiwang.tech.key← 私钥
Grafanahe 和 Argocd 证书同理。
建议将所有文件复制到同一个操作目录,并保留原始文件名(避免手动重命名出错):
ssl/
├── prometheus.jiaweiwang.tech.key
├── prometheus.jiaweiwang.tech_bundle.pem
├── grafana.jiaweiwang.tech.key
├── grafana.jiaweiwang.tech_bundle.pem
├── argocd.jiaweiwang.tech.key
└── argocd.jiaweiwang.tech_bundle.pem
4. 更新操作步骤
4.1 更新 Prometheus 证书
# 1. 备份现有 Secret(可选但推荐)
kubectl get secret prometheus-tls -n monitoring -o yaml > prometheus-tls-backup-$(date +%Y%m%d).yaml
# 2. 删除旧 Secret
kubectl delete secret prometheus-tls -n monitoring
# 3. 创建新 Secret,务必使用证书链文件
kubectl create secret tls prometheus-tls \
--namespace=monitoring \
--cert=prometheus.jiaweiwang.tech_bundle.crt \
--key=prometheus.jiaweiwang.tech.key
# 4. 验证 Secret 已创建
kubectl get secret prometheus-tls -n monitoring4.2 更新 Grafana 证书
# 1. 备份现有 Secret(可选但推荐)
kubectl get secret grafana-tls -n monitoring -o yaml > grafana-tls-backup-$(date +%Y%m%d).yaml
# 2. 删除旧 Secret
kubectl delete secret grafana-tls -n monitoring --ignore-not-found
# 3. 创建新 Secret,务必使用证书链文件
kubectl create secret tls grafana-tls \
--namespace=monitoring \
--cert=grafana.jiaweiwang.tech_bundle.crt \
--key=grafana.jiaweiwang.tech.key
# 4. 验证 Secret 已创建
kubectl get secret grafana-tls -n monitoring4.3 更新 ArgoCD 证书
# 1. 备份现有 Secret(可选但推荐)
kubectl get secret argocd-tls -n monitoring -o yaml > argocd-tls-backup-$(date +%Y%m%d).yaml
# 2. 删除旧 Secret
kubectl delete secret argocd-tls -n monitoring
# 3. 创建新 Secret,务必使用证书链文件
kubectl create secret tls argocd-tls \
--namespace=argocd\
--cert=argocd.jiaweiwang.tech_bundle.crt \
--key=argocd.jiaweiwang.tech.key
# 4. 验证 Secret 已创建
kubectl get secret argocd-tls -n argocd5.验证
5.1 检查 Secret 内容是否正确
查看新证书的有效期和域名:
# Prometheus
kubectl get secret prometheus-tls -n monitoring -o jsonpath="{.data['tls\.crt']}" | base64 -d | openssl x509 -noout -dates -subject
##########################################################################
notBefore=Jul 12 00:00:00 2026 GMT
notAfter=Oct 9 23:59:59 2026 GMT
subject=CN = prometheus.jiaweiwang.tech
##########################################################################
# Grafana
kubectl get secret grafana-tls -n monitoring -o jsonpath="{.data['tls\.crt']}" | base64 -d | openssl x509 -noout -dates -subject
##########################################################################
notBefore=Jul 12 00:00:00 2026 GMT
notAfter=Oct 9 23:59:59 2026 GMT
subject=CN = grafana.jiaweiwang.tech
##########################################################################
# Argocd
kubectl get secret argocd-tls -n argocd -o jsonpath="{.data['tls\.crt']}" | base64 -d | openssl x509 -noout -dates -subject
##########################################################################
notBefore=Jul 12 00:00:00 2026 GMT
notAfter=Oct 9 23:59:59 2026 GMT
subject=CN = argocd.jiaweiwang.tech
##########################################################################输出应显示新的到期时间,且 subject 中包含对应域名。
5.2 确认 Ingress / IngressRoute 引用无误
确认 Prometheus 和 Grafana 的 Ingress 仍然指向这些 Secret:
kubectl get ingress -n monitoring -o yaml | grep -A3 secretName应该看到类似:
secretName: grafana-tls
status:
loadBalancer:
ingress:
--
secretName: prometheus-tls
status:
loadBalancer:
ingress:确认 Argocd 的 Ingressroute仍然指向这些 Secret:
kubectl get ingressroute argocd-server-https -n argocd -o yaml | grep secretName应该看到类似:
secretName: argocd-tls5.3 浏览器验证
打开 浏览器访问
https://prometheus.jiaweiwang.techhttps://grafana.jiaweiwang.techhttps://argocd.jiaweiwang.tech
点击地址栏锁图标,确认证书有效期和颁发者已更新。