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

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

节点到控制平面

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

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

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

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

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

控制平面到节点

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

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 [测试版]

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

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

下一步

上次修改时间:2022 年 11 月 24 日下午 7:13 PST:为控制平面-节点通信添加参考和词汇表工具提示 (e3c09aedf1)