节点与控制平面之间的通信
本文档记录了 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 或服务的流量通过隧道传递。该隧道确保流量不会暴露在节点运行的网络之外。
注意
SSH 隧道当前已弃用,因此除非您知道自己在做什么,否则不应该选择使用它们。 Konnectivity 服务 是此通信通道的替代方案。Konnectivity 服务
Kubernetes v1.18 [beta]
作为 SSH 隧道的替代方案,Konnectivity 服务为控制平面到集群的通信提供 TCP 级代理。Konnectivity 服务由两部分组成:控制平面网络中的 Konnectivity 服务器和节点网络中的 Konnectivity 代理。Konnectivity 代理启动与 Konnectivity 服务器的连接,并维护网络连接。启用 Konnectivity 服务后,所有控制平面到节点的流量都将通过这些连接。
请按照 Konnectivity 服务任务 在您的集群中设置 Konnectivity 服务。
下一步
- 了解有关 Kubernetes 控制平面组件 的信息
- 详细了解 中心-辐条模型
- 了解如何 保护集群
- 详细了解 Kubernetes API
- 设置 Konnectivity 服务
- 使用端口转发访问集群中的应用程序
- 了解如何 获取 Pod 的日志、使用 kubectl 端口转发