kubernetes 控制平台和节点之间的通信

这篇文章也是翻译的官网:Control Plane-Node Communication

这篇文章主要罗列(catelogs)控制平台(更确切的说是apiserver)和工作节点(nodes)之间的通信路径。目的是允许用户根据场景需求修改网络配置,以便在不受信任的网络上(比如:云提供商的完全公共IP上)运行集群。

通信只有两个方向:从节点到控制平台 和 从控制平台到节点。

从节点到控制平台(Node to Control Plane)

这个方向上通信都是始于 node 或者 node 上运行的 pod,终于 apiserver。控制平台上的 apiserver 被配置启用安全的 HTTPS 端口(默认443端口)监听远程连接,因为是 HTTPS,所以该监听端口还应该启动一种或多种方式的客户端身份认证功能,尤其是当匿名请求(anonymous requests)或者 服务账户令牌(service account token)被启动时。(总结就是:node 向 apiserver 发送信息时,需要验证身份)

应该给 nodes 配置集群的公共根证书(public root certificate)以便 node 通过使用有效的客户端证书安全地连接到 apiserver。

Kubernetes 在创建 pod 时会自动将公共根证书 和 有效的 bearer token 注入(inject)pod,因此,pod 可以通过 服务账户 (service account)安全的连接到 apiserver。所有命名空间的 service 都配有虚拟 IP地址,该地址(通过 kube-proxy )被重定向到 apiserver 的 HTTPS 端点。

控制平台内的其他组件也都通过这个安全端口和apiserver通信。

所以,从 node 到 apiserver 的通信方式是默认安全的,集群可以运行在公网或者不受信任的网络中。

从控制平台到节点(Control Plane to node)

这个方向上的通信有两条路径,第一条是:从 apiserver 到 kubelet (集群中的每个 node 上都有一个 kubelet);第二条是:apiserver 通过它的代理功能(proxy functionality)直接和 node、pod、service通信。

apiserver to kubelet

这条通信路径的主要作用是:

  • apiserver 获取 pods 的日志。
  • apiserver 通过 kubelet 可以 attaching 到正在运行的 pods。
  • 提供 kubelet 的端口转发(port-forwarding)功能。

这些连接,起于apiserver,终于 kubelet 的 HTTPS 端点。默认情况下,apiserver 不会校验 kubelet 的服务证书(serving certificate),这将使得连接可能受到中间人攻击(man-in-Middle attacks),并且在不可信或者公共网络上运行也不安全。

要验证此连接,使用 --kubelet-certificate-authority 命令选项,可以让 apiserver 校验 kubelet 的服务证书。如果前面的命令选项不可行,当下又要求不能在公网或不信任网络中连接,可以使用 SSH隧道。

最后,应该启用kubelet 身份验证和授权,以便保护 kubelet API。

apiserver to nodes, pods, and services

从 apiserver 到 node、pod 或者 service 的连接默认使用 HTTP 连接,因此该连接既不需要认证(authenticated) 也不需要加密(encrypetd)。所以该连接如果运行在不受信任或者公网上是不安全的。

SSH 隧道(SSH tunnels)

Kubernetes 支持用 ssh隧道来保护控制平台和节点之前的通信路径。 在这种配置下,apiserver 创建一个ssh隧道连接集群中的每个 node,并且将目的地是 kubelet、node、pod、service的所有流量都通过这个隧道发送。这个隧道确保流量不会被集群外的设备访问到。

SSH 隧道在 Kubernetes 1.18版本以后就被 Konnectivity service 给取代了。

Konnectivity service

官网介绍:Konnectivity service

总结

  1. 控制平台与节点之间的通信实际上是 控制平台中的 apiserver组件与 节点之间的通信。该通信有两个方向:apiserver 到 node 和 node 到 apiserver。
  2. node 到 apiserver:通过 HTTPS 端口执行通信,所以通信的发起方需要身份验证。
  3. apiserver 到 node:主要有两个路径,(1)apiserver 到 kubelet;(2)apiserver 到 nodes, pods, and services。
  4. apiserver 到 kubelet 路径也是通过 HTTPS端口执行的,默认apiserver 不校验 kubelet 的服务证书,但为了安全起见,还是校验吧。这个路径通信有三个作用:(1)获取 pods 日志;(2)通过 kubelet 可以 attaching 到正在运行的 pod;(3)为kubelet 提供端口转发功能。
  5. apiserver 到 nodes, pods, and services 路径是通过 apiserver 的 代理功能表实现的,采用 HTTP 方式通信,不需要认证也没有加密,所以不安全。为了提高该方式的安全性,可以采用 --kubelet-certificate-authority 命令选项;也可以使用 ssh隧道,不过在 kubernetes 1.18 以后,ssh 隧道就被 Konnectivity service 给代替了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值