目录

Kubernetes证书管理实战cert-manager部署与CRD导出

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 命名空间):

    1. cert-manager-controller:核心控制器,监听 Certificate、Issuer 等资源,触发证书签发流程;
    1. cert-manager-webhook:提供 Kubernetes API 扩展,用于证书资源的校验和 Admission Webhook;
    1. cert-manager-cainjector:自动向 Pod 注入 CA 证书,确保集群内服务信任 cert-manager 签发的证书;
  • 定制资源定义(CRD):cert-manager 通过 CRD 扩展 Kubernetes 资源,核心 CRD 包括:

    • :定义需要签发的 TLS 证书(核心 CR,本次任务涉及);
    • :命名空间级别的证书签发者(如自签 CA);
    • :集群级别的证书签发者(如 Let’s Encrypt);
    • 其他辅助 CRD(如 、 )。

二、任务一:验证 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 AGE

cert-manager-5f98d7769d-xxxx 1/1 Running 0 1d

cert-manager-cainjector-7d4f9c6b8d-xxxx 1/1 Running 0 1d

cert-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 AGE

cert-manager 1/1 1 1 1d

cert-manager-cainjector 1/1 1 1 1d

cert-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,包含 (后续任务需用到):

NAME CREATED AT

certificates.cert-manager.io 2025-09-30T08:00:00Z

certificaterequests.cert-manager.io 2025-09-30T08:00:00Z

clusterissuers.cert-manager.io 2025-09-30T08:00:00Z

issuers.cert-manager.io 2025-09-30T08:00:00Z

orders.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 自动添加标签 ,这是过滤的关键依据。

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 CRD

head ~/resources.yaml

预期结果

  • 文件存在:-rw-r–r– 1 user user 1234 Oct 1 10:00 ~/resources.yaml;

  • 内容开头包含:

NAME CREATED AT

certificates.cert-manager.io 2025-09-30T08:00:00Z

certificaterequests.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: Certificate

VERSION: cert-manager.io/v1

FIELD: subject <Object>

DESCRIPTION:

Subject contains the subject attributes of the certificate. This is used in

the CertificateRequest created by cert-manager, which is then used by the

issuer to generate the certificate.

FIELDS:

commonName <string>

CommonName is the common name (CN) of the certificate. This is typically

the domain name(s) that the certificate will be valid for.

country []string

Country is the country (C) attribute of the certificate subject.

locality []string

Locality is the locality (L) attribute of the certificate subject.

organization []string

Organization is the organization (O) attribute of the certificate subject.

organizationalUnit []string

OrganizationalUnit is the organizational unit (OU) attribute of the

certificate subject.

postalCode []string

PostalCode is the postal code (PC) attribute of the certificate subject.

province []string

Province is the province (ST) attribute of the certificate subject.

streetAddress []string

StreetAddress is the street address (STREET) attribute of the certificate

subject.

灵活处理:若需更详细的子字段文档(如 subject.organization),可执行 kubectl explain certificate.spec.subject.organization » ~/subject.yaml,题目允许任何 kubectl 支持的输出格式,默认格式即可满足要求。

五、核心知识点总结(避坑关键)

  1. CRD 与定制资源(CR)的区别
    • CRD 是 “资源定义”(如 ),相当于 “数据库表结构”;
    • CR 是 “资源实例”(如某个域名的证书配置),相当于 “数据库表中的一行数据”;
    • 本次任务二导出的是 CRD(定义),任务三操作的是 CR 的字段(实例的配置)。
  1. kubectl 默认输出格式
    • kubectl get 命令默认输出 表格格式(文本,包含 NAME、CREATED AT 等列);
    • 题目禁止 “设置输出格式”,即不可使用 -o yaml/-o json/-o custom-columns 等,仅需直接重定向输出到文件。
  1. cert-manager 标签筛选逻辑
    • 官方安装的 cert-manager 组件(Pod、Deployment、CRD)均带有标签 ,这是精准过滤的 “黄金标签”,避免误操作其他资源。
  1. 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.yaml

head ~/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}')"