cert-manager 是什么
cert-manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,支持 Let’s Encrypt, HashiCorp Vault 这些免费证书的签发。在Kubernetes集群中,我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS
在cert-manager架构中主要包含两部分:Issuer和Certificates,其中Issuer表示证书颁发者,Issuser支持多种类型的证书例如:SelfSigned(自签名证书),CA证书,ACME,External,Vault,Venafi等,Issuer 的主要功能就是实现不同类型证书协议及规范,根据Certificates声明信息自动生成所需证书;Certificates代表生成证书的请求,其中包含了生成证书所需要的元数据信息(例如:CN, Domain 等)和指定证书生成后保存的Secret名称;
cert-manager 安装
cert-manager 支持使用YAML manifests 和 Helm V2 两种方式
使用 YAML manifests 安装
1 | # Kubernetes 1.15+ |
使用 Helm V2 安装
安装 Helm v2.16.1
在Kubernetes集群内任意节点上执行如下命令,安装helm client
1 | # 下载Helm二进制文件 |
安装Helm 服务端组件Tiller
1 | # 创建 ServiceAccount |
使用Helm V2 安装cert-manager
1 | # 创建命名空间cert-manager |
验证安装
1 | $ kubectl get pods --namespace cert-manager |
自动生成ACME证书
ACME 协议规范及cert-manager 工作流
- ACME客户端(cert-manager)创建 issuer 实例
- issuer 会向ACME服务端(Letsencrypt)发起注册请求
- Letsencrypt在收到注册请求后,会生成token
- issuer将token信息保存在创建issuer时指定的secret中
- 创建Certificate,表示向issuer申请生成证书
- cert-manager会创建acme-http-solver实例及服务并提供公网访问(http://$
/.well-known/acme-challenge/$ ) - Letsencrypt服务器请求http://$
/.well-known/acme-challenge/$ 验证您对证书中域名的控制权 - 验证通过后,Letsencrypt将生成证书
- issuer在收到证书后,将证书保存到创建Certificate时指定的secret中
Helm v2 安装 ingress-nignx
1 |
|
nginx-ingress-controller报错信息:User “system:serviceaccount:kube-system:default” cannot get resource “services” in API group “” in the namespace “kube-system”
1 | #解决办法: |
创建Issuer和Certificate
1 | apiVersion: cert-manager.io/v1alpha2 |
1 |
|
注意:确保提供对外访问的ingress-controller IP地址与证书中域名解析的IP地址一致,这样才可以向Let’s Encrypt服务端证明你对证书中域名的控制权
1 | # 获取 nginx-ingress-controller 的外网IP地址 |
cert-manager 自动创建ingress,svc ,deploy 等资源用于ACME服务端(Let’s Encrypt)验证你是否拥有证书中的域名的控制权,验证成功后生成证书
1 | $ kubectl get ingress |
最新生产的证书将保存在 secret/example-docker-com-tls
1 | $ kubectl get secret example-docker-com-tls -oyaml |
Istio 集成 cert-manager
Istio集成cert-manager证书管理工具主要包括两个方面:
- 使用 istio gateway 和virtualservice 提供 http-01 公网访问入口 http://$
/.well-known/acme-challenge/$ - 在 istio-system 命名空间下配置创建issuer和certificate,这样生成的证书会自动保存到 istio-system 命名空间下的 secret中供 istio gateway 配置使用;
示例:bookinfo TLS 使用 cert-manager 证书
使用 istio 官方提供的bookinfo服务示例
1 | $ kubectl apply -f bookinfo/platform/kube/bookinfo.yaml |
使用 istio gateway 和virtualservice 提供 http-01 公网访问入口
1 | apiVersion: networking.istio.io/v1alpha3 |
在创建 Issuer时,solvers.http01.ingress.class指定为 istio
1 | apiVersion: cert-manager.io/v1alpha2 |
1 | apiVersion: cert-manager.io/v1alpha2 |
配置istio gateway 指定 cert-manager 生成的证书 ,并配置gateway端口,协议,TLS等内容
1 | ... |
浏览器访问 bookinfo服务,已开启HTTPS功能
目前在浏览器中使用HTTPS方式访问bookinfo仍然有”不安全”提示,原因是这个证书是一个不受信任的证书;
证书不受信任的原因是因为我们在测试调试时,使用的issuer配置的ACME Server是 https://acme-staging-v02.api.letsencrypt.org/directory 用于调试使用且不限制请求次数的服务,该服务不会真正下发有效的证书
重新创建一个 Issuer,将ACME server 指向 https://acme-v02.api.letsencrypt.org/directory 即可生成安全有效的证书,并修改bookinfo-gateway credentialName 值,使用新生成的证书 secret即可
1 | apiVersion: cert-manager.io/v1alpha2 |
使用新生成的有效证书,再次打开 bookinfo 页面,可以看到浏览器显示该网站已经是安全状态了