kubelet
主要是管理pod生命周期的组件,具体功能包含如下:
- 从不同源中获取pod清单,并按需求启动pod;
- pod清单可从本地目录、给定kube-apiserver等获取,通过api server监听etcd目录,同步pod清单;
- 将运行时、网络和存储抽象了CRI(容器运行时接口,contianer runtime interface,通过调用docker接口将容器启动起来),CNI(容器网络接口,container network interface,帮你配置网络),CSI(容器存储接口,container storage interface,通过调用存储接口创建volume,然后跟节点发生绑定关系,attach上来,然后mount上你的volume);
- 负责汇报当前节点的资源信息和健康状态;
- 负责pod的健康检查和状态汇报;
kubelet监听etcd,所有针对Pod的操作都会被kubelet监听到。如果监听到的信息是创建和修改Pod的任务,则执行如下处理:
- 为该pod创建一个数据目录;
- 从API server读取该pod清单
- 为该pod挂载外部卷
- 下载pod用到的密钥、配置
- 检查已经在节点上运行的pod,如果该pod没有容器或Pause容器没有启动,则先停止pod里所有容器的进程。如果在pod中有需要删除的容器,则删除这些容器
- 用pause镜像为每个pod创建一个容器。pase容器用户接管pod中所有其他容器的网络。
- 为pod中每个容器做如下处理:
- 为容器计算一个 hash 值,然后用容器的名字去 Docker 查询对应容器的 hash 值。若查找到容器,且两者 hash 值不同,则停止 Docker 中容器的进程,并停止与之关联的 Pause 容器的进程;若两者相同,则不做任何处理;
- 如果容器被终止了,且容器没有指定的 restartPolicy,则不做任何处理;
- 调用 Docker Client 下载容器镜像,调用 Docker Client 运行容器。
kube-apiserver
API server 提供了对各类资源对象,如pod、sevice、deployment、crd等增删改查,以及watch的API接口,是整个集群的操作入口。主要提供以下功能:
- 提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过对API Server查询或修改数据,只有API server才直接操作etcd)
kube-controllermanager
controller manager作为集群内部的管理控制中心,负责集群内Node、Pod副本、服务端点Endpoint、命名空间Namespace、服务帐号ServiceAccount、资源定额ResourceQuota的管理,当某个Node意外宕机时,会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态
Replication Controller,称为副本控制器。副本控制器的作用即保证集群中一个RC所关联的Pod副本数始终保持预设值。
Node Controller通过API Server实时获取Node的相关信息,实现管理和监控集群中的各个Node节点的相关控制功能。
ResourceQuota Controller,资源配额管理确保指定的资源对象在任何时候都不会超量占用系统物理资源。
支持三个层次的资源配置管理:
1)容器级别:对CPU和Memory进行限制
2)Pod级别:对一个Pod内所有容器的可用资源进行限制
3)Namespace级别:包括
Pod数量
Replication Controller数量
Service数量
ResourceQuota数量
Secret数量
可持有的PV(Persistent Volume)数量
Namespace Controller,定时通过API Server读取这些Namespace信息。
Endpoint Controller,endpoints表示了一个Service对应的所有Pod副本的访问地址,而Endpoints Controller负责生成和维护所有Endpoints对象的控制器。它负责监听Service和对应的Pod副本的变化。
Service Controller,是属于kubernetes集群与外部的云平台之间的一个接口控制器。Service Controller监听Service变化,如果是一个LoadBalancer类型的Service,则确保外部的云平台上对该Service对应的LoadBalancer实例被相应地创建、删除及更新路由转发表。
kube-scheduler
Kubernetes Scheduler将待调度的Pod按照特定的调度算法和调度策略绑定到集群的某个合适的Node上,并将绑定信息存储到etcd中。
etcd
用于持久化存储kubenetes资源对象的kv数据库,etcd的watch API接口对于API server来说至关重要,通过这个接口,API server创新性地设计了List-Watch这种高性能的资源对象实时同步机制,使kubernetes可以管理超大规模集群,及时响应和快速处理集群中的各类事件。
kube-proxy
kube-proxy是实现k8s service的通信与负载均机制的重要组件。负责为pod创建代理服务,从api server获取所有server信息,并根据server信息创建代理服务,实现server到pod的请求路由和转发,从而实现k8s层级的虚拟转发网络。
kube-proxy进程获取每个Service的Endpoints,实现Service的负载均衡功能。
有三种运行模式:userspace、iptables和IPVS,其中userspace模式不常用,iptables模式主要问题是在服务多的时候产生太多iptables规则,非增量式更新会引入一定时延,大规模情况下有明显的性能问题。
IPVS是LVS项目的一部分,是一款运行在Linux 内核当中的4层负载均衡器,LVS 是 Linux VIrtual Server 的缩写,IPVS 是 LVS 的 IP 负载均衡模块,安装在 LVS 集群作为负载均衡的主节点。LVS 有三种调度模式:kube-proxy 的实现选择的是 NAT 模式。通过ipvs的NAT模式,对访问k8s service 的请求进行虚IP到POD IP的转发。
Pod的创建启动流程
创建启动流程:
- 用户创建pod,那么pod的请求会发给apiserver;
- kube-apiserver接收创建请求后,保存pod信息到etcd;
- 存储完成后,scheduler就去watch到pod的创建时间并完成调度,绑定pod;
- 绑定完成后,kubelet就watch到已经绑定的pod;
- kubelet会先创建启动一个pause容器并配置网络,然后再去拉取对应镜像,并创建启动该容器;
- kubelet向apiserver更新pod状态;
- pod状态更新后,去etcd里做持久化