集群信任

本文档介绍 Google Kubernetes Engine (GKE) 集群中的信任模型,包括集群内的通信以及如何针对控制平面等组件对请求进行身份验证。本文档假定您了解以下内容:

本文档面向希望了解 GKE 集群信任模型的安全专家。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

集群内通信

GKE 会对集群组件之间的流量应用各种安全机制,如下所示:

  • 控制平面与节点之间的流量:控制平面会与节点进行通信以便管理容器。当控制平面向节点发送请求(例如 kubectl logs)时,请求会通过 Konnectivity 代理隧道发送。控制平面发送的请求会通过 TLS 进行身份验证和保护。如果节点向控制平面发送请求(例如从 kubelet 到 API 服务器),该请求会使用双向 TLS (mTLS) 进行身份验证和加密。

    所有新创建和更新的集群都使用 TLS 1.3 来实现控制平面到节点的通信。TLS 1.2 是控制平面到节点通信支持的最低版本。

  • 节点之间的流量:节点是 Compute Engine 虚拟机。 Google Cloud 生产网络中各节点之间的连接会进行身份验证和加密。如需了解详情,请参阅传输加密白皮书中的“虚拟机到虚拟机”部分。

  • Pod 之间的流量:当 Pod 向另一个 Pod 发送请求时,默认情况下该流量不会进行身份验证。GKE 会在网络层对不同节点上的 Pod 之间的流量进行加密。默认情况下,同一节点上 Pod 之间的流量不会加密。如需详细了解网络层加密,请参阅 Google Cloud 虚拟网络加密和身份验证

    您可以使用 NetworkPolicy 限制 Pod 到 Pod 的流量,并可以使用服务网格(如 Cloud Service Mesh)或其他应用层加密方法对所有 Pod 到 Pod 的流量(包括同一节点上的流量)进行加密。

  • 控制平面组件之间的流量:在控制平面上运行的各种组件之间的流量使用 TLS 进行身份验证和加密。流量永远不会离开受防火墙保护的 Google 拥有的网络。

信任根

GKE 具有以下配置:

  • 集群根证书授权机构 (CA) 用于验证 API 服务器和 kubelet 的客户端证书。也就是说,控制平面和节点具有相同的信任根。集群节点池中的任何 kubelet 都可以通过提交证书签名请求,使用 certificates.k8s.io API 向该证书授权机构请求证书。根 CA 的生命周期有限,如集群根 CA 生命周期部分所述。
  • 在控制平面虚拟机上运行 etcd 数据库实例的集群中,单独集群级 etcd 对等 CA 用于在 etcd 实例之间建立信任关系。
  • 在所有 GKE 集群中,一个单独的 etcd API CA 用于在 Kubernetes API 服务器和 etcd API 之间建立信任关系。

API 服务器和 kubelet

API 服务器和 kubelet 依赖于集群根证书授权机构提供信任。在 GKE 中,控制平面 API 证书由集群根 CA 签名。每个集群运行其自己的证书授权机构,因此如果一个集群的证书授权机构被盗用,其他集群证书授权机构将不受影响。

一个内部服务会管理此 CA 的根密钥,这些根密钥不可导出。该服务接受证书签名请求,包括来自每个 GKE 集群中 kubelet 的请求。即使集群中的 API 服务器遭入侵,证书授权机构也不会被盗用,因此不会影响其他集群。

在创建集群中的每个节点时,系统会为其注入共享密钥令牌,该共享密钥令牌可用于向集群根证书授权机构提交证书签名请求,并获取 kubelet 客户端证书。然后,kubelet 使用这些证书对向 API 服务器发出的请求进行身份验证。节点上的 Pod 可以访问此共享密钥令牌,除非您启用安全强化型 GKE 节点Workload Identity Federation for GKE

集群根 CA 生命周期

集群根 CA 的生命周期有限,在此之后,由过期 CA 签名的任何证书均无效。按照检查凭证生命周期中的说明检查集群 CA 的大致到期日期。

您应该在现有根 CA 过期之前手动轮替凭据。如果 CA 已过期,并且您未轮替凭据,则您的集群可能会进入不可恢复的状态。GKE 采用以下机制来尝试和防止不可恢复的集群:

  • 集群在 CA 过期前七天进入 DEGRADED 状态
  • GKE 会在 CA 过期前 30 天尝试自动凭证变换。此自动变换会忽略维护窗口,并且可能会在 GKE 重新创建节点以使用新凭证时导致中断。外部客户端(如本地环境中的 kubectl)将无法运行,直到您将其更新为使用新凭据。

如需了解如何执行变换,请参阅变换集群凭证

集群状态存储

GKE 集群将 Kubernetes API 对象的状态以键值对的形式存储在数据库中。控制平面中的 Kubernetes API 服务器使用 etcd API 与此数据库进行交互。GKE 使用以下技术之一运行集群状态数据库:

  • etcd:集群使用在控制平面虚拟机上运行的 etcd 实例。
  • Spanner:集群使用在控制平面虚拟机外部运行的 Spanner 数据库。

无论集群使用哪种数据库技术,每个 GKE 集群都会在控制平面中提供 etcd API。为了加密涉及集群状态数据库的流量,GKE 会使用以下一个或两个集群级 CA:

  • etcd API CA:用于针对与 etcd API 端点之间的往返流量,对证书进行签名。每个 GKE 集群中都会运行一个 etcd API CA。
  • etcd 对等 CA:用于针对控制平面上 etcd 数据库实例之间的流量,对证书进行签名。在使用 etcd 数据库的任何集群中都会运行一个 etcd 对等 CA。使用 Spanner 数据库的集群不使用 etcd 对等 CA。

etcd API CA 的根密钥会分发给运行控制平面的每个 Compute Engine 实例的元数据。etcd API CA 不会在集群之间共享。

etcd CA 证书的有效期取决于集群创建日期,如下所示:

  • 对于在 2021 年 10 月之前创建的集群,证书的有效期为 5 年。
  • 对于 2021 年 10 月之后创建的集群,证书的有效期为 30 年。 无论集群创建日期如何,在证书变换期间创建的新 etcd CA 证书的有效期均为 30 年。系统会在证书过期前 6 个月自动变换证书。

证书轮替

要轮替集群的所有 API 服务器和 kubelet 证书,请执行凭据轮替。您无法触发 etcd 证书的轮替;在 GKE 中,系统为您管理该操作。

后续步骤