{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书Cert-Manager作为K8s生态中强大的证书管理工具,能自动为集群内的服务签发、更新SSL证书,极大简化了证书管理流程,提升了集群的安全性与稳定性。本文将为你详细介绍使用Cert-Manager自动签发K8s集群SSL证书的操作步骤。
Cert-Manager是一个开源的Kubernetes控制器,它在K8s集群内以一系列部署资源的形式运行,利用自定义资源定义(CRDs)来配置证书颁发机构(CA)并请求证书。其主要功能包括:
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 命名空间。若要安装到其他命名空间,需对部署清单进行相应修改。
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图表中,因为它管理集群中的非命名空间资源,且在集群中应仅安装一次。
安装完成后,可通过以下命令验证Cert-Manager的部署状态:
1 kubectl get pods --namespaceCert-Manager
正常情况下,应看到 cert-manager 、 cert-manager-cainjector 、 cert-manager-webhook 等Pod处于 Running 状态。若Pod状态异常,可通过 kubectl describe pod 命令查看详细的错误信息进行排查。
Issuer用于定义证书颁发机构,它可以是自签名CA、Let's Encrypt、私有CA等。Cert-Manager支持多种类型的Issuer,以下以Let's Encrypt为例进行配置。
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 。
若仅希望在特定命名空间内使用Issuer,可创建Issuer资源,配置方式与ClusterIssuer类似,只是资源类型改为 Issuer ,且作用域为单个命名空间。例如,在 my - namespace 命名空间内创建一个Let's EncryptIssuer:
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 命令查看其状态。
创建一个 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
说明:
应用证书配置文件:
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
假设使用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证书进行加密通信。
若服务直接对外暴露,不通过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服务。
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 中显示详细的错误信息。
Cert-Manager提供了命令行工具 cmctl ,可帮助管理集群内的Cert-Manager及其资源。
(1)安装cmctl:
1 brew install jetstack/tap/cmctl
(2)常用命令示例:
1 cmctl check
1 cmctl create certificate request --from - certificate - file=example - certificate.yaml
1 cmctl renew example - cert -n my - namespace
为及时掌握证书状态,可通过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机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!