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