需引入Cert-Manager实现TLS证书自动化管理,支持Helm、YAML、离线三种部署方式,并配置Let’s Encrypt Issuer与监控告警以保障证书生命周期可靠性。

如果您已在统信UOS上成功部署Kubernetes集群,但面临手动管理TLS证书带来的运维负担与过期风险,则需引入自动化证书管理机制。Cert-Manager是Kubernetes生态中主流的原生证书管理控制器,可在UOS环境下实现证书申请、签发、轮换与自动续期。以下是针对统信UOS平台安装并配置Cert-Manager的多种可行方法:
一、通过Helm Chart方式部署Cert-Manager
该方式适用于已安装Helm 3且具备kubectl权限的UOS环境,具有版本可控、依赖自动处理、升级便捷等优势。
1、确保Helm 3已安装并初始化,执行helm version验证输出含v3.x字样。
2、添加Jetstack官方仓库:helm repo add jetstack https://charts.jetstack.io。
3、更新本地仓库索引:helm repo update。
4、创建专用命名空间:kubectl create namespace cert-manager。
5、安装Cert-Manager核心组件(含CRD):helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.14.4 --set installCRDs=true。
6、验证Pod状态:kubectl get pods -n cert-manager,确认所有Pod处于Running状态且READY列为1/1。
二、使用静态YAML清单方式部署Cert-Manager
该方式不依赖Helm,适合离线环境或对部署过程要求完全透明的场景,所有资源定义清晰可见,便于审计与定制。
1、下载对应版本的官方清单文件:wget https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml。
2、校验文件完整性(可选但推荐):使用sha256sum cert-manager.yaml比对GitHub Release页提供的SHA256值。
3、应用清单:kubectl apply -f cert-manager.yaml。
4、等待Webhook就绪:kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=cert-manager -n cert-manager --timeout=180s。
5、验证自定义资源是否注册成功:kubectl get crd | grep cert-manager,应至少显示certificates.cert-manager.io、issuers.cert-manager.io等7个CRD。
三、在UOS离线环境中部署Cert-Manager
该方式专为无外网访问能力的统信UOS生产环境设计,所有镜像与清单均需预先拉取并导入本地镜像仓库或节点本地存储。
1、在有网络的UOS机器上执行:docker pull quay.io/jetstack/cert-manager-controller:v1.14.4、docker pull quay.io/jetstack/cert-manager-webhook:v1.14.4、docker pull quay.io/jetstack/cert-manager-cainjector:v1.14.4。
2、导出镜像为tar包:docker save quay.io/jetstack/cert-manager-controller:v1.14.4 -o cm-controller.tar,同理导出其余两个镜像。
3、将tar包拷贝至目标UOS离线节点,执行docker load -i cm-controller.tar完成加载。
4、修改cert-manager.yaml中所有镜像地址,将quay.io/jetstack/xxx替换为本地仓库地址或直接使用localhost:5000/jetstack/xxx(若已搭建私有registry)。
5、执行kubectl apply -f cert-manager.yaml,并使用kubectl describe pod -n cert-manager检查镜像拉取失败提示,确认全部使用本地镜像启动。
四、配置Let’s Encrypt Issuer并验证自动签发
部署Cert-Manager后必须定义Issuer资源,声明CA服务来源及认证方式,此处以DNS-01方式对接阿里云DNS为例,确保泛域名证书可自动颁发。
1、创建阿里云AccessKey Secret:kubectl create secret generic alidns-secret -n cert-manager --from-literal=access-key-secret=your_secret_value --from-literal=access-key-id=your_id_value。
2、编写alidns-issuer.yaml,包含ACME类型Issuer与dns01挑战配置,指定solvers使用alidns插件及Secret引用。
3、应用Issuer:kubectl apply -f alidns-issuer.yaml。
4、创建测试Certificate资源,设置dnsNames为["*.example.com"],issuerRef指向刚创建的Issuer。
5、观察事件:kubectl describe certificate -n default,确认出现Waiting for certificate to be issued及后续Certificate issued successfully状态。
6、检查生成的Secret:kubectl get secret example-tls -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text | grep 'Not After',确认有效期为90天且由Let’s Encrypt签发。
五、启用Cert-Manager自愈与监控告警集成
为保障证书生命周期管理高可靠性,需配置健康检查与异常通知机制,避免因Webhook不可用或Issuer配置错误导致证书签发中断。
1、部署Prometheus Operator(若未部署):kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/,再应用main manifests。
2、为Cert-Manager启用指标暴露:编辑cert-manager-deployment,在容器参数中添加--webhook-secure-port=10250与--metrics-addr=:9402。
3、创建ServiceMonitor资源,指向cert-manager命名空间下端口9402的Metrics服务。
4、配置Alertmanager规则,当cert_manager_certificate_expiration_timestamp_seconds{job="cert-manager"} < 604800(即剩余有效期不足7天)时触发告警。
5、部署cert-manager-webhook的Liveness Probe增强:在Deployment中添加livenessProbe.httpGet.path=/livez与port: 6443,确保Webhook进程异常时自动重启。
6、验证自愈能力:手动删除cert-manager-webhook Pod,观察新Pod是否在30秒内重建并重新就绪;同时检查正在申请的Certificate资源是否在Webhook恢复后继续完成签发流程。

















