跳到主要内容

cert-manager 是什么?

cert-manager 是什么?

ClusterIssuer 是什么?

ClusterIssuer是cert-manager中的一个资源类型,它表示能够签发证书的颁发机构。与之对应的还有一个Issuer资源类型,它们之间的主要区别在于作用范围:ClusterIssuer可以在整个Kubernetes集群内的所有命名空间中使用,而Issuer只能在定义它的命名空间内使用。

换句话说,如果你想要在多个不同的命名空间中使用相同的证书颁发机构来签发证书,你应该使用ClusterIssuer;如果你只想在单个命名空间内使用证书颁发机构,那么你可以使用Issuer

ClusterIssuerIssuer资源的配置几乎是相同的,它们都定义了如何连接到CA(证书颁发机构)以及如何签发证书。例如,你可以配置一个ClusterIssuer来使用ACME协议(这是Let's Encrypt等公共CA使用的协议)来签发证书,或者你可以配置它来使用自己的CA来签发证书。

下面是一个使用自签名CA的ClusterIssuer的例子:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: ca-issuer
spec:
ca:
secretName: ca-key-pair

在这个例子中,ClusterIssuer 被配置为使用存储在ca-key-pair这个Kubernetes Secret中的CA证书和私钥来签发证书。

创建了ClusterIssuer后,你就可以在你的 Certificate 资源中引用它来请求证书了。cert-manager将处理与颁发机构的通信,并最终将签发的证书存储在一个Kubernetes Secret中,你可以在你的Kubernetes工作负载中引用这个Secret来使用证书。

内网证书与公网证书

可以在一个Kubernetes集群中配置多个ClusterIssuer,这样你就可以根据不同的用途和需求使用不同的证书颁发机构。例如,你可以有一个ClusterIssuer配置为使用Let's Encrypt来签发公网域名的证书,另一个ClusterIssuer配置为使用你的内部CA来签发内网域名的证书。

下面是一个配置两个ClusterIssuer的示例:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx

在这个例子中,ClusterIssuer的名字是letsencrypt-prod,它使用ACME协议连接到Let's Encrypt的生产环境服务器。你需要将your-email@example.com替换为你的邮箱地址。

下面使用内部 CA 签发内网域名证书的 ClusterIssuer

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: internal-ca-issuer
spec:
ca:
secretName: internal-ca-secret

在这个例子中,ClusterIssuer的名字是internal-ca-issuer,它使用在Kubernetes Secret internal-ca-secret中存储的内部CA的证书和私钥来签发证书。

创建了这两个ClusterIssuer之后,你就可以在你的Certificate资源中引用它们来请求证书了。例如:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: public-domain-cert
namespace: default
spec:
secretName: public-domain-cert-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- "public-domain.com"

这个Certificate资源将使用letsencrypt-prod这个ClusterIssuer来签发public-domain.com的证书。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: internal-domain-cert
namespace: default
spec:
secretName: internal-domain-cert-tls
issuerRef:
name: internal-ca-issuer
kind: ClusterIssuer
dnsNames:
- "internal-domain.local"

这个Certificate资源将使用internal-ca-issuer这个ClusterIssuer来签发internal-domain.local的证书。

通过这种方式,你可以根据证书的用途和域名的类型选择不同的颁发机构,灵活地满足不同环境的需求。

Certificate 是什么?

Certificate是cert-manager中的一个Kubernetes资源类型,它用于表示一个X.509证书及其相关配置。通过创建一个Certificate资源,你可以告诉cert-manager你需要一个证书,同时指定如何签发这个证书,例如使用哪个IssuerClusterIssuer来签发,证书的DNS名称是什么等。

创建Certificate资源后,cert-manager会负责与配置的颁发机构交互,生成密钥对,创建证书签名请求(CSR),并最终获取一个签发的证书。一旦证书被成功签发,cert-manager会将证书及其私钥存储在一个Kubernetes Secret资源中。你可以在你的应用程序或Ingress控制器中引用这个Secret来使用证书。

以下是一个Certificate资源的示例:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mydomain-com-tls
namespace: default
spec:
secretName: mydomain-com-tls-secret
issuerRef:
name: my-ca-clusterissuer
kind: ClusterIssuer
dnsNames:
- "mydomain.com"
- "www.mydomain.com"
renewBefore: 360h # 15d

在这个例子中:

  • secretName: 指定存储签发证书和私钥的Kubernetes Secret的名称。
  • issuerRef: 指定用于签发证书的颁发机构,可以是IssuerClusterIssuer。在这个例子中,它引用了一个名为my-ca-clusterissuerClusterIssuer
  • dnsNames: 列出证书应该包含的DNS名称。
  • renewBefore: 指定在证书到期前多久开始尝试续签证书。在这个例子中,设置为360小时(15天)。

创建并配置好 Certificate 资源后,cert-manager 会自动处理证书的签发和续签过程。当证书快要到期时,cert-manager会自动创建一个新的证书签名请求,并更新存储在Secret中的证书和私钥。你的应用程序或Ingress控制器只需要引用这个Secret,就可以一直使用最新的证书了。