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 给代替了。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: K8s架构和组件之间通信是通过API Server实现的。K8s中的所有组件都可以通过API Server进行通信和交互,包括kubeletkube-proxy、scheduler、controller-manager等。API Server作为K8s的核心组件,负责接收和处理所有的API请求,并将请求转发给相应的组件进行处理。同时,API Server还负责对所有的资源对象进行验证和授权,确保系统的安全性和稳定性。 ### 回答2: K8s是一个容器编排和管理系统,它由多个组件构成,这些组件之间需要进行通信以实现集群管理和应用部署等功能。 K8s的架构中包含以下几个重要组件: 1. Master组件:包括API ServerController Manager、Scheduler等。Master组件负责整个集群的管理和决策。它们之间需要通过API Server进行通信API Server提供了集群内各个组件的接口,其他组件可以通过发送RESTful请求给API Server来获取和操作集群状态。 2. Node组件:包括kubeletkube-proxy等。Node组件是运行在每个节点上的代理程序,负责与Master组件通信kubelet是K8s的主要工作进程,它从API Server获取Pod的配置信息,然后将Pod的容器创建、启动和管理工作交给容器运行时(如Docker)。kube-proxy则负责负载均衡和网络代理。 3. Etcd:Etcd是一个分布式键值存储系统,用于存储集群的状态信息,包括节点状态、Pod定义、服务等。Master和Node组件通过与Etcd集群通信来读取和更新集群状态。 4. CNI插件:Container Network Interface(CNI)插件用于管理容器网络。它负责为Pod分配IP地址、配置容器网络和网络隔离等。不同的CNI插件可以与K8s集成,并提供网络通信能力。 以上组件之间通信方式如下: 1. Master组件之间通信:Master组件之间通过互相访问API Server进行通信,通过API Server获取集群状态和配置信息。 2. Master和Node组件之间通信:Master组件与Node组件之间通过kubelet进行通信。Master通过API Server发送指令给kubeletkubelet再调用容器运行时(如Docker)进行容器的创建和管理。 3. Node和Etcd之间通信Node组件通过kubelet与Etcd集群通信,从而读取和更新集群的状态信息。 4. Pod之间通信:Pod中的容器之间可以通过localhost进行通信,它们可以互相访问和通信。同时,K8s通过CNI插件为每个Pod分配唯一的IP地址,从而允许不同节点上的Pod进行网络通信。 总体而言,K8s通过API Serverkubelet、Etcd和CNI插件等组件之间通信来实现集群的管理和容器的部署。这些通信机制保证了集群的可靠性、可扩展性和高效性。 ### 回答3: Kubernetes(k8s)是一种开源的容器编排引擎,用于管理容器化应用程序的部署、扩展和管理。k8s架构由多个组件组成,包括Master节点上的控制器组件和Worker节点上的工作组件,它们之间通过各种通信机制进行协作和通信。 首先,k8s的控制器组件和工作组件之间通常通过API服务器进行通信API服务器是k8s集群的主要接口,所有的操作和查询都通过API服务器进行处理。控制器和工作组件通过API服务器提供的API调用各种功能,例如创建、删除和更新资源。 其次,k8s中的控制器组件和工作组件之间还利用了etcd这个分布式键值存储系统来共享集群状态信息。etcd用于存储集群中的各种配置数据和运行时状态,包括Pod、Node和Service等的信息。控制器组件和工作组件可以通过etcd的API来读取和更新这些信息,以实现集群中各个组件的一致性。 另外,k8s中的控制器组件和工作组件之间通过网络通信来实现集群的管理和调度。它们通过kube-proxy组件来管理集群内部和外部的网络连接。kube-proxy负责配置底层网络实现(如iptables或IPVS)来处理流量转发和负载均衡。控制器组件和工作组件可以通过kube-proxy建立网络连接,并通过网络传输API调用和数据。 此外,k8s的控制器组件和工作组件之间还通过事件系统进行通信。每个组件可以通过事件系统发布和监听事件,以便及时获取其他组件的状态和变化。控制器组件可以监听工作组件的事件,并对其状态进行相应的调整。工作组件也可以监听控制器组件的事件,并根据事件进行相应的处理。 总之,k8s架构和组件之间通过API服务器、etcd、网络通信和事件系统等多种通信机制进行协作和通信,保障了集群的正常运行和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值