背景
Kubernetes Gateway
或许,确切地应该称为 Kubernetes Gateway API[1] (下称 GWAPI)。GWAPI 是由 SIG-NETWORK[2] 社区管理的开源项目,是一种规范,不提供实现。Gateway API 被认为是 Kubernetes Ingress API[3] 的继任者,在 2019 年的 Ingress 革命[4] 中首次被提出,并在 2020 年 11 月发布了第一个版本。GWAPI 的发展非常快,截止本文发出已经演进到了 1.0.0 版本[5],并且 1.1.0 也即将发布(已经发布了 1.1.0-rc2[6])。
GWAPI 是一种管理 Kubernetes 集群内部和集群外部流量的方法。它提供了一个更精细、更模块化的方法来描述路由和网关配置,相比于传统的 Ingress API,GWAPI 设计上更为灵活和可扩展。
cert-manager
cert-manager[7] 是一个专门为 Kubernetes 设计的自动化证书管理工具,它简化了在 Kubernetes 集群中使用 X.509 证书的管理过程。通过 cert-manager,用户可以轻松地为 Kubernetes 中的各种资源,如服务、应用程序和内部通信、自动颁发、更新和管理 SSL/TLS 证书。这对于确保数据传输的安全性非常重要。
cert-manager 主要有以下特性:
- 自动证书颁发和续期:cert-manager 可以自动处理证书的申请、续期和生命周期管理。
- 支持多种颁发源:cert-manager 支持多种证书颁发机构(CA),包括自签的证书;通过 ACME 使用公共的 CA 如 Let’s Encrypt;企业自建的 CA 系统,如 HashiCorp Vault[8]、铜锁的 RustyVault[9] 的 PKI 等。
- Kubernetes 原生集成:作为 Kubernetes 的原生组件,cert-manager 可以使用 CRD 来定义颁发者 Issuer、证书 Certificate 等资源。
尤其是最后这点,cert-manager 可以便捷地与 Kubernetes 生态的其他组件无缝集成,比如本文要介绍的与 K8s Gateway 的整合。
Why cert-manager?
在 Kubernetes 环境中,Gateway 作为整个集群的入口,是管理入站流量的重要组件。在众多功能特性中,安全性尤为突出和重要。其中,通信加密是确保数据安全的首要措施。通过使用 TLS/SSL 证书,Gateway 确保所有进出集群的数据都是加密的。这不仅保护了数据免受窃听和篡改,还确保了客户端和服务之间的通信是安全的。除了这种单向 SSL 加密以外,还可以配置为支持双向的 SSL 加密来实现端到端的安全验证。
而使用 cert-manager 来管理 Kubernetes Gateway 的证书提供了许多优势,显著提升操作效率、增强系统安全性,并且能够以可扩展和可维护的方式支持企业级的部署和管理:
- 自动证书管理:开发者和管理员可以减少手动介入,从而降低因手动处理证书相关任务(如忘记续期)而导致的错误和服务中断风险。这些都可以通过 cert-manager 的自动化来完成。
- 集成外部 CA:cert-manager 支持多种证书颁发机构(CA),包括 Let’s Encrypt、HashiCorp Vault、Venafi 等。这使得在 Kubernetes 环境中使用商业或自建的 CA 变得容易,并能确保证书的合规性和认证。
- 安全和合规性:自动化证书轮换和短期证书的使用,增强安全性和合规性(自动更新证书意味着攻击者窃取的证书只在很短的有效期内有用)。
- 与 Kubernetes 原生集成:与操作 GWAPI 的 CRD 一样,cert-manager CRD 的操作方式对开发者友好,也能够与 GWAPI 无缝集成。
演示说明
- FSM Gateway[10] 作为 Gateway API 的实现[11] 之一,也是 FSM[12] 整个生态中的众多组件之一,担负着 Kubernetes 入口流量管理的重任。在这次演示中,我们将采用 FSM Gateway 作为网关实施方案,利用其 TLS 卸载[13] 功能来增强上游服务的安全性。
- 前面提到 cert-manager 可以支持 多种颁发源[14],这里为了操作简便,选择最简单的自签发的 CA 证书。
图片
前提条件
- K8s 集群 >=1.22
- kubectl
- helm
安装 FSM Gateway
参考 FSM Gateway 的安装文档[15],我们使用 CLI 进行安装,当前 FSM 的最新版本为 1.2.4。
system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.2.4
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version