kubernetes组件详解和创建POD流程

一.各组件功能说明

kubernetes集群是由两种节点构成,包含Master节点和工作节点。
其中Master节点中主要有三个重要的组件:

  • kube-apiserver:负责响应用户的管理请求,进行指挥协调等工作。
  • kube-scheduler:资源调度,负责决定将Pod放在哪个Node上运行。
  • kube-controller-manager:负责管理集群各种资源,保证资源处于预期的状态。
    工作节点运行两个重要组件,分别为kubelet和kube-proxy:
  • kubelet:kubelet是node的agent,当kube-scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image,volume等)发送给该节点的kubelet,kubelet会根据这么信息创建和运行容器,并向Master节点报告运行状态。
  • kube-proxy:service在逻辑上代表了后端的多个Pod,外部通过service访问Pod,service接收到请求就需要kube-proxy转发到Pod。每个Node上都会运行kube-proxy服务,负责将访问的service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡,这里有两种实现方式:LVS或者Iptables。

这里要了解kubernetes的创建POD的详细流程,我们首先需要了解各组件的功能,这里就kubernetes的组件进行具体说明。

1.1 kube-apiserver

kube-apiserver提供kubernetes所有资源增删改查的唯一入口,也是集群控制的入口,提供HTTP/HTTPS restful的接口,完成集群管理、资源配额、访问控制、认证授权以及对etcd的操作。

1.2 kube-controller-manager

kube-controller-manager负责管理集群各种资源,保证资源处于预期的状态。kube-controller-manager由多种controller-manager组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等。由kube-controller-manager完成的主要功能包括生命周期功能和API业务逻辑,具体如下:

  • 生命周期功能:包括Namespace创建和生命周期、Event垃圾回收、Pod终止相关的垃圾回收、级联垃圾回收及Node垃圾回收等。
  • API业务逻辑:例如由ReplicaSet执行的Pod扩展等。

1.3 kube-scheduler

资源调度,负责决定将Pod放到哪个Node上运行。kube-scheduler在调度时会对集群的结构进行分析,当前各个节点的负载,以及应用对高可用、性能等方面的需求。

1.4 kubelet

kubelet是Node的agent,当kube-scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向master节点报告运行状态。

1.5 kube-proxy

将到service的访问转发到后端的多个Pod实例上,维护路由信息。对于每一个TCP类型的kubernetes service,kube-proxy会在本地建立一个socketserver来负责均衡算法,使用rr负载均衡算法。

1.6 etcd

负责保存kubernetes集群的配置信息和各种资源的状态信息。当数据发生变化时,kubernetes会快速通知kubernetes相关组件。etcd是一个独立的服务组件,并不隶属kubernetes集群。生产环境中etcd应以集群方式运行,以确保服务的可用性。
etcd不仅仅提供键值数据存储,而且还为其提供了监听(watch)机制,用于监听和推送变更。在kubenetes集群系统中,etcd的键值发生变化会通知到kube-apiserver,并由其通过watch API向客户端输出。

二.集群各组件间的交互

kubernetes作为所有资源增删改查的唯一入口,各组件均以list-watch的方式kube-apiserver发送请求。为减少kube-apiserver的压力,各组件都采用缓存来缓存数据。功能模块在某些情况下不直接访问kube-apiserver,而是通过访问缓存来间接访问kube-apiserver。

2.1 kubelet与kube-apiserver交互

每个Node上的kubelet在每个时间周期,就会调用kube-apiserver的REST接口来报告自身状态。kubelet通过watch接口,监听pod信息、监听创建、删除、修改实践。

2.2 kube-scheduler与kube-apiserver交互

kube-scheduler通过kube-apiserver的watch接口来监听,监听到新建副本后,检索所有符合该Pod要求的Node列表,开始执行Pod调度,调度成功后将Pod绑定到具体节点。

2.3 kube-controller-manager和kube-apiserver

kube-controller-manager中包含多个controller,举例:Node Controller模块通过kube-apiserver提供的watch接口实现监控Node信息,并做相应处理。

三.Pod创建流程

这里介绍一下kubernetes的pod创建的逻辑流程:

  • 客户端提交创建Pod的请求,这里可以通过kube-apiserver的RESTful API,也可以使用kubectl命令行工具。支持的数据类型包括JSON和YAML。
  • kube-apiserver处理用户请求,存储Pod数据到etcd。
  • kube-scheduler通过kube-apiserver查看未绑定的Pod,尝试为Pod分配主机。
  • 过滤主机(调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
  • 主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。
  • 选择主机:择打分最高的主机,进行binding操作,结果存储到etcd中。
  • kubelet根据调度结果执行Pod创建操作: 绑定成功后,scheduler会调用APIServer的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器。
原文地址:https://www.cnblogs.com/yuhaohao/p/12909764.html