前言

cert-manager在k8s平台中用的越来越广泛了,通过它可以更方便的管理https证书,可以自动生成secret、自动续签和取消等等。

架构

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

其中Issuer代表的是证书颁发者,可以定义各种提供者的证书颁发者,当前支持基于Letsencrypt、vault和CA的证书颁发者,还可以定义不同环境下的证书颁发者。

Certificate代表的是生成证书的请求,一般其中存入生成证书的元信息,如域名等等。

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

部署

部署cert-manager还是比较简单的,这里我们通过helm进行部署:

1
2
3
4
5
helm install --name cert-manager 
--namespace kube-system
--set ingressShim.defaultIssuerName=ca-issuer
--set ingressShim.defaultIssuerKind=ClusterIssuer
stable/cert-manager

这里我们部署了cert-manager并且指定了默认的Issuer为我们自定义的CA,默认的IssuerKindClusterIssuser

创建CA证书

这里我们通过cfssl创建一套自己的CA。

CA配置文件

ca-config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "876000h"
}
}
}
}

CA证书请求文件

ca-csr.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "WuHan",
"L": "XS",
"O": "K2",
"OU": "System"
}
],
"ca": {
"expiry": "876000h"
}
}

生成 CA 证书和私钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

这样就生成了ca.csr、ca-key.pem、ca.pem

创建k8s secret

有了ca文件,我们就可以创建k8s的secret了:

1
2
3
4
kubectl create secret tls ca-secret 
-n kube-system
--cert=ca.pem
--key=ca-key.pem

创建cert-manager ca issuer
创建完了secret,我们再来创建CA Issuer就可以了:

1
2
3
4
5
6
7
8
9
10
cat << EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: ca-issuer
namespace: kube-system
spec:
ca:
secretName: ca-secret
EOF