说明
如果用cfssl或者openssl之类的工具手动生成TLS证书,这样就可以轻松搞定站点的https访问了。理想是很美好,但实际操作时却很痛苦,主要有以下几点缺陷:
- 如果k8s集群上部署的应用较多,要为每个应用的不同域名生成https证书,操作太麻烦。
- 上述这些手动操作没有跟k8s的deployment描述文件放在一起记录下来,很容易遗忘。
- 证书过期后,又得手动执行命令重新生成证书。
证书管理器
cert-manager的架构

上面是官方给出的架构图,可以看到cert-manager在k8s中定义了两个自定义类型资源:Issuer和Certificate。
其中Issuer代表的是证书颁发者,可以定义各种提供者的证书颁发者,当前支持基于Letsencrypt、vault和CA的证书颁发者,还可以定义不同环境下的证书颁发者。
而Certificate代表的是生成证书的请求,一般其中存入生成证书的元信息,如域名等等。
一旦在k8s中定义了上述两类资源,部署的cert-manager则会根据Issuer和Certificate生成TLS证书,并将证书保存进k8s的Secret资源中,然后在Ingress资源中就可以引用到这些生成的Secret资源。对于已经生成的证书,还是定期检查证书的有效期,如即将超过有效期,还会自动续期。
部署
使用常规清单安装
注意:从cert-manager v0.11.0开始,Kubernetes的最低支持版本是v1.12.0。仍在运行Kubernetes v1.11或更低版本的用户应在安装cert-manager之前升级到受支持的版本。
创建一个名称空间以在其中运行cert-manager
创建一个namespace
| 1 | # namespace.yaml | 
安装cert-manager,官方地址为
| 1 | kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.0/cert-manager.yaml | 
yaml中有三个镜像,分别为
- shenshengkun/cert-manager-controller:v0.13.1
- shenshengkun/cert-manager-cainjector:v0.13.1
- shenshengkun/cert-manager-webhook:v0.13.1
默认是从quay.io获取镜像,如果quay.io的镜像无法获取,改成我上面的镜像库
使用Helm安装
部署前需要一些 crd
| 1 | kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.13.0/deploy/manifests/00-crds.yaml | 
为cert-manager创建名称空间
| 1 | kubectl create namespace cert-manager | 
添加Jetstack Helm存储库。
| 1 | helm repo add jetstack https://charts.jetstack.io | 
更新您的本地Helm存储库缓存
| 1 | helm repo update | 
- 安装cert-manager - Helm v3+ - 1 
 2
 3
 4- helm install \ 
 cert-manager jetstack/cert-manager \
 --namespace cert-manager \
 --version v0.13.0
- Helm v2 - 1 
 2
 3
 4
 5- helm install \ 
 --name cert-manager \
 --namespace cert-manager \
 --version v0.13.0 \
 jetstack/cert-manager
 
测试
| 1 | apiVersion: extensions/v1beta1 | 

 
        