本文介绍几种在阿里云K8S中管理TLS证书的方案。
证书申请方案
先看如何申请证书。
cert-manager
cert-manager是一个集成在k8s中的工具,它可以做到自动从Let's encrypt申请证书、自动更新证书、与Ingress无缝结合。
大多数情况下建议与Ingress集成的方式使用它,后面会讲。如果你仅需要签发功能,不需要和Ingress集成,则可参考Setting up Issuers和Issuing Certificates。
优点:
自动签发
自动续期
与K8S集成良好
免费
缺点:
只能签发Server Auth证书,不能签发Client Auth证书
证书仅用做认证,没有商业版证书更高级的功能
阿里云平台购买
优点:
多种类型证书可以供选择,有免费的有收费的
可在平台上管理
申请的证书可用在其他产品上,比如SLB
缺点:
与K8S集成不好,需要手动导入到Secret中才能使用
只能签发Server Auth证书,不能签发Client Auth证书
用CFSSL自签发
你可以使用CFSSL自签发证书,有一篇参考文档。
优点:
可签发Client Auth证书
缺点:
手动管理证书
与K8S集成不好,需要手动导入到Secret中才能使用
自签发的Server Auth证书在浏览器端会报警告
总结
对于Server Auth证书:
如果只是开发或者演示环境,cert-manager方案更适合你
如果是生产环境或者对证书有更高要求的,可以采用从平台购买的方案
对于Client Auth证书:
你只能选择用CFSSL自签发的方式
证书部署方案
下面介绍几种部署方案。
部署在阿里云SLB上
虽然本小节讲的是部署在阿里云的SLB的产品上,但是它的思路和优缺点在其他云平台上基本是一致的。
做法是在SLB上配置HTTPS监听,ACK(阿里云Kubernetes)在创建集群的时候会自动创建几个SLB实例,不要在这几个实例上配置HTTPS监听,因为在ACK中创建Type=LoadBalancer的Service的时候会把你做的配置刷新掉。
支持:
Server Auth
Client Auth
优点:
可利用阿里云的SSL证书管理功能
可用在阿里云的其他产品上,比如ECS
缺点:
不支持SNI,如果你有多个域名,因为一个SLB只会有一个公网IP,此时你就有两种选择:
在一个SLB上配置多个监听端口,这样URL中就会携带端口
配置多个SLB,避免前面一个方案的问题
要自己手动配置服务器组之类的信息
K8S Service类型得是Node Port,意味着在同一VPC子网内部流量不受保护
K8S集群内部流量不受保护
LoadBalancer Service
创建Type=LoadBalancer的Service来暴露服务,然后在Deployment/StatefulSets里部署证书。
支持:
Server Auth
Client Auth
优点:
集群内部流量受保护
VPC子网内部流量受保护
缺点:
不支持SNI,而且因为你只可能有一个公网IP,因此URL中必定要携带端口
在应用中配置证书,且方式方法与应用所使用架构/类库有关
Ingress配合cert-manager
前面说过cert-manager支持与Ingress集成,你很少的工作能够配置Server Auth,和一个稍微复杂一点的步骤配置Client Auth,详情可参考这篇文章。
支持:
TLS Server Auth
TLS Client Auth
SNI,即一个443端口对应多个域名
优点:
Server Auth证书自动签发、自动续期
Client Auth手动配置
对应用的侵入性为0
缺点:
集群内部流量不受保护,这个问题可以通过Network Policy做namespace隔离来缓解
总结
优先考虑Ingress配合cert-manager的方案。
如果你对安全性有很高的要求,那么考虑LoadBalancer Service。