本篇列举控制平面(API服务器)和K8S集群之间通信的渠道,目的是允许用户自定义安装,以强化网络配置,从而使得K8S集群可以运行在不受信任的网络上(比如运行在云服务商提供的公网环境中)。
    节点到控制平面
    K8S有一个星型拓扑的API模式。所有API的调用(无论从node发起还是从pod发起)都在API服务器终止。除了API服务器,控制平面的其他组成部分不会对外暴露。API服务器被配置监听远程HTTPS连接(默认443端口),启用一种或多种客户端身份认证;应启用一种或多种形式的授权,特别是允许匿名访问或者使用服务账号令牌访问时。
    应该为节点提供公共根证书,以便它们使用客户端凭证与API服务器建立安全连接,一种好方法是使用客户端证书。需要连接API服务器的pod可以利用服务账号实现安全认证,以便在实例化时自动注入公共的根证书和合法的客户端凭证。K8S服务配置成虚拟IP,通过kube-proxy重定向到API服务器上的HTTPS端口。
    控制平面的其他组成部分也通过安全端口与API服务器通信。
    因此,从节点和pod到控制平面的连接,默认是安全的,可运行在非受信网络上。
    控制平面到节点
    从控制平面到节点有两种主要的通信路径。一种是从API服务器到运行在每个节点上的kubelet,一种是从API服务器通过代理到节点、pod或服务。
    API服务器到kubelet
    从API服务器到kubelet的连接用于:获取pod日志,连接到运行中pod,提供kubelet的端口转发功能。
    这些连接在kubelet的HTTPS端口终止,默认情况下,API服务器不验证kubelet的服务证书,从而使得连接容易受到中间人攻击,运行在非受信网络或者公网上是不安全的。
    为了验证连接,可以设置—kubelet-certificate-authority,提供根证书族以验证kubelet的服务证书。如果不能,可以使用SSH隧道。
    API服务器到节点、pod和服务
    默认情况下,API服务器到节点、pod、服务的连接是普通的HTTP连接,既没有加密也没有身份认证;连接也可以运行在安全的HTTPS连接上,但是并不验证HTTPS端点证书和客户端证书,因此,即使连接进行了加密,也不能提供完整性保证,因此这些连接运行在非受信网络或者公网上是不安全的。
    SSH隧道
    K8S使用SSH隧道保护控制平面到节点的通信安全。这种配置下,API服务器为集群中的每一个节点初始化隧道,通过隧道转发目的地是kubelet、节点、pod或服务的流量。隧道确保流量不会暴露给外部。
    SSH隧道已经被弃用,应该尽量避免使用。可以使用Konnectivity服务替代。
    Konnectivity服务
    作为SSH隧道的替代者,Konnectivity服务提供TCP层面的代理用于控制平面和集群的通信。Konnectivity服务由两部分组成:在控制平面网络中的Konnectivity服务端和在节点网络中的Konnectivity代理。代理初始化与服务端的连接,并维持连接。启用Konnectivity服务之后,所有从控制平面到节点的通信都走代理连接。