多主 K8s 集群部署对每个服务、每个控制器节点使用唯一的证书是不典型的吗?我见过的大多数指南都会为每个服务(API、控制器、调度程序)生成唯一的证书,然后将这些证书用于每个控制器节点上的同名服务。
Kubernetes 是否允许或阻止每个服务、每个节点的唯一证书?使用 DNS/IP SAN,应该仍然可以让每个服务响应一个单一的集群地址,所以我很好奇这个决定是否是为了更简单的说明,或者它实际上是我缺少的一些要求。
谢谢你。
多主 K8s 集群部署对每个服务、每个控制器节点使用唯一的证书是不典型的吗?我见过的大多数指南都会为每个服务(API、控制器、调度程序)生成唯一的证书,然后将这些证书用于每个控制器节点上的同名服务。
Kubernetes 是否允许或阻止每个服务、每个节点的唯一证书?使用 DNS/IP SAN,应该仍然可以让每个服务响应一个单一的集群地址,所以我很好奇这个决定是否是为了更简单的说明,或者它实际上是我缺少的一些要求。
谢谢你。
Kubernetes 是否允许或阻止每个服务、每个节点的唯一证书?使用 DNS/IP SAN,应该仍然可以让每个服务响应一个单一的集群地址,所以我很好奇这个决定是否是为了更简单的说明,或者它实际上是我缺少的一些要求
当我们运行 Kubernetes 集群时,我们可以拥有数千个私钥和公钥,而不同的组件通常不知道它们是否有效。因此,证书颁发机构是第 3 方实体,它告诉感兴趣的元素“此证书是受信任的”。
文档:
每个 Kubernetes 集群都有一个集群根证书颁发机构 (CA)。CA 通常由集群组件用于验证 API 服务器的证书,由 API 服务器用于验证 kubelet 客户端证书等。
这实际上表明您可以在每个集群中拥有不同的证书,但这不是必需的,您可以想象您的 CA 的许多不同组合。您可以拥有一个负责签署所有密钥的全局 CA,或者每个集群一个 CA,一个用于内部通信,一个用于外部通信,等等。
任何提供由集群 CA 签名的客户端证书的请求都将被视为已通过身份验证。在该身份验证过程中,应该可以从通用名称字段 (CN) 中获取用户名,并从该证书的组织字段中获取组。所以答案是肯定的,您可以为每个服务、节点或集群中的任何组件使用不同的证书,除非它由集群中的证书颁发机构签名。
在为具有多个主节点(HA 集群)的主节点创建证书时,您必须确保负载均衡器 IP 和 DNS 名称是该证书的一部分。否则,每当客户端尝试通过 LB 与 API 服务器通信时,客户端都会抱怨,因为证书上的通用名称将与它想要与之通信的名称不同。
更进一步,每个核心集群组件除了主证书之外还有自己的客户端证书,因为它们中的每一个都具有对具有不同通用名称的集群的不同访问级别。值得注意的是,kubelet证书名称略有不同,因为每个 kubelet 将具有不同的身份(运行 kubelet 的主机名将是证书的一部分),它与 NodeAuthorizer 和 Node Restriction Admission Plugin 等其他功能相关。从最小权限的角度来看,这些特性很重要——它们在另一种情况下限制了 kubelet 对 apiserver 的无限制访问和交互。使用此功能,您可以将 kubelet 限制为只能修改其节点资源而不是整个集群,因为它只能读取其节点机密而不是集群中的所有机密等。
编辑 - 以下评论讨论:
假设您要就为什么更多人不使用多个证书征求意见,我认为这是因为它并没有真正提高安全性。由于证书不如 CA 重要——CA 是实体可以安全地相互交谈的可信保证者。因此,您可以制作多个 CA - 这样做的原因更多的是一种 HA 方法而不是安全性。当然,如果你有一个受信任的 CA,你就不需要更多的证书种类,因为你实际上并没有通过增加它们的数量来达到任何目标。