当前位置: 首页 > news >正文

Cert-Manager 安装与配置文档

Cert-Manager 安装与配置文档

本文档介绍如何在 Kubernetes 集群中安装和配置 Cert-Manager,用于自动管理 TLS 证书(支持 Let’s Encrypt)。

一、安装 Helm(如已安装可跳过)

# 下载安装脚本curl-fsSL-oget_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3# 赋予执行权限chmod700get_helm.sh# 执行安装./get_helm.sh# 验证安装helm version

二、添加 Cert-Manager 仓库

# 添加 Jetstack 仓库helm repoaddjetstack https://charts.jetstack.io# 更新本地仓库缓存helm repo update# (可选) 搜索可用的 chart 版本helm search repo cert-manager-l

三、下载 Chart 包(可选)

# 指定版本下载 Chart 包helm pull jetstack/cert-manager--versionv1.20.2# 解压 Chart 包(如需本地修改配置)tar-zxvfcert-manager-v1.20.2.tgzcdcert-manager

四、安装 Cert-Manager

基础安装命令

helminstallcert-manager jetstack/cert-manager\--namespacecert-manager\--create-namespace\--versionv1.20.2\--setinstallCRDs=true

使用国内镜像代理安装(推荐 测试失败,建议使用基础安装命令,后期再补充正确地址)

helminstallcert-manager jetstack/cert-manager\--namespacecert-manager\--create-namespace\--versionv1.20.2\--setinstallCRDs=true\--setimage.repository=k8s.m.daocloud.io/quay.io/jetstack/cert-manager-controller\--setwebhook.image.repository=k8s.m.daocloud.io/quay.io/jetstack/cert-manager-webhook\--setcainjector.image.repository=k8s.m.daocloud.io/quay.io/jetstack/cert-manager-cainjector\--setstartupapicheck.image.repository=k8s.m.daocloud.io/quay.io/jetstack/cert-manager-ctl

验证安装

# 查看 Pod 状态kubectl get pods-ncert-manager# 等待所有 Pod 状态变为 Runningkubectlwait--for=condition=ready pod-lapp.kubernetes.io/name=cert-manager-ncert-manager--timeout=300s

五、配置 ClusterIssuer(Let’s Encrypt)

Cert-Manager 支持多种域名所有权验证方式,最常用的是HTTP-01DNS-01

  • HTTP-01:配置简单,但要求域名必须能够被公网访问(开放 80 端口),不支持泛域名证书。
  • DNS-01:不需要公网访问网站,支持内网环境,支持泛域名证书(如*.aioil.top),但需要配置 DNS 服务商的 API 密钥。

请根据你的实际情况选择以下其中一种方式进行配置。

方式一:使用 HTTP-01 挑战验证(单域名证书)

创建cluster-issuer-http01.yaml文件:

apiVersion:cert-manager.io/v1kind:ClusterIssuermetadata:name:letsencrypt-prod-http01spec:acme:# Let's Encrypt 生产环境地址server:https://acme-v02.api.letsencrypt.org/directory# 用于接收证书过期通知的邮箱email:xxx@hotmail.com# 用于存储 ACME 账户私钥的 SecretprivateKeySecretRef:name:letsencrypt-prod-http01# 使用 HTTP-01 挑战验证域名所有权# ⚠️ 重要提示:使用 HTTP-01 验证方式时,必须满足以下条件:# 1. 提前在 DNS 服务商处配置好域名的 A 记录,指向你的 Ingress 节点的公网 IP。# 2. 确保 Let's Encrypt 的服务器可以通过公网(80 端口)访问到该节点。solvers:-http01:ingress:class:nginx# 使用 nginx Ingress Controller

应用配置:

kubectl apply-fcluster-issuer-http01.yaml

方式二:使用 DNS-01 挑战验证(以阿里云 DNS 为例)

如果你使用的是阿里云 DNS,可以通过部署 webhook 来实现自动化 DNS 验证。

1. 部署 alidns-webhook

alidns-webhook负责处理与阿里云 DNS API 的交互逻辑。

# 添加并更新 helm 仓库helm repoaddcert-manager-alidns-webhook https://devmachine-fr.github.io/cert-manager-alidns-webhook helm repo update# 安装 webhookhelminstallalidns-webhook cert-manager-alidns-webhook/alidns-webhook\--namespacecert-manager\--create-namespace\--setgroupName=aioil.top# ⚠️ 注意:此处的 groupName 必须与 ClusterIssuer 配置中的 groupName 严格一致

如果网络不好,可以下载 Helm 包进行离线安装:

wgethttps://github.com/DEVmachine-fr/cert-manager-alidns-webhook/releases/download/alidns-webhook-0.8.3/alidns-webhook-0.8.3.tgztarxvf alidns-webhook-0.8.3.tgzcdalidns-webhook helminstallalidns-webhook.\--namespacecert-manager\--create-namespace\--setgroupName=aioil.top

注:groupName确保了 Cert-Manager 知道将验证任务转发给哪个 Webhook 处理。

2. 配置阿里云 DNS 权限

获取阿里云具有AliyunDNSFullAccess权限的 RAM 用户 AccessKey ID 和 Secret。
(⚠️ 安全警告:请遵循最小权限原则,并在 K8s Secret 中妥善保管。)

可以先将密钥进行 Base64 编码:

echo-n"你的AccessKeyID"|base64echo-n"你的AccessKeySecret"|base64

创建alidns-secret.yaml

apiVersion:v1kind:Secretmetadata:name:alidns-secretsnamespace:cert-managertype:Opaquedata:# 填入上述 base64 编码后的值access-token:<BASE64_ACCESS_KEY_ID>secret-key:<BASE64_ACCESS_KEY_SECRET>

应用 Secret:

kubectl apply-falidns-secret.yaml
3. 创建 DNS-01 ClusterIssuer

创建cluster-issuer-dns01.yaml文件:

apiVersion:cert-manager.io/v1kind:ClusterIssuermetadata:name:letsencrypt-prod-dnsspec:acme:email:xxx@hotmail.comserver:https://acme-v02.api.letsencrypt.org/directoryprivateKeySecretRef:name:letsencrypt-prod-dnssolvers:-dns01:webhook:config:accessTokenSecretRef:key:access-tokenname:alidns-secretsregionId:cn-beijingsecretKeySecretRef:key:secret-keyname:alidns-secrets# groupName 必须与 webhook 部署时配置的 groupName 一致groupName:aioil.topsolverName:alidns-solver

应用配置:

kubectl apply-fcluster-issuer-dns01.yaml

验证 ClusterIssuer 配置

# 查看所有 ClusterIssuerkubectl get clusterissuer# 查看 HTTP-01 ClusterIssuer 详细信息及状态(若配置了方式一)kubectl describe clusterissuer letsencrypt-prod-http01 kubectl get clusterissuer letsencrypt-prod-http01-owide# 查看 DNS-01 ClusterIssuer 详细信息及状态(若配置了方式二)kubectl describe clusterissuer letsencrypt-prod-dns kubectl get clusterissuer letsencrypt-prod-dns-owide

六、测试 HTTPS 配置

1. 创建测试应用

创建my-nginx.yaml文件:

apiVersion:apps/v1kind:Deploymentmetadata:name:my-nginxspec:selector:matchLabels:run:my-nginxreplicas:2template:metadata:labels:run:my-nginxspec:containers:-name:my-nginximage:nginx:latestresources:limits:memory:"128Mi"cpu:"500m"ports:-containerPort:80---apiVersion:v1kind:Servicemetadata:name:nginx-servicespec:selector:run:my-nginxtype:ClusterIPports:-protocol:TCPport:8080targetPort:80

2. 独立申请 Certificate 证书(推荐)

不再依赖 Ingress 的 annotation 自动申请,而是提前创建一个独立的Certificate资源,这样可以方便地管理泛域名证书。

创建certificate-aioil.yaml文件:

apiVersion:cert-manager.io/v1kind:Certificatemetadata:name:aioil-top-tlsspec:secretName:aioil-top-tlscommonName:aioil.topdnsNames:-aioil.top-"*.aioil.top"issuerRef:name:letsencrypt-prod-dnskind:ClusterIssuer

应用并查看证书状态:

kubectl apply-fcertificate-aioil.yaml kubectl describe certificate aioil-top-tls

3. 创建支持 HTTPS 的 Ingress

这里提供两种配置 Ingress 的方式,请根据你的需求选择:

方式 A:直接引用独立证书(适用于 DNS-01 泛域名证书)

创建example-ingress.yaml文件,直接引用刚刚生成的aioil-top-tls证书:

apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target:/$1spec:ingressClassName:nginxtls:-hosts:-nginx.aioil.topsecretName:aioil-top-tls# ✅ 直接用已有证书,无需 cert-manager.io/cluster-issuer 自动申请rules:-host:nginx.aioil.tophttp:paths:-path:/pathType:Prefixbackend:service:name:nginx-serviceport:number:8080
方式 B:通过 Ingress 自动申请证书(适用于 HTTP-01 或自动按需申请)

如果你没有提前创建独立的Certificate资源,可以通过 Ingress 的 annotation 触发 Cert-Manager 自动签发证书。创建example-ingress-auto.yaml文件:

apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:example-ingress-autoannotations:# 启用 Cert-Manager 自动颁发证书# ⚠️ 注意:指定你创建的 ClusterIssuer 的名称(如果是 HTTP-01 则填写 letsencrypt-prod-http01,如果是 DNS-01 则填写 letsencrypt-prod-dns)cert-manager.io/cluster-issuer:"letsencrypt-prod-http01"nginx.ingress.kubernetes.io/rewrite-target:/$1spec:ingressClassName:nginxtls:-hosts:-nginx.aioil.top# 你的域名secretName:nginx.aioil.top-tls# 自动生成的证书将会保存在这个 Secret 中rules:-host:nginx.aioil.tophttp:paths:-path:/pathType:Prefixbackend:service:name:nginx-serviceport:number:8080

4. 应用配置并验证

# 部署测试应用和 Ingresskubectl apply-fmy-nginx.yaml kubectl apply-fexample-ingress.yaml# 查看证书申请状态kubectl get certificate-ndefault kubectl describe certificate aioil-top-tls# 查看证书 Secretkubectl get secret aioil-top-tls# 验证证书自动续期机制# 查看输出中的 Not After (过期时间) 和 Renewal Time (计划续期时间)kubectl describe certificate aioil-top-tls-ndefault# 示例输出(关键部分):# ...# Not After: 2026-08-17T13:06:43Z# Not Before: 2026-05-19T13:06:44Z# Renewal Time: 2026-07-18T13:06:43Z# Revision: 1# ...# 上述输出表明:Cert-Manager 将在证书到期前自动发起证书更新。# 测试 HTTPS 访问(将 nginx.aioil.top 解析到 Ingress 节点 IP)curl-vhttps://nginx.aioil.top

七、签发状态追踪与故障排查

Cert-manager 的签发流程是多步的,涉及Certificate->CertificateRequest->Order->Challenge。需要追踪这些中间状态进行排查。

1. 追踪证书签发流程

使用kubectl describe是最强大的追踪工具。

步骤 1: 检查 Certificate 状态

检查是否成功引用了 Issuer,以及是否创建了请求。

kubectl describe certificate aioil-top-tls-ndefault

关注EventsStatus.Conditions。如果一切正常,它会显示Ready: False,然后是创建CertificateRequest的事件。

步骤 2: 检查 CertificateRequest (CR)

CR 是 Cert-manager 发起的实际请求。

kubectl describe certificaterequest-ndefault

CR 会引用一个Order

步骤 3: 检查 Order (订单)

Order资源代表与 ACME 服务器(Let’s Encrypt)协商签发证书的订单。

kubectl describe order-ndefault

关注Status.State。订单状态会从pending变为readyvalid。如果卡在pending,通常是因为挑战尚未完成。

步骤 4: 检查 Challenge (挑战)

Challenge资源描述了具体的验证方法(此处为 DNS-01)。这是 Cert-manager 与 Webhook 交互的关键点。

kubectl describe challenge-ndefault

如果挑战状态显示Presenting,则说明 Cert-manager 已经将请求转发给 alidns-webhook,要求它去创建 TXT 记录。

2. 查看日志进行故障排查

如果挑战卡住或失败,我们需要检查两个关键 Pod 的日志:

A. Cert-manager Controller 日志:
确认 Cert-manager 是否正确处理了资源对象,以及与 ACME 服务器的通信是否正常。

kubectl logs-f-ncert-manager deploy/cert-manager--tail100

B. alidns-webhook 日志:
检查 Webhook 是否接收到了挑战请求,以及它调用阿里云 DNS API 时是否遇到了鉴权或网络错误。

kubectl logs-f-ncert-manager deploy/alidns-webhook--tail100

例如,如果 alidns-webhook 日志中出现类似ForbiddenInvalidAccessKeyId,则说明alidns-secrets中的凭证是错误的或权限不足。如果看到成功添加 TXT 记录的日志,则挑战很快会完成。

3. 验证最终 Secret

Certificate资源的Ready状态变为True时,证书签发成功。

kubectl get secret aioil-top-tls-ndefault# 验证 Secret 中包含 tls.crt, tls.key 等字段

通过这一套流程,我们成功地将证书管理从人工干预中解耦出来,实现了 K8s 证书的自动化生命周期管理。

八、其他常见问题

1. 证书申请一直处于 Pending 状态

# 查看 Certificate 详情kubectl describe certificate aioil-top-tls# 查看 Challenge 状态(HTTP-01 验证)kubectl get challenges kubectl describe challenge<challenge-name># 常见原因:# 1. 域名未解析到 Ingress 节点 IP (HTTP-01)# 2. Ingress Controller 未正确配置 (HTTP-01)# 3. Webhook 权限配置错误 (DNS-01)

2. 证书过期未自动续期

# 检查 cert-manager Pod 日志kubectl logs-ncert-manager deployment/cert-manager# 手动触发续期(删除 Certificate 的 Secret 会自动重建)kubectl delete secret aioil-top-tls-ndefault# 或使用 annotations 强制触发轮换(推荐方式)kubectl annotate certificate aioil-top-tls-ndefault cert-manager.io/force-renewal=true--overwrite

3. 国内镜像拉取失败

# 检查镜像是否正确拉取crictl images|grepcert-manager# 如果未拉取,手动拉取镜像crictl pull k8s.m.daocloud.io/quay.io/jetstack/cert-manager-controller:v1.20.2# 重新打标签crictl tag k8s.m.daocloud.io/quay.io/jetstack/cert-manager-controller:v1.20.2 quay.io/jetstack/cert-manager-controller:v1.20.2

http://www.jsqmd.com/news/860557/

相关文章:

  • 2026年福州汽车贴膜合规资质权威测评:4家主流门店横向对比,附避坑指南与选型推荐 - GrowthUME
  • 巨亏47亿,市值5000亿:拆解智谱AI的定价逻辑
  • 2026杭州GEO优化公司权威评测:五大厂商横向对比,避坑选型必读 - qq150194
  • 2026 全国高端整合营销公司权威榜单:十大整合营销服务商真实能力横评与选型指南 - GEO优化
  • 【原理实战】OpenClaw Memory 系统:从“多记一点“到“治理层“的演进
  • 学习大模型RAG与Agent智能体基础知识day1
  • 2025.12.18海南封关运作后,内地老板为何扎堆来注册公司?2026年海南注册公司代理记账靠谱财税机构排行榜单 - GrowthUME
  • 2026 年上海 GEO 优化公司权威榜单:全意图 GEO 驱动品牌魔都增长战略指南 - GEO优化
  • VS 2022教程VsCode技巧(创建C语言程序)
  • 为OpenClaw智能体工作流配置Taotoken作为稳定的模型供应后端
  • 2026年美容抗衰仪器价格指南:U.SUN时光梭如何实现全民抗衰普及? - GrowthUME
  • Amphenol ICC DRPC51A009A40线束组件详解与替代方案
  • 【限时解密】Midjourney毛发质感生成私藏Prompt库:仅剩87组未公开高保真指令(含犬科/灵长类/昆虫刚毛专用模板)
  • 紧急预警:拟态风格版权灰区已扩大!——2024最新欧盟AI生成物合规白皮书+5步规避侵权风险实操清单
  • 2026天津市北辰区家政公司权威榜单:口碑好又专业的TOP机构揭秘 - GrowthUME
  • VLA已死,WAM当立:机器人的GPT时刻到了吗?
  • TraceML:用三行代码为训练循环加入 step 级诊断
  • 大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C#版)
  • 解锁凋亡调控密码:核心蛋白与信号通路全景解析
  • 【Midjourney范戴克印相终极指南】:20年影像工艺专家首度公开AI胶片化调色黄金参数(含7组不可复制的v6提示词矩阵)
  • 30天学会AI工程师|Day 13:Tool Calling 不是高级玩法,它是 Agent 开始有手脚的那一步
  • OpenClaw(小龙虾AI)Windows一键部署包v2.7.5|零代码+可视化操作
  • 读懂数据结构:计算机存储数据的底层逻辑
  • 抖音视频怎么下载?2026年六大方法全解析及全类型工具对比 - GrowthUME
  • 2026年福州汽车贴膜行业横向测评白皮书 - GrowthUME
  • ‌我靠技术博客实现月入3w+:一名软件测试工程师的垂直深耕之路
  • 【Prompt实战】打破“废话生成器”魔咒:结构化提示词(CRISPE框架)编写指南
  • 谷歌正式发布 Gemini Omni Flash:对话式 AI 视频创作开启“闪电”新纪元
  • 天气太好啦
  • 2026 年广州 GEO 优化公司权威榜单:全意图 GEO 驱动品牌羊城增长战略指南 - GEO优化