本文介绍几种在阿里云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。