K3s导出证书
在K3s集群环境中,TLS/SSL证书是保障服务通信安全的核心基础设施,无论是对外提供HTTPS服务的公网域名证书,还是内网私有服务所用的自签名证书,都需要一套规范、高效的全生命周期管理方案。本文将从手动证书管理的基础操作切入,逐步深入至基于cert-manager的自动化管理实践,全面覆盖证书生成、部署、续签、轮换等关键环节,帮助开发者与运维人员高效管控K3s集群中的证书资源,筑牢集群通信安全防线。
一、手动管理证书:基础操作与适用场景
手动管理证书适用于证书数量少、变更频率低、场景临时的场景(如内网测试、短期验证),其核心操作主要分为「证书生成」与「集群导入」两个关键步骤,操作简单且无需依赖额外组件。
1.1 生成证书
自签名证书是内网测试、私有服务场景的首选,可通过OpenSSL工具快速生成,生成后将获得两个核心文件:私钥文件(如example.io.key)和证书文件(如example.io.crt),具体生成步骤可参考OpenSSL生成自签名证书。
1.2 导入证书到K3s
K3s集群中,TLS类型的Secret是标准的证书存储载体,需将生成的证书文件导入至Secret中,方可被Ingress、Service等资源引用。执行以下命令即可完成导入操作:
1 | kubectl create secrets tls example-io-tls --key example.io.key --cert example.io.crt |
导入完成后,可在Ingress规则或Service配置中直接引用该Secret,快速实现服务的HTTPS访问配置。
注意:手动管理证书存在明显局限,需人工实时关注证书过期时间,且无法实现自动续签,一旦遗漏续签可能导致服务中断,仅建议在临时测试、小规模场景中使用。
二、cert-manager:K3s证书自动化管理核心工具
cert-manager作为Kubernetes生态中主流的证书管理组件,具备自动签发、自动续签、多证书类型兼容等核心优势,支持Let’s Encrypt(公网免费证书)、自签名CA、自定义CA等多种签发来源,能够完美适配K3s集群的轻量化特性,是生产环境中K3s证书管理的首选方案,可大幅降低运维成本并提升证书管理的安全性与可靠性。
2.1 部署cert-manager
推荐使用Helm部署cert-manager,该方式支持自定义配置、版本管控与后续升级,也可通过kubectl快速部署以满足快速上手需求,两种部署方式详细步骤如下:
方式一:Helm部署(推荐)
1 | # 添加jetstack镜像源(cert-manager官方仓库,确保资源拉取稳定性) |
方式二:kubectl部署(快速上手)
根据Kubernetes版本选择对应部署文件,K3s默认版本通常满足1.16+要求,具体命令如下:
1 | # Kubernetes 1.16+(K3s默认版本适配) |
部署完成后,可通过以下命令验证组件运行状态,所有Pod均处于Running状态即表示部署成功:
1 | kubectl get pods -n cert-manager |
2.2 创建签发机构(ClusterIssuer/Issuer)
cert-manager通过「签发机构(Issuer/ClusterIssuer)」定义证书的签发规则与来源,两者的核心区别在于作用范围:
Issuer:仅作用于当前命名空间,适用于单一命名空间内的证书管理场景;
ClusterIssuer:全局生效,可跨所有命名空间使用,适用于集群级别的统一证书管理,推荐在K3s集群中优先使用。
2.2.1 公网域名证书:Let’s Encrypt签发
Let’s Encrypt提供免费的公网SSL证书,支持测试环境(staging)和生产环境(prod)两种模式:测试环境无速率限制,适合前期验证配置;生产环境有严格的速率限制,需测试通过后再切换使用,避免触发限制导致证书签发失败。
(1)测试环境ClusterIssuer(letsencrypt-issuer-staging.yaml)
1 | apiVersion: cert-manager.io/v1 |
(2)生产环境ClusterIssuer(letsencrypt-issuer-prod.yaml)
1 | apiVersion: cert-manager.io/v1 |
核心配置说明:
spec.acme.solvers.http01:采用HTTP-01验证方式,用于证明域名归属权,适用于公网可访问的域名;若域名无法直接暴露公网,可选择DNS验证方式,适配更多场景;spec.acme.server:Let’s Encrypt的ACME协议服务端地址,测试环境与生产环境地址不同,不可混淆使用;生产环境速率限制:每个注册域名每周最多签发50张证书,每个精确域名组合每周最多签发5张证书,单账号每3小时最多创建300个新订单,需合理规划证书签发策略,避免触发限制。
2.2.2 内网场景:自签名证书签发
内网服务无需公网域名验证,可通过自签名ClusterIssuer快速生成证书,满足内网服务的HTTPS通信需求,配置文件(selfsigned-issuer.yaml)如下:
1 | apiVersion: cert-manager.io/v1 |
若集群已存在自定义根CA证书,可先将其导入至Secret中,再修改ClusterIssuer配置引用该CA,实现基于自定义CA的证书签发:
1 | # 导入自定义根CA证书(替换为实际的CA私钥与证书文件路径) |
1 | apiVersion: cert-manager.io/v1 |
补充说明:K3s默认会在首个Server节点启动时生成自签名CA证书,该CA证书有效期为10年,且不会自动更新,若需轮换CA证书,可使用k3s certificate rotate-ca命令执行轮换操作,确保CA证书的安全性。
2.3 创建域名证书
完成签发机构(ClusterIssuer/Issuer)配置后,通过cert-manager的Certificate资源定义具体的域名证书规则,cert-manager会自动根据规则向指定签发机构申请证书,并将签发成功的证书存储到指定Secret中,全程无需人工干预。
示例:公网域名证书(example-io-tls.yaml)
1 | apiVersion: cert-manager.io/v1 |
应用配置文件,cert-manager将自动启动证书签发流程:
1 | kubectl apply -f example-io-tls.yaml |
可通过以下命令查看证书签发状态,当Ready字段为True时,表示证书签发成功,可正常使用:
1 | kubectl get certificates |
三、生产环境最佳实践
结合cert-manager官方安全规范与K3s集群特性,总结以下生产环境证书管理最佳实践,兼顾安全性、可维护性与易用性,适配企业级集群部署需求:
1. 命名空间隔离,降低安全风险
将CA证书、ClusterIssuer等核心证书资源部署在独立命名空间(如cert-manager-ca),与业务命名空间严格隔离;同时配置最小权限的网络策略(如使用Calico),禁止非信任客户端访问cert-manager组件,限制cert-manager仅能与Kubernetes API Server、指定签发机构通信,遵循“最小权限”原则,降低权限泄露风险。
2. CA证书规范管理,避免全链路失效
自定义CA证书需定期手动更新,建议建立CA证书过期提醒机制,避免根证书过期导致集群内所有依赖该CA的证书失效;若使用K3s默认自签名CA,需定期通过k3s certificate rotate-ca命令轮换CA证书,确保CA证书的安全性;此外,自定义CA证书需按规范放置在/var/lib/rancher/k3s/server/tls目录下,确保K3s集群正常识别。
3. 启用Ingress自动签发,减少手动配置
利用cert-manager的ingress-shim功能,在Ingress资源中添加指定注解(如cert-manager.io/cluster-issuer: letsencrypt-prod),即可实现证书的自动签发与绑定,无需手动创建Certificate资源,大幅减少运维配置工作量;同时可结合kubernetes-reflector项目,实现Certificate生成的Secret跨命名空间自动同步,适配多命名空间业务场景。
4. 合理选择验证方式,兼顾安全与易用
公网域名优先使用DNS验证方式,无需将服务直接暴露到公网,更适合内网部署但需对外提供HTTPS服务的场景;内网域名无需公网验证,优先使用自签名CA,简化配置流程的同时保障内网通信安全;对于多域名场景,可在单张证书中绑定多个域名(最多100个),提升管理效率,但需注意控制域名数量,避免影响性能。
5. 证书轮换与故障排查
K3s客户端和服务器证书默认有效期为365天,每次启动K3s时,已过期或90天内过期的证书会自动更新;若需手动轮换单个或多个证书,可使用k3s certificate rotate --service <SERVICE>命令(支持轮换admin、api-server、kubelet等多种证书);cert-manager签发的证书若出现签发失败,可通过kubectl describe certificates <证书名称>查看详细日志,定位故障原因(如域名验证失败、速率限制触发等)。
四、总结
K3s证书管理的核心是“场景化选择适配方案”:手动管理适用于临时测试、小规模场景,操作简单但运维成本高;cert-manager自动化管理适用于生产环境,可实现证书的自动签发、续签、轮换,大幅降低运维成本,同时保障集群通信安全,是企业级K3s集群的最优选择。
在实际部署中,需结合业务场景选择合适的证书类型与签发方式:公网场景优先使用Let’s Encrypt免费证书,严格遵循速率限制;内网场景优先使用自签名CA或自定义CA,兼顾配置简化与安全;同时遵循生产环境最佳实践,通过命名空间隔离、最小权限配置、自动签发等方式,实现证书的全生命周期规范化管理,为K3s集群的稳定运行提供安全保障。
参考资料
cert-manager官方文档:https://cert-manager.io/docs/
Let’s Encrypt ACME协议说明:https://letsencrypt.org/docs/acme-protocol/
K3s Traefik Ingress配置:https://docs.k3s.io/networking/traefik
K3s证书管理官方文档:https://docs.k3s.io/zh/cli/certificate
cert-manager生产环境最佳实践:https://cert-manager.io/v1.17-docs/installation/best-practice/
1 | # 导出根证书 |
导出Secret
1 | kubectl get secret example-secret -o yaml > example-secret.yaml |
导出内容格式如下
1 | apiVersion: v1 |
Base64解码
1 | # cert |