{{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: nginx1    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 - namespaceCert-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 check1    cmctl create certificate request --from - certificate - file=example - certificate.yaml1    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证书需求,欢迎联系!