在阿里云K8S中的如何管理TLS证书

54次阅读

共计 1610 个字符,预计需要花费 5 分钟才能阅读完成。

本文介绍几种在阿里云 K8S 中管理 TLS 证书的方案。

证书申请方案

先看如何申请证书。

cert-manager

cert-manager 是一个集成在 k8s 中的工具,它可以做到自动从 Let’s encrypt 申请证书、自动更新证书、与 Ingress 无缝结合。

大多数情况下建议与 Ingress 集成的方式使用它,后面会讲。如果你仅需要签发功能,不需要和 Ingress 集成,则可参考 Setting up Issuers 和 Issuing Certificates。

优点:

  1. 自动签发
  2. 自动续期
  3. 与 K8S 集成良好
  4. 免费

缺点:

  1. 只能签发 Server Auth 证书,不能签发 Client Auth 证书
  2. 证书仅用做认证,没有商业版证书更高级的功能

阿里云平台购买

比如你可以在阿里云上购买 SSL 证书,一个账号的最多申请 100 个证书

优点:

  1. 多种类型证书可以供选择,有免费的有收费的
  2. 可在平台上管理
  3. 申请的证书可用在其他产品上,比如 SLB

缺点:

  1. 与 K8S 集成不好,需要手动导入到 Secret 中才能使用
  2. 只能签发 Server Auth 证书,不能签发 Client Auth 证书

用 CFSSL 自签发

你可以使用 CFSSL 自签发证书,有一篇参考文档。

优点:

  1. 可签发 Client Auth 证书

缺点:

  1. 手动管理证书
  2. 与 K8S 集成不好,需要手动导入到 Secret 中才能使用
  3. 自签发的 Server Auth 证书在浏览器端会报警告

总结

对于 Server Auth 证书:

  • 如果只是开发或者演示环境,cert-manager 方案更适合你
  • 如果是生产环境或者对证书有更高要求的,可以采用从平台购买的方案

对于 Client Auth 证书:

  • 你只能选择用 CFSSL 自签发的方式

证书部署方案

下面介绍几种部署方案。

部署在阿里云 SLB 上

虽然本小节讲的是部署在阿里云的 SLB 的产品上,但是它的思路和优缺点在其他云平台上基本是一致的。

做法是在 SLB 上配置 HTTPS 监听,ACK(阿里云 Kubernetes)在创建集群的时候会自动创建几个 SLB 实例,不要在这几个实例上配置 HTTPS 监听,因为在 ACK 中创建 Type=LoadBalancer 的 Service 的时候会把你做的配置刷新掉。

支持:

  1. Server Auth
  2. Client Auth

优点:

  1. 可利用阿里云的 SSL 证书管理功能
  2. 可用在阿里云的其他产品上,比如 ECS

缺点:

  1. 不支持 SNI,如果你有多个域名,因为一个 SLB 只会有一个公网 IP,此时你就有两种选择:

    • 在一个 SLB 上配置多个监听端口,这样 URL 中就会携带端口
    • 配置多个 SLB,避免前面一个方案的问题
  2. 要自己手动配置服务器组之类的信息
  3. K8S Service 类型得是 Node Port,意味着在同一 VPC 子网内部流量不受保护
  4. K8S 集群内部流量不受保护

LoadBalancer Service

创建 Type=LoadBalancer 的 Service 来暴露服务,然后在 Deployment/StatefulSets 里部署证书。

支持:

  1. Server Auth
  2. Client Auth

优点:

  1. 集群内部流量受保护
  2. VPC 子网内部流量受保护

缺点:

  1. 不支持 SNI,而且因为你只可能有一个公网 IP,因此 URL 中必定要携带端口
  2. 在应用中配置证书,且方式方法与应用所使用架构 / 类库有关

Ingress 配合 cert-manager

前面说过 cert-manager 支持与 Ingress 集成,你很少的工作能够配置 Server Auth,和一个稍微复杂一点的步骤配置 Client Auth,详情可参考这篇文章。

支持:

  1. TLS Server Auth
  2. TLS Client Auth
  3. SNI,即一个 443 端口对应多个域名

优点:

  1. Server Auth 证书自动签发、自动续期
  2. Client Auth 手动配置
  3. 对应用的侵入性为 0

缺点:

  1. 集群内部流量不受保护,这个问题可以通过 Network Policy 做 namespace 隔离来缓解

总结

优先考虑 Ingress 配合 cert-manager 的方案。

如果你对安全性有很高的要求,那么考虑 LoadBalancer Service。

正文完
 0