K8S集群包括master节点和多个worker 节点。
下面从master和worker 两个方面来说集群的组件:
master
master负责调度管理整个集群,包含以下组件:
api server
是整个集群的网关接口,由kube-apiserver守护程序运行为服务,通过HTTP/HTTPS将 RESTFUL API公开给用户,是发往集群的所有REST命令的接入点,用于接收,校验,响应所有REST请求,并将结果存储在etcd中。
etcd
k8s集群的所有状态信息都存储在etcd内,etcd是基于raft协议开发的分布式key-value存储,etcd还为存储的数据提供了watch(监听)机制,用于监视和推送变更,api server是k8s集群内唯一可以和etcd通信的组件。
controller manager
k8s提供了数十种控制器,包括 node controller,namespace controller,service controller,endpoints controller,replication controller,job controller,daemon set controller 等 。控制器的作用是负责实现用户通过api server提交的状态声明,然后通过一些列操作驱动api server对象的当前状态逼近,或等于期望状态。而每个控制器都是一个单独的进程,因此为了降低复杂性,k8s将这些控制器统一编排到一个二进制程序文件,kube-controller-manager 并以单个进程运行。
scheduler
为新建立的pod进行节点选择,即就是分配合适的机器,负责计算的资源调度。具体来说:为api server接收到的每一个pod创建请求,并在集群上为其匹配到一个最佳工作节点,kube-scheduler是默认的调度器程序,它在匹配工作节点时的考量因素包括硬件,软件,策略约束、亲和力,规范等特征。
Worker
一个k8s集群通常有多个node节点,来提供足够的承载力来运行容器化应用和其他的工作负载。每个node会定期向master报告自身的状态变化并接受master管理。包含以下组件:
kubelet
Kubelet 在每个node上都有,包括主节点,它负责处理master节点下发到本节点的任务,管理pod,及pod中的容器,每个kubelet进程都会在api server上注册自身的信息,定期上master上报节点资源使用情况,并通过caAdvisor监视器监控容器,节点资源,这里的caAdvisor 已被默认集成到kubelet组件内,用来监控工作节点资源。
容器运行时环境docker
pod是一组容器集合,并不负责真正运行容器,真正运行容器的是底层的容器运行时。kubelet通过CRI(容器运行时接口)来支持多种类型的容器运行时环境,包括docker,containerd,CRI-O,runC等。
kube-proxy
监听 api server中service 和endpoint的变化情况,创建路由规则来提供服务ip和负载均衡功能,简单来说就是kube-proxy相当于是service的透明代理兼负载均衡器,核心功能是将某个Service的访问请求转发至后端的多个pod实例。
add-ons
插件分为必须插件和可选插件。
必须有的插件:网络插件,常用的有flannel,calico,canal,weave net等;kubeDNS
可选:ingress controller,coreDNS,集群日志系统, 容器资源监控系统;
需要注意的是:区别于master节点上的控制器管理器内的控制器,ingress controller不运行为 kube-controller-manager的一部分,仅是k8s集群的一个附件,需要在集群上单独部署。
整体架构图:
可以得到K8S架构图如下图,重点配合以上文字理解各个组件的作用以及组件之间的关系