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

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

节点到控制平面

Kubernetes 采用“中心辐射型”API 模式。所有来自节点(或其运行的 Pod)的 API 使用都终止于 API 服务器。其他控制平面组件均未设计用于暴露远程服务。API 服务器配置为在安全的 HTTPS 端口(通常为 443)上监听远程连接,并启用了多重客户端 认证 形式。应启用多重 授权 形式,特别是当允许 匿名请求服务账号令牌 时。

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

希望连接到 API 服务器的 Pod 可以通过利用服务账号安全地进行连接,这样 Kubernetes 在实例化 Pod 时会自动将公共根证书和有效的持有者令牌注入到 Pod 中。`kubernetes` 服务(在 `default` 命名空间中)配置了一个虚拟 IP 地址,该地址通过 `kube-proxy` 重定向到 API 服务器上的 HTTPS 端点。

控制平面组件也通过安全端口与 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 服务。

下一步

上次修改于太平洋标准时间 2024 年 9 月 1 日凌晨 1:54:修复“overview/components/#...”到“architecture/#...”的断开链接 (#47724) (7e64c2db82)