一、cert-manager简介

我们知道,在k8s中通常可以使用 easyrsaopensslcfssl 来生成手动证书,但还是比较麻烦,有如下一些缺点:

  1. 如果k8s集群上部署的应用较多,要为每个应用的不同域名生成https证书,操作太麻烦。
  2. 上述这些手动操作没有跟k8s的deployment描述文件放在一起记录下来,很容易遗忘。
  3. 证书过期后,又得手动执行命令重新生成证书。

对于这些问题,cert-manager就很好地解决了这些痛点。cert-manager是Kubernetes上一个管理SSL证书的插件,配合ingress可以对网站配置https访问,在加上letsencrypt提供免费的SSL证书,所有就产生了cert-manager+ingress(nginx/traefik)+letsencrypt的免费套餐。

cert-manager 的架构

cert-manager 架构图:
image.png

上面是官方给出的架构图,可以看到cert-manager在k8s中定义了两个自定义类型资源:IssuerCertificate

其中Issuer代表的是证书颁发者,可以定义各种提供者的证书颁发者,当前支持基于LetsencryptvaultCA的证书颁发者,还可以定义不同环境下的证书颁发者。
Certificate代表的是生成证书的请求,一般其中存入生成证书的元信息,如域名等等。

一旦在k8s中定义了上述两类资源,部署的cert-manager则会根据IssuerCertificate生成TLS证书,并将证书保存进k8s的Secret资源中,然后在Ingress资源中就可以引用到这些生成的Secret资源。对于已经生成的证书,还是定期检查证书的有效期,如即将超过有效期,还会自动续期。

二、安装cert-manager

添加仓库并更新:

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

先创建一个namespace,以免默认添加到default:

  1. kubectl create namespace cert-manager
  2. kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true