节点和控制平面之间的通信
本文档列出了 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 或服务的流量。此隧道确保流量不会暴露在节点运行的网络之外。
注意
SSH 隧道目前已被弃用,因此您不应选择使用它们,除非您清楚自己在做什么。Konnectivity 服务 是此通信通道的替代方案。Konnectivity 服务
Kubernetes v1.18 [beta]
作为 SSH 隧道的替代方案,Konnectivity 服务为控制平面到集群的通信提供 TCP 级代理。Konnectivity 服务由两部分组成:控制平面网络中的 Konnectivity 服务器和节点网络中的 Konnectivity 代理。Konnectivity 代理发起与 Konnectivity 服务器的连接并维护网络连接。启用 Konnectivity 服务后,所有控制平面到节点的流量都将通过这些连接。
按照 Konnectivity 服务任务 在您的集群中设置 Konnectivity 服务。
下一步
- 阅读有关 Kubernetes 控制平面组件 的内容
- 了解更多关于 Hubs and Spoke 模型
- 了解如何 保护集群
- 了解更多关于 Kubernetes API 的内容
- 设置 Konnectivity 服务
- 使用端口转发访问集群中的应用程序
- 了解如何 获取 Pod 日志,使用 kubectl port-forward