Email:2225994292@qq.com
CNY
使用Cert-Manager自动签发K8s集群SSL证书操作指南
更新时间:2025-07-30 作者:K8s集群SSL证书操作指南

Cert-Manager作为K8s生态中强大的证书管理工具,能自动为集群内的服务签发、更新SSL证书,极大简化了证书管理流程,提升了集群的安全性与稳定性。本文将为你详细介绍使用Cert-Manager自动签发K8s集群SSL证书的操作步骤。

一、Cert-Manager简介

Cert-Manager是一个开源的Kubernetes控制器,它在K8s集群内以一系列部署资源的形式运行,利用自定义资源定义(CRDs)来配置证书颁发机构(CA)并请求证书。其主要功能包括:

  • 多源证书签发:支持从多种证书来源签发证书,如Let's Encrypt(适用于公网可访问的服务,免费且自动化程度高)、HashiCorp Vault(适合企业内部基于Vault构建的私有CA体系)、Venafi以及私有PKI等。
  • 证书自动管理:自动确保证书始终有效且为最新状态,在证书到期前按配置时间尝试续期,避免因证书过期导致服务中断。
  • 简化证书使用:在K8s集群中以资源类型的方式添加证书和证书颁发者,简化了证书的获取、更新与使用流程,开发与运维人员可通过熟悉的K8s资源操作方式管理证书。

二、安装Cert-Manager

1. 前提条件

  • K8s集群环境:确保你拥有一个可正常访问与操作的K8s集群,且集群版本符合Cert-Manager的要求(从Cert-Managerv1.2.0 起,最低支持的K8s版本为 v1.16.0)。
  • Kubectl工具:本地已安装Kubectl,并配置好与目标K8s集群的连接,可通过 kubectl cluster-info 命令验证连接状态。

2. 安装步骤

  • 使用YAML安装:

Cert-Manager的所有资源(自定义资源定义、Cert-Manager本身、命名空间以及 webhook 组件)都包含在一个YAML清单文件中。运行以下命令安装:

1    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

注意:

若你使用的Kubectl版本低于 v1.19.0-rc.1,在更新CRDs时可能会遇到问题,可参考 v0.16 升级说明解决。

默认情况下,Cert-Manager将安装到 cert-manager 命名空间。若要安装到其他命名空间,需对部署清单进行相应修改。

  • 使用Helm安装(可选):

Cert-Manager也提供了官方Helm chart用于安装。首先更新本地Helm chart仓库缓存:

1    helm repo add jetstack https://charts.jetstack.io
2    helm repo update

然后安装Cert-Manager:

1    helm installCert-Managerjetstack/Cert-Manager--namespaceCert-Manager--version v1.13.2

注意:Cert-Manager不应作为子图表嵌入到其他Helm图表中,因为它管理集群中的非命名空间资源,且在集群中应仅安装一次。

3. 验证安装

安装完成后,可通过以下命令验证Cert-Manager的部署状态:

1    kubectl get pods --namespaceCert-Manager

正常情况下,应看到 cert-manager cert-manager-cainjector cert-manager-webhook 等Pod处于 Running 状态。若Pod状态异常,可通过 kubectl describe pod 命令查看详细的错误信息进行排查。

三、配置Issuer

Issuer用于定义证书颁发机构,它可以是自签名CA、Let's Encrypt、私有CA等。Cert-Manager支持多种类型的Issuer,以下以Let's Encrypt为例进行配置。

1. 创建ClusterIssuer资源(推荐用于集群范围)

  • 创建一个 letsencrypt-prod.yaml 文件,内容如下:
1    apiVersion:Cert-Manager.io/v1
2    kind: ClusterIssuer
3    metadata:
4      name: letsencrypt-prod
5    spec:
6      acme:
7        # 邮箱地址,用于接收Let's Encrypt的通知
8        email: your-email@example.com
9        server: https://acme-v02.api.letsencrypt.org/directory
10      privateKeySecretRef:
11        name: letsencrypt-prod
12      solvers:
13      - http01:
14          ingress:
15            class: nginx

说明:

email 字段需替换为你真实有效的邮箱地址。

server 指定了Let's Encrypt的生产环境API服务器地址,若用于测试,可改为 https://acme-staging-v02.api.letsencrypt.org/directory ,避免因频繁测试导致生产环境证书申请受限。

privateKeySecretRef.name 定义了存储Let's Encrypt私钥的Kubernetes Secret名称。

solvers.http01.ingress.class 指定了用于解决HTTP-01挑战的Ingress类,这里假设使用的是Nginx Ingress Controller,若使用其他Ingress Controller,需根据实际情况修改。

  • 应用该配置文件:
1    kubectl apply -f letsencrypt-prod.yaml

成功创建后,可通过 kubectl get clusterissuers.cert-manager.io 命令查看 letsencrypt-prod 的状态,确保其 READY 字段为 True

2. 创建Issuer资源(用于命名空间范围)

若仅希望在特定命名空间内使用Issuer,可创建Issuer资源,配置方式与ClusterIssuer类似,只是资源类型改为 Issuer ,且作用域为单个命名空间。例如,在 my - namespace 命名空间内创建一个Let's EncryptIssuer:

  • 创建 letsencrypt - ns.yaml 文件:
1    apiVersion: cert - manager.io/v1
2    kind:Issuer
3    metadata:
4      name: letsencrypt - ns
5      namespace: my - namespace
6    spec:
7      acme:
8        email: your - email@example.com
9        server: https://acme - v02.api.letsencrypt.org/directory
10      privateKeySecretRef:
11        name: letsencrypt - ns
12      solvers:
13      - http01:
14          ingress:
15            class: nginx
  • 应用配置:
1    kubectl apply -f letsencrypt - ns.yaml -n my - namespace

同样,可通过 kubectl getIssuers.cert - manager.io -n my - namespace 命令查看其状态。

四、创建证书

1. 定义证书资源

创建一个 example - certificate.yaml 文件,用于请求由前面配置的Issuer签发的证书:

1    apiVersion:Cert-Manager.io/v1
2    kind: Certificate
3    metadata:
4      name: example-cert
5      namespace: my - namespace
6    spec:
7      secretName: example - cert - tls
8     IssuerRef:
9        name: letsencrypt - ns # 引用前面创建的Issuer或ClusterIssuer名称
10      kind:Issuer
11      group:Cert-Manager.io
12    commonName: example.com
13    dnsNames:
14    - example.com
15    - www.example.com

说明:

  • secretName 指定了存储生成的证书和私钥的 Kubernetes Secret 名称。
  • issuerRef 引用了前面创建的Issuer或 ClusterIssuer, name 需与实际创建的名称一致, kind 根据使用的是Issuer还是ClusterIssuer进行选择, group 固定为 cert-manager.io
  • commonName 设置证书的通用名称, dnsNames 列出证书应包含的所有域名,确保与实际服务的域名匹配。

2. 申请证书

应用证书配置文件:

1    kubectl apply -f example - certificate.yaml -n my - namespace

Cert-Manager会根据配置向指定的Issuer请求证书,签发过程中可通过以下命令查看证书状态:

1    kubectl describe certificate example - cert -n my - namespace

若签发成功,在 my - namespace 命名空间下将创建一个名为 example - cert - tls 的Secret,其中包含生成的证书和私钥。可通过以下命令查看Secret的详细信息:

1    kubectl get secret example - cert - tls -n my - namespace -o yaml

五、在服务中使用证书

1. Ingress配置使用证书

假设使用Nginx Ingress Controller,在Ingress资源中引用前面创建的证书:

1    apiVersion: networking.k8s.io/v1
2    kind: Ingress
3    metadata:
4      name: example - ingress
5      namespace: my - namespace
6    spec:
7      ingressClassName: nginx
8      tls:
9      - hosts:
10      - example.com
11      - www.example.com
12      secretName: example - cert - tls
13    rules:
14    - host: example.com
15      http:
16        paths:
17        - path: /
18          pathType: Prefix
19          backend:
20            service:
21              name: example - service
22              port:
23                number: 80

说明: tls 部分引用了 example - cert - tls Secret ,确保 hosts 字段与证书中配置的域名一致。应用该Ingress配置后,访问 example.com www.example.com 时,将使用SSL证书进行加密通信。

2. Service配置使用证书(适用于非Ingress场景)

若服务直接对外暴露,不通过Ingress,可在Deployment或Pod中挂载证书Secret,例如在一个使用Node.js的Web服务中:

1    apiVersion: apps/v1
2    kind: Deployment
3    metadata:
4      name: example - deployment
5      namespace: my - namespace
6    spec:
7      replicas: 1
8      selector:
9        matchLabels:
10        app: example - app
11    template:
12      metadata:
13        labels:
14          app: example - app
15      spec:
16        containers:
17        - name: example - container
18          image: your - image:latest
19          ports:
20          - containerPort: 443
21          volumeMounts:
22          - name: tls - certs
23            mountPath: /etc/ssl/certs
24            readOnly: true
25        volumes:
26        - name: tls - certs
27          secret:
28            secretName: example - cert - tls

上述配置将 example - cert - tls Secret 挂载到容器的 /etc/ssl/certs 目录,容器内的应用程序可通过该路径读取证书与私钥,配置HTTPS服务。

六、证书管理与监控

1. 证书续期

Cert-Manager会在证书到期前自动尝试续期,默认在证书到期前 30 天触发续期操作。可通过修改证书资源中的 renewBefore 字段自定义续期时间,例如:

1    apiVersion:Cert-Manager.io/v1
2    kind: Certificate
3    metadata:
4      name: example-cert
5      namespace: my - namespace
6    spec:
7      secretName: example - cert - tls
8     IssuerRef:
9        name: letsencrypt - ns
10      kind:Issuer
11      group:Cert-Manager.io
12     commonName: example.com
13    dnsNames:
14    - example.com
15    - www.example.com
16    renewBefore: 15d # 在证书到期前15天触发续期

通过监控证书资源的 status 字段,可查看续期状态,若续期失败,会在 status.conditions 中显示详细的错误信息。

2. 使用cmctl工具管理

Cert-Manager提供了命令行工具 cmctl ,可帮助管理集群内的Cert-Manager及其资源。

(1)安装cmctl:

  • 若在Mac或Linux上安装了Homebrew,可通过以下命令安装:
1    brew install jetstack/tap/cmctl
  • 也可从Cert-ManagerGitHub releases page下载对应平台的 cmctl.tar.gz 文件,解压后将二进制文件添加到 $PATH 环境变量中。

(2)常用命令示例:

  • 查看Cert-Manager组件状态:
1    cmctl check
  • 创建证书请求:
1    cmctl create certificate request --from - certificate - file=example - certificate.yaml
  • 手动标记证书进行续期:
1    cmctl renew example - cert -n my - namespace

3. 监控告警设置

为及时掌握证书状态,可通过Prometheus与Grafana搭建监控系统,采集Cert-Manager的指标数据(如证书到期时间、续期状态等),并设置告警规则。例如,使用Prometheus Operator在K8s集群内部署Prometheus与Grafana,通过配置ServiceMonitor资源采集Cert-Manager的指标:

1    apiVersion: monitoring.coreos.com/v1
2    kind: ServiceMonitor
3    metadata:
4      name: cert - manager
5      namespace: cert - manager
6      labels:
7        k8s-app: cert - manager
8    spec:
9      selector:
10      matchLabels:
11        app: cert - manager
12    endpoints:
13    - port: http - metrics
14      interval: 30s

然后在Grafana中创建相应的仪表盘与告警规则,当证书即将过期或续期失败时,通过邮件、短信等方式及时通知运维人员。

通过以上步骤,你已掌握使用Cert-Manager自动签发K8s集群SSL证书的方法,从安装配置到在服务中应用,再到后续的管理与监控,Cert-Manager为K8s集群的安全通信提供了高效、可靠的证书管理方案,保障了集群服务的稳定运行与数据安全。


Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.145393s