节点与控制平面之间的通信

本文档记录了 API 服务器 与 Kubernetes 集群 之间的通信路径。目的是允许用户自定义他们的安装,以强化网络配置,以便可以在不受信任的网络(或云提供商上的完全公共 IP)上运行集群。

节点到控制平面

Kubernetes 采用“中心-辐条”API 模式。来自节点(或它们运行的 Pod)的所有 API 使用都终止于 API 服务器。其他控制平面组件均未设计为公开远程服务。API 服务器被配置为监听安全 HTTPS 端口(通常为 443)上的远程连接,并启用一种或多种形式的客户端 身份验证。应启用一种或多种形式的 授权,尤其是在允许 匿名请求服务帐户令牌 的情况下。

应为节点配置集群的公共根 证书,以便它们可以安全地连接到 API 服务器以及有效的客户端凭据。一种好的方法是,提供给 kubelet 的客户端凭据采用客户端证书的形式。有关 kubelet 客户端证书的自动配置,请参阅 kubelet TLS 引导

Pod 希望连接到 API 服务器,可以利用服务帐户安全地进行连接,以便 Kubernetes 在实例化 Pod 时自动将公共根证书和有效的承载令牌注入 Pod 中。kubernetes 服务(在 default 命名空间中)配置了通过 kube-proxy 重定向到 API 服务器上的 HTTPS 终结点的虚拟 IP 地址。

控制平面组件也通过安全端口与 API 服务器通信。

因此,来自节点和在节点上运行的 Pod 到控制平面的连接的默认操作模式在默认情况下是安全的,可以在不受信任和/或公共网络上运行。

控制平面到节点

从控制平面(API 服务器)到节点有两条主要的通信路径。第一个是从 API 服务器到在集群中的每个节点上运行的 kubelet 进程。第二个是从 API 服务器通过 API 服务器的代理功能到任何节点、Pod 或服务。

API 服务器到 kubelet

来自 API 服务器到 kubelet 的连接用于

  • 获取 Pod 的日志。
  • 附加(通常通过 kubectl)到正在运行的 Pod。
  • 提供 kubelet 的端口转发功能。

这些连接终止于 kubelet 的 HTTPS 终结点。默认情况下,API 服务器不会验证 kubelet 的服务证书,这使得连接容易受到中间人攻击,并且在不受信任和/或公共网络上运行时不安全

要验证此连接,请使用 --kubelet-certificate-authority 标志向 API 服务器提供根证书捆绑包,以用于验证 kubelet 的服务证书。

如果无法做到这一点,请在需要避免在不受信任或公共网络上连接的情况下,在 API 服务器和 kubelet 之间使用 SSH 隧道

最后,应启用 Kubelet 身份验证和/或授权 以保护 kubelet API。

API 服务器到节点、Pod 和服务

来自 API 服务器到节点、Pod 或服务的连接默认使用普通 HTTP 连接,因此既未经身份验证也未加密。可以通过在 API URL 中的节点、Pod 或服务名称前面加上 https: 来在安全的 HTTPS 连接上运行它们,但它们不会验证 HTTPS 终结点提供的证书,也不会提供客户端凭据。因此,虽然连接将被加密,但不会提供任何完整性保证。这些连接在不受信任或公共网络上运行时当前不安全

SSH 隧道

Kubernetes 支持 SSH 隧道 来保护控制平面到节点的通信路径。在此配置中,API 服务器将向集群中的每个节点启动一个 SSH 隧道(连接到在端口 22 上侦听的 SSH 服务器),并将所有发往 kubelet、节点、Pod 或服务的流量通过隧道传递。该隧道确保流量不会暴露在节点运行的网络之外。

Konnectivity 服务

功能状态: Kubernetes v1.18 [beta]

作为 SSH 隧道的替代方案,Konnectivity 服务为控制平面到集群的通信提供 TCP 级代理。Konnectivity 服务由两部分组成:控制平面网络中的 Konnectivity 服务器和节点网络中的 Konnectivity 代理。Konnectivity 代理启动与 Konnectivity 服务器的连接,并维护网络连接。启用 Konnectivity 服务后,所有控制平面到节点的流量都将通过这些连接。

请按照 Konnectivity 服务任务 在您的集群中设置 Konnectivity 服务。

下一步

上次修改时间:2022 年 11 月 24 日下午 7:13 PST:添加对控制平面-节点通信的引用和术语提示 (e3c09aedf1)