节点与控制平面之间的通信
本文档列出了API 服务器与 Kubernetes 集群之间的通信路径。目的是允许用户定制其安装以强化网络配置,使得集群可以在不受信任的网络上运行(或运行在云提供商的完全公共 IP 上)。
节点到控制平面
Kubernetes 具有一种“中心辐射”式 API 模式。所有来自节点(或其运行的 Pod)的 API 使用都终止于 API 服务器。其他控制平面组件均未设计为暴露远程服务。API 服务器被配置为在一个安全的 HTTPS 端口(通常是 443)上监听远程连接,并启用了一种或多种客户端身份认证形式。应该启用一种或多种授权形式,特别是当允许匿名请求或ServiceAccount 令牌时。
节点应该配置有集群的公共根证书,以便它们可以与有效的客户端凭据一起安全地连接到 API 服务器。一种好的方法是提供给 kubelet 的客户端凭据采用客户端证书的形式。关于 kubelet 客户端证书的自动化配置,请参见kubelet TLS 引导。
希望连接到 API 服务器的Pod可以利用 ServiceAccount 来安全地进行,这样 Kubernetes 在 Pod 实例化时会自动将公共根证书和有效的持有者令牌注入到 Pod 中。kubernetes Service(在 default
命名空间中)被配置了一个虚拟 IP 地址,该地址(通过 kube-proxy
)被重定向到 API 服务器上的 HTTPS 端点。
控制平面组件也通过安全端口与 API 服务器通信。
因此,从节点及其上运行的 Pod 到控制平面的连接的默认操作模式是默认安全的,并且可以在不受信任和/或公共网络上运行。
控制平面到节点
从控制平面(API 服务器)到节点有两个主要的通信路径。第一个是 API 服务器到在集群中每个节点上运行的kubelet进程。第二个是通过 API 服务器的*代理*功能从 API 服务器到任何节点、Pod 或 Service。
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 和 Service
从 API 服务器到节点、Pod 或 Service 的连接默认是纯 HTTP 连接,因此既未进行身份认证也未加密。通过在 API URL 中的节点、Pod 或 Service 名称前加上 https:
前缀,可以在安全的 HTTPS 连接上运行它们,但它们不会验证 HTTPS 端点提供的证书,也不会提供客户端凭据。因此,虽然连接会被加密,但它不提供任何完整性保证。这些连接目前在不受信任或公共网络上运行**不安全**。
SSH 隧道
Kubernetes 支持SSH 隧道以保护控制平面到节点的通信路径。在此配置中,API 服务器会向集群中的每个节点发起 SSH 隧道连接(连接到在端口 22 上监听的 SSH 服务器),并将所有发往 kubelet、节点、Pod 或 Service 的流量通过隧道传输。此隧道确保流量不会暴露在节点运行的网络之外。
注意
SSH 隧道目前已被废弃,因此除非你知道自己在做什么,否则不应选择使用它们。Konnectivity 服务是此通信通道的替代方案。Konnectivity 服务
Kubernetes v1.18 [beta]
作为 SSH 隧道的替代方案,Konnectivity 服务为控制平面到集群的通信提供了 TCP 级别的代理。Konnectivity 服务包含两部分:控制平面网络中的 Konnectivity 服务器以及节点网络中的 Konnectivity 代理。Konnectivity 代理会向 Konnectivity 服务器发起并维护网络连接。启用 Konnectivity 服务后,所有控制平面到节点的流量都将通过这些连接进行。
请按照Konnectivity 服务任务设置集群中的 Konnectivity 服务。
接下来
- 阅读关于Kubernetes 控制平面组件的内容
- 了解更多关于中心辐射模型的内容
- 学习如何保护集群
- 了解更多关于Kubernetes API 的内容
- 设置 Konnectivity Service
- 使用端口转发访问集群中的应用
- 学习如何获取 Pod 日志,使用 kubectl port-forward