一、Cert-Manager简介
- 官方文档:https://cert-manager.io/docs/installation/
- 项目地址:https://github.com/jetstack/cert-manager
1.1 什么是cert-manager?
cert-manager是证书管理工具。
cert-manager 将证书和证书颁发者作为资源类型添加到 Kubernetes 集群中,并简化了获取、更新和使用这些证书的过程。
1.2 相关资源对象
- ClusterIssuer:集群级别的资源对象,作为颁发机构(CA颁发者)进行签发证书,可以签发任意命名空间的证书;
- Issuer:命名空间的资源对象,通过证书签名请求来生成证书的颁发机构(CA),只能签发自己所在命名空间下的证书;
- Certificate:用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。
Certificate
资源指定用于生成证书签名请求的字段,然后由您引用的颁发者类型完成。
Certificates
通过指定certificate.spec.issuerRef
字段来指定他们想要从哪个颁发者获取证书。
一个Certificate
资源,用于example.com
和www.example.com
DNS 名称,spiffe://cluster.local/ns/sandbox/sa/example
URI 主题备用名称,有效期为 90 天,并在到期前 15 天续订如下。它包含Certificate
资源可能具有的所有选项的详尽列表,但只有一部分字段需要标记。
二、cert-manager部署(v1.7.2)
2.1 下载资源清单文件
$ wget https://github.com/cert-manager/cert-manager/releases/download/v1.7.2/cert-manager.yaml
$ grep image: cert-manager.yaml
image: "quay.io/jetstack/cert-manager-cainjector:v1.7.2"
image: "quay.io/jetstack/cert-manager-controller:v1.7.2"
image: "quay.io/jetstack/cert-manager-webhook:v1.7.2"
您不需要对 cert-manager 安装参数进行任何调整。
2.2 创建资源对象
$ kubectl apply -f cert-manager.yaml
$ kubectl -n cert-manager get pods #相关资源会放到cert-manager命名空间下
NAME READY STATUS RESTARTS AGE
cert-manager-86b4798576-zkx6s 1/1 ContainerCreating 0 4m40s
cert-manager-webhook-6b4f99d45d-xmtbv 1/1 ContainerCreating 0 4m40s
$ kubectl -n cert-manager get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cert-manager ClusterIP 10.102.69.246 <none> 9402/TCP 25m
cert-manager-webhook ClusterIP 10.98.189.19 <none> 443/TCP 25m
2.3 验证安装
- **在主机安装
cmctl
客户端工具**(二进制)
cmctl
是一个 CLI 工具,可以帮助您管理集群内的 cert-manager 资源。
虽然也可作为kubectl 插件。
$ wget https://github.com/cert-manager/cert-manager/releases/download/v1.7.2/cmctl-linux-amd64.tar.gz
$ tar zxvf cmctl-linux-amd64.tar.gz
$ mv cmctl /usr/local/bin/
- 证书创建检查
cmctl 对 Kubernetes 集群执行试运行证书创建检查。如果成功,将The cert-manager API is ready
显示该消息。
$ cmctl check api
The cert-manager API is ready
三、cert-manager使用
安装 cert-manager 成功后,您需要配置的第一件事是创建颁发者,然后您可以使用它来颁发证书。cert-manager 附带了许多内置的证书颁发者,这些证书颁发者通过在cert-manager.io
组中来表示。除了内置类型之外,您还可以安装外部发行者。内置和外部发行者的处理方式相同,并且配置相似。
通过ClusterIssuer
资源对象创建证书签发机构(颁发者),ClusterIssuer是集群级别的资源对象。
3.1 创建证书签发机构
基于ClusterIssuer或者Issuer资源对象创建证书颁发者。
$ vim cluster-issuer-lidabai.yaml
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: lidabai #签发机构的名称,后面创建证书会引用
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory #aacme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行
email: 524719755@qq.com #电子邮件,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期。
privateKeySecretRef: #此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要
name: clusterissuer-secret
solvers: # 添加单个挑战求解器,HTTP01 使用 nginx
- http01:
ingress: #使用哪种入口控制器
class: nginx
$ kubectl apply -f cluster-issuer-lidabai.yaml
clusterissuer.cert-manager.io/letsencrypt-prod created
$ kubectl get clusterissuer
NAME READY AGE
lidabai True 21s
$ kubectl get secrets -A | grep clusterissuer-secreter
cert-manager clusterissuer-secreter Opaque 1 104s
资源清单解释
spec
acme <Object> #ACME将此颁发者配置为与RFC8555(ACME)服务器通信,以获取签名的x509证书。
ca <Object> #将此颁发者配置为使用签名CA密钥对签名证书存储在Secret资源中。这用于构建内部PKI由证书管理器管理。
selfSigned <Object> #自签名将此颁发者配置为使用“self sign”证书用于创建CertificateRequest对象的私钥。
vault <object> #将此颁发者配置为使用HashiCorp Vault签署证书PKI后端。
venafi#将此颁发者配置为使用Venafi TPP或Venafi云政策区。
3.2 创建证书资源
- 编写资源清单文件
$ cat cert-lidabai.yaml
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: cert-lidabai
namespace: default
spec:
issuerRef: #从哪个颁发者获取证书
name: lidabai
kind: ClusterIssuer
secretName: clusterissuer-secret
ipAddresses: #少需要 DNS 名称、URI 或 IP 地址之一。
- 192.168.2.60
- 创建资源对象
$ kubectl apply -f cert-lidabai.yaml
certificate.cert-manager.io/cert-lidabai created
$ kubectl get certificate -n default
NAME READY SECRET AGE
cert-lidabai False clusterissuer-secret 3m9s
- 查看日志
$ kubectl logs -f $(kubectl get pods -n cert-manager | grep cert-manager | grep -v 'cainjector\|webhook' | awk '{print $1}') -n cert-manager