Deployment
Deployment控制器通过ReplicaSet来创建并管理Pod,同时具有版本升降级的功能。
ReplicaSet相对于ReplicationController来言拥有更先进的标签选择器,ReplicationController只支持旧式的标签选择器。
DaemonSet
DaemonSet可以确保每个工作节点上最多运行一个应用副本,这个应用副本类似于Linux操作系统中的daemon进程,这也正是DaemonSet名称的由来。
DaemonSet通常用于管理那些执行系统级的应用,比如:
每个工作节点运行一个存储服务,供该工作节点上其他应用使用;
每个工作节点运行一个日志收集服务,用于收集该节点上的运行日志;
每个工作节点运行一个监控指标收集服务,用于提供该节点的监控信息;
kube-controller-manager
kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
kubelet
kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理。
每个计算节点中都包含一个 kubelet,这是一个与Control Plane通信的微型应用。kublet 可确保容器在Pod内运行。
当Control Plane需要在节点中执行某个操作时,kubelet 就会执行该操作。
kube-proxy
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡。
每个计算节点中还包含 kube-proxy,这是一个用于优化 Kubernetes 网络服务的网络代理。
kube-proxy 负责处理集群内部或外部的网络通信(靠操作系统的数据包过滤层,或者自行转发流量)。
调度过程
待调度Pod被提交到 apiServer -> 更新到 Etcd -> 调度器 Watch Etcd 感知到有需要调度的Pod(Informer) -> 取出待调度Pod的信息 ->
Predicates: 挑选出可以运行该Pod的所有Node -> Priorities:给所有Node打分 -> 将Pod绑定到得分最高的Node上 ->
将Pod信息更新回 Etcd -> node的 kubelet 感知到 Etcd 中有自己node需要拉起的Pod -> 取出该Pod信息,做基本的二次检测(端口,资源等) -> 在node 上拉起该pod
创建流程
1、客户端提交创建请求,通过API Server的Restful API,或者用kubectl命令行工具。支持的数据类型包括JSON和YAML。
2、API Server处理用户请求,存储Pod数据到etcd。
3、kube-scheduler通过API Server查看未绑定的Pod。尝试为Pod分配主机。
4、kube-scheduler通过预选算法过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉,端口被占用的也被过滤掉;
5、kube-scheduler通过优选算法给主机打分,对预选筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个deployment类型的pod分布到不同的主机上,
使得资源均衡;或者将两个亲和的服务分配到同一个主机上。
6、选择主机:选择打分最高的主机,进行binding(调用apiserver将pod和node绑定)操作,结果存储到etcd中。
7、kubelet监听Api Server,根据调度结果执行Pod创建操作:绑定成功后,scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。
运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。
8、kubelet调用CNI(Docker 运行或通过 rkt)运行 Pod 的容器。并周期性的对容器生命周期进行探测。(健康检查readness-隔离、liveness-重启)
标签:巩固,名词,kubelet,API,pod,Pod,k8s,节点,kube
From: https://www.cnblogs.com/qcy-blog/p/18053282