Kubernetes证书管理实战:cert-manager部署与CRD导出
cert-manager 部署验证与资源导出实战:从基础到实操
在 Kubernetes 集群中,cert-manager 是一款核心的证书管理工具,能够自动完成 TLS 证书的签发、续期与轮换,支持 Let's Encrypt、HashiCorp Vault 等多种证书源。本文将围绕 “验证 cert-manager 部署”“导出 CRD 列表”“提取 Certificate 字段文档” 三大核心任务,拆解操作步骤、讲解底层知识点,并规避题目中的失分风险。
一、前置认知:cert-manager 核心概念与组件
在实操前,需先明确 cert-manager 的核心构成,这是后续验证和操作的基础:
- 核心功能:自动化 TLS 证书生命周期管理,解决手动申请、续期证书的繁琐问题;
- 核心组件(默认部署在 cert-manager 命名空间):
-
- cert-manager-controller:核心控制器,监听 Certificate、Issuer 等资源,触发证书签发流程;
-
- cert-manager-webhook:提供 Kubernetes API 扩展,用于证书资源的校验和 Admission Webhook;
-
- cert-manager-cainjector:自动向 Pod 注入 CA 证书,确保集群内服务信任 cert-manager 签发的证书;
- 定制资源定义(CRD):cert-manager 通过 CRD 扩展 Kubernetes 资源,核心 CRD 包括:
-
- certificates.cert-manager.io:定义需要签发的 TLS 证书(核心 CR,本次任务涉及);
-
- issuers.cert-manager.io:命名空间级别的证书签发者(如自签 CA);
-
- clusterissuers.cert-manager.io:集群级别的证书签发者(如 Let's Encrypt);
-
- 其他辅助 CRD(如 certificaterequests.cert-manager.io、orders.cert-manager.io)。
二、任务一:验证 cert-manager 部署有效性
在执行资源导出前,必须先确认 cert-manager 已正常部署,否则后续操作会因 CRD 缺失或组件异常失败。验证步骤分 3 步:
2.1 检查 cert-manager 命名空间与组件状态
cert-manager 默认部署在 cert-manager 命名空间(若自定义命名空间,需替换对应名称),先检查该命名空间是否存在,再确认核心 Pod 状态:
# 1. 检查 cert-manager 命名空间是否存在kubectl get ns | grep cert-manager# 2. 检查核心 Pod 是否均为 Running 状态(3个组件缺一不可)kubectl get pod -n cert-manager
预期结果:
- 命名空间输出:cert-manager Active 1d(Active 表示正常);
- Pod 输出(3 个 Pod 均为 Running):
NAME READY STATUS RESTARTS AGEcert-manager-5f98d7769d-xxxx 1/1 Running 0 1dcert-manager-cainjector-7d4f9c6b8d-xxxx 1/1 Running 0 1dcert-manager-webhook-587f6d765-xxxx 1/1 Running 0 1d
排查点:若 Pod 处于 Pending/Error 状态,需检查资源是否充足(kubectl describe pod <pod名> -n cert-manager)、镜像是否拉取成功。
2.2 检查 cert-manager Deployment 状态
Deployment 是 Pod 的控制器,确保 Pod 按预期运行,检查 Deployment 状态:
kubectl get deploy -n cert-manager
预期结果:3 个 Deployment 的 READY 列均为 1/1(表示期望副本数 = 运行副本数):
NAME READY UP-TO-DATE AVAILABLE AGEcert-manager 1/1 1 1 1dcert-manager-cainjector 1/1 1 1 1dcert-manager-webhook 1/1 1 1 1d
2.3 检查 cert-manager CRD 是否存在
CRD 是 cert-manager 功能的基础,需确认其核心 CRD 已创建:
# 过滤 cert-manager 相关的 CRD(通过标签筛选,避免获取所有集群 CRD)kubectl get crd -l app.kubernetes.io/name=cert-manager
预期结果:输出 5 个左右 cert-manager 相关 CRD,包含 certificates.cert-manager.io(后续任务需用到):
NAME CREATED ATcertificates.cert-manager.io 2025-09-30T08:00:00Zcertificaterequests.cert-manager.io 2025-09-30T08:00:00Zclusterissuers.cert-manager.io 2025-09-30T08:00:00Zissuers.cert-manager.io 2025-09-30T08:00:00Zorders.cert-manager.io 2025-09-30T08:00:00Z
三、任务二:导出 cert-manager CRD 列表到~/resources.yaml
题目要求:使用 kubectl 默认输出格式,将 cert-manager 所有 CRD 列表保存到~/resources.yaml,核心是 “精准过滤 cert-manager CRD” 和 “不自定义输出格式”。
3.1 关键理解:为何要过滤 CRD?
Kubernetes 集群中可能存在其他组件的 CRD(如 Prometheus、Istio),若直接执行 kubectl get crd > ~/resources.yaml,会包含无关 CRD,不符合 “cert-manager 所有 CRD” 的要求。因此必须通过标签筛选精准定位 cert-manager 的 CRD。
cert-manager 安装时会为所有 CRD 自动添加标签 app.kubernetes.io/name=cert-manager,这是过滤的关键依据。
3.2 执行导出命令
# 命令解析:# 1. kubectl get crd:获取所有 CRD 资源# 2. -l app.kubernetes.io/name=cert-manager:过滤 cert-manager 相关 CRD# 3. > ~/resources.yaml:将输出保存到 ~/resources.yaml(默认输出格式)kubectl get crd -l app.kubernetes.io/name=cert-manager > ~/resources.yaml
3.3 验证导出结果
确保文件已生成且内容正确:
# 1. 检查文件是否存在ls -l ~/resources.yaml# 2. 查看文件前几行,确认包含 cert-manager CRDhead ~/resources.yaml
预期结果:
- 文件存在:-rw-r--r-- 1 user user 1234 Oct 1 10:00 ~/resources.yaml;
- 内容开头包含:
NAME CREATED ATcertificates.cert-manager.io 2025-09-30T08:00:00Zcertificaterequests.cert-manager.io 2025-09-30T08:00:00Z
失分点规避:切勿添加 -o yaml/-o json 等自定义输出格式,题目明确要求 “使用 kubectl 默认输出格式”(默认是表格格式,保存到文件后为文本表格,符合要求)。
四、任务三:提取 Certificate subject 规范文档到~/subject.yaml
题目要求:使用 kubectl 提取定制资源 Certificate 的 subject 规范字段文档,保存到~/subject.yaml,核心是掌握 kubectl explain 命令(用于查看资源字段的说明文档)。
4.1 关键认知:Certificate 资源与 subject 字段
- Certificate 是 cert-manager 的核心 CR(定制资源),用于定义 “需要签发的 TLS 证书”,其资源名称为 certificates(复数),shortname 为 cert;
- subject 字段位于 Certificate.spec 下,用于定义 TLS 证书的 “主题信息”(如 Common Name、Organization、Country 等),是证书签发的关键配置。
4.2 执行提取命令
使用 kubectl explain 查看 certificate.spec.subject 的文档,并保存到文件:
# 命令解析:# 1. kubectl explain:查看资源字段的说明文档# 2. certificate.spec.subject:字段路径(资源名.层级.目标字段)# 3. > ~/subject.yaml:将文档保存到目标文件kubectl explain certificate.spec.subject > ~/subject.yaml
4.3 验证提取结果
查看文件内容,确认包含 subject 字段的详细说明:
cat ~/subject.yaml
预期结果:文件包含字段类型、描述、子字段(如 commonName、organization)的说明:
KIND: CertificateVERSION: cert-manager.io/v1FIELD: subject <Object>DESCRIPTION:Subject contains the subject attributes of the certificate. This is used inthe CertificateRequest created by cert-manager, which is then used by theissuer to generate the certificate.FIELDS:commonName <string>CommonName is the common name (CN) of the certificate. This is typicallythe domain name(s) that the certificate will be valid for.country []stringCountry is the country (C) attribute of the certificate subject.locality []stringLocality is the locality (L) attribute of the certificate subject.organization []stringOrganization is the organization (O) attribute of the certificate subject.organizationalUnit []stringOrganizationalUnit is the organizational unit (OU) attribute of thecertificate subject.postalCode []stringPostalCode is the postal code (PC) attribute of the certificate subject.province []stringProvince is the province (ST) attribute of the certificate subject.streetAddress []stringStreetAddress is the street address (STREET) attribute of the certificatesubject.
灵活处理:若需更详细的子字段文档(如 subject.organization),可执行 kubectl explain certificate.spec.subject.organization >> ~/subject.yaml,题目允许任何 kubectl 支持的输出格式,默认格式即可满足要求。
五、核心知识点总结(避坑关键)
- CRD 与定制资源(CR)的区别:
-
- CRD 是 “资源定义”(如 certificates.cert-manager.io),相当于 “数据库表结构”;
-
- CR 是 “资源实例”(如某个域名的证书配置),相当于 “数据库表中的一行数据”;
-
- 本次任务二导出的是 CRD(定义),任务三操作的是 CR 的字段(实例的配置)。
- kubectl 默认输出格式:
-
- kubectl get 命令默认输出 表格格式(文本,包含 NAME、CREATED AT 等列);
-
- 题目禁止 “设置输出格式”,即不可使用 -o yaml/-o json/-o custom-columns 等,仅需直接重定向输出到文件。
- cert-manager 标签筛选逻辑:
-
- 官方安装的 cert-manager 组件(Pod、Deployment、CRD)均带有标签 app.kubernetes.io/name=cert-manager,这是精准过滤的 “黄金标签”,避免误操作其他资源。
- kubectl explain 命令用法:
-
- 语法:kubectl explain <资源名>.<层级1>.<层级2>.<目标字段>;
-
- 作用:查看任何 Kubernetes 资源(包括 CR)的字段说明,解决 “不知道字段怎么配置” 的问题,是运维必备工具。
六、常见问题与排查方案
问题现象 | 可能原因 | 解决方案 |
执行 kubectl get crd -l... 无输出 | 1. cert-manager 未安装;2. 标签错误(如自定义安装时未加默认标签) | 1. 重新安装 cert-manager;2. 用 `kubectl get crd |
执行 kubectl explain certificate.spec.subject 报错 “error: could not find resource type for "certificate"” | Certificate CRD 未部署或未就绪 | 1. 检查 CRD:kubectl get crd certificates.cert-manager.io;2. 若不存在,重启 cert-manager 控制器:kubectl rollout restart deploy cert-manager -n cert-manager |
~/resources.yaml 包含非 cert-manager CRD | 未加标签筛选,直接执行了 kubectl get crd > ~/resources.yaml | 删除文件,重新执行带 -l 标签的命令 |
七、操作文档整理(直接复用)
为方便实际操作,整理以下可直接复制的文档:
cert-manager 验证与资源导出操作文档
1. 验证 cert-manager 部署
# 1.1 检查命名空间kubectl get ns | grep cert-manager# 1.2 检查核心 Pod 状态kubectl get pod -n cert-manager# 1.3 检查 Deployment 状态kubectl get deploy -n cert-manager# 1.4 检查 CRD 存在性kubectl get crd -l app.kubernetes.io/name=cert-manager
2. 导出 cert-manager CRD 列表到~/resources.yaml
kubectl get crd -l app.kubernetes.io/name=cert-manager > ~/resources.yaml# 验证结果ls -l ~/resources.yamlhead ~/resources.yaml
3. 提取 Certificate subject 规范文档到~/subject.yaml
kubectl explain certificate.spec.subject > ~/subject.yaml# 验证结果cat ~/subject.yaml
4. 最终确认(可选)
# 确认两个文件均存在且非空echo "resources.yaml 大小:$(du -sh ~/resources.yaml | awk '{print $1}')"echo "subject.yaml 大小:$(du -sh ~/subject.yaml | awk '{print $1}')"