前言
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
5helm install --name cert-manager
--namespace kube-system
--set ingressShim.defaultIssuerName=ca-issuer
--set ingressShim.defaultIssuerKind=ClusterIssuer
stable/cert-manager
这里我们部署了cert-manager并且指定了默认的Issuer为我们自定义的CA,默认的IssuerKind
为ClusterIssuser
。
创建CA证书
这里我们通过cfssl创建一套自己的CA。
CA配置文件
ca-config.json
1 | { |
CA证书请求文件
ca-csr.json1
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
4kubectl create secret tls ca-secret
-n kube-system
--cert=ca.pem
--key=ca-key.pem
创建cert-manager ca issuer
创建完了secret,我们再来创建CA Issuer
就可以了:
1 | cat << EOF | kubectl create -f - |