简介
cert-manager是kubernetes原生证书解决方案,可以通过多种机构颁发证书,证书最后以secret的形式存储在kubernetes中。可以支持Let’s encrypt,self signed,CA等。
架构

安装
创建资源
- 创建crd
1 | # Kubernetes 1.15+ |
- helm安装
1 | # 添加helm repo |
检查
1 | $ kubectl get pod -n cert-manager |
配置
CA
手动创建根证书和私钥,或者从其他地方获取根证书及私钥。将证书存储在k8s的secret中,用来颁发证书,可以用内部的CA证书信任生成的签名证书。
创建根证书
- openssl生成密钥及证书
1 | $ openssl genrsa -out ca.key 2048 |
- 导入k8s的secret
1 | $ kubectl create secret tls ca-key-pair \ |
创建签发机构
创建issuer,
Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书,类似k8s中role和clusterrole
1 | $ cat issuer.yaml |
创建资源
1 | $ kubectl apply -f issuer.yaml |
创建证书
创建certtificate
cert-manager 给提供了 Certificate 这个用于生成证书的自定义资源对象,但它必须在某个namespace下
1 | $ cat certs.yaml |
创建资源
1 | $ kubectl apply -f certs.yaml |
ingress使用证书
- 创建一个nginx例子
1 | $ cat nginx.yaml |
创建资源
1 | $ kubectl apply -f nginx.yaml |
自签名证书
创建自签名证书Issuer
1 | $ cat cert-resource.yaml |
创建资源
1 | $ kubectl apply -f cert-resource.yaml |
生成证书
- 手动生成
1 | $ cat certificate-example-com.yaml |
创建资源
1 | $ kubectl apply -f certificate-example-com.yaml |
- 自动生成
1 | [root@node1 selfsigne]# cat nginx-self.yaml |
创建资源
1 | $ kubectl apply -f nginx-self.yaml |
注意: 1. 自动创建证书中,标记ingress参数metadata.annotations.cert-manager.io/issuer: test-selfsigned,test-selfsigned为issuer名称
2. 若使用clusterissuer则参数为 metadata.annotations.cert-manager.io/cluster-issuer
letsencrypt
创建资源clusterissuer
1 | $ cat clusterissuer.yaml |
生成证书
生成证书方式和其他方式类似,可手动生成,也可以ingress自动生成,参考上节生成证书
注意:1.letsencrypt通过acme协议自动申请证书,其中包含两个sloving Challenge: http01,dns01,主要用来证明域名是属于你所有。
- http01的校验原理是给你域名指向的 HTTP 服务增加一个临时 location ,
Let’s Encrypt
会发送 http 请求到http:///.well-known/acme-challenge/
,YOUR_DOMAIN
就是被校验的域名,TOKEN
是 ACME 协议的客户端负责放置的文件,在这里 ACME 客户端就是 cert-manager,它通过修改 Ingress 规则来增加这个临时校验路径并指向提供TOKEN
的服务。此方法仅适用于给使用 Ingress 暴露流量的服务颁发证书,并且不支持泛域名证书。- dns01 的校验原理是利用 DNS 提供商的 API Key 拿到你的 DNS 控制权限, 在 Let’s Encrypt 为 ACME 客户端提供令牌后,ACME 客户端 (cert-manager) 将创建从该令牌和您的帐户密钥派生的 TXT 记录,并将该记录放在
_acme-challenge.
。 然后 Let’s Encrypt 将向 DNS 系统查询该记录,如果找到匹配项,就可以颁发证书。此方法不需要你的服务使用 Ingress,并且支持泛域名证书。
验证
- 查看ingress-controller访问方式
1 | $ kubectl get svc -n ingress-nginx |
- 添加 /etc/hosts解析(若有内部DNS,可配置DNS)
1 | cat /etc/hosts |
注意:由于ingress-controller是nodeport暴露方式,这里需要写k8s其中一个node的IP
- 访问url
浏览器打开访问:https://nginx.ning.com:30762
注意:此处端口为ingress-controller暴露的443的nodeport端口,而非80