说明
如果用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
4helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v0.13.0Helm v2
1
2
3
4
5helm install \
--name cert-manager \
--namespace cert-manager \
--version v0.13.0 \
jetstack/cert-manager
测试
1 | apiVersion: extensions/v1beta1 |