集群信任

本页面介绍 Google Kubernetes Engine (GKE) 集群中的信任,包括控制层面和节点如何对请求进行身份验证。

集群内通信

集群中有许多用于 Kubernetes 组件间通信的连接。

控制层面到节点

控制层面与节点进行通信是为了管理容器。如果控制层面向节点发送请求(例如 kubectl 日志),该请求会通过 SSH 隧道发送,并使用 TLS 进行进一步保护,提供身份验证、完整性和加密。如果节点向控制层面发送请求(例如 kubelet 到 API 服务器),该请求使用双向 TLS 进行身份验证和加密。

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

节点到节点

节点可作为特定工作负载的一部分与其他节点通信。当节点向其他节点发送请求时,系统会对该请求进行身份验证,如果该连接穿过由 Google 控制的物理边界,则系统将对该请求进行加密。Kubernetes 组件不需要节点到节点的通信。 如需了解详情,请阅读传输加密白皮书

Pod 到 Pod

Pod 可作为特定工作负载的一部分与其他 Pod 通信。当 Pod 向其他 Pod 发送请求时,系统不会对该请求进行身份验证,也不会进行加密。Kubernetes 组件不需要 Pod 到 Pod 的通信。您可以使用网络政策限制 Pod 到 Pod 的流量,并且可使用 Istio 等服务网格对该流量进行加密,或以其他方式实现应用层加密。

etcd 到 etcd

etcd 的实例可与 etcd 的其他实例进行通信,以使状态保持更新。当 etcd 的实例向其他实例发送请求时,系统会使用双向 TLS 对该请求进行身份验证和加密。流量永远不会离开受防火墙保护的归 GKE 所有的网络。

控制层面到 etcd

此通信完全通过 localhost 完成,不进行身份验证,也不加密。

信任根

GKE 具有以下配置:

  • 集群根证书授权机构 (CA) 用于验证 API 服务器和 kubelet 的客户端证书。也就是说,控制层面和节点具有相同的信任根。集群节点池中的任何 kubelet 都可以通过提交证书签名请求,使用 certificates.k8s.io API 向该证书授权机构请求证书。
  • 每个集群的单独 etcd 证书授权机构用于验证 etcd 的证书。

API 服务器和 kubelet

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

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

在创建集群中的每个节点时,系统会为其注入共享口令,该共享口令可用于向集群根证书授权机构提交证书签名请求,并获取 kubelet 客户端证书。然后,kubelet 使用这些证书对向 API 服务器发出的请求进行身份验证。除非启用了元数据隐藏,否则 Pod 可以访问该共享密钥令牌。

API 服务器和 kubelet 证书的有效期为五年,但是通过执行凭据轮替,可以更快地手动轮替证书。

etcd

在 GKE 中,etcd 依赖于每个集群的单独 etcd 证书授权机构提供信任。

etcd 证书授权机构的根密钥分发给控制层面所运行的每个虚拟机的元数据。在控制层面虚拟机上执行的任何代码,或者能够访问这些虚拟机的计算元数据的任何代码,能够以该证书授权机构的身份签署证书。即使集群中的 etcd 被盗用,证书授权机构也不会在集群之间共享,因此不会影响其他集群。

etcd 证书的有效期为五年。

轮替证书

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

后续步骤