k8s 各组件功能
1.1、kube-apiserver
Kubernetes API server 提供了k8s各类资源对象的增删改查及watch等HTTP Rest接口,这些对象包括pods、services、replication controllers等,API Server 为REST操作提供服务,并为集群的共享状态提供前端,所有其他组件都通过该前端进行交互。
- RESTful API:是RSET风格的网络接口,REST描述的是在网络中client和server的一种交互形式。
- REST:是一种软件架构风格,或者说是一种规范,其强调HTTP应当以资源为中心,并且规范了URI的风格,规范了HTTP请求动作(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具有对应的语义。
1.2、kube-scheduler
kubernetes调度器是一个控制面进程,负责将Pods指派到节点上。通过调度算法为待调度Pod列表的每个Pod从可用Node列表中选择一个最适合的Node,并将信息写入etcd中。node节点上的kubelet通过API Server监听到kubernetes Scheduler 产生的Pod绑定信息,然后获取对应的Pod清单,下载Image,并启动容器。
策略:
- LeastRequestedPriority:优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)
- CalculateNodeLabelPriority:优先选择含有指定Label的节点
- BalanceResourceAllocation:优先从备选节点列表中选择各项资源使用率最均衡的节点
1.3、kube-controller-manager
kube-controller-manager:Controller Manager还包括一些子控制器(副本控制器、节点控制器、命名空间控制器和服务账号控制器等),控制器作为集群内部的管理控制中心,负责集群内部的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群中的pod副本始终处于预期的工作状态。
- controller-manager控制器每间隔5秒钟检查一次节点的状态。
- 如果controller-manager控制器没有收到自节点的心跳,则将该node节点标记为不可达。
- controller-manager将在标记为无法访问之前等待40秒。
- 如果该node节点被标记为无法访问后5分钟还没有恢复,controller-manager会删除当前node节点的所有pod并在其它可用节点重建这些pod。
pod高可用机制:
- node monitor period:节点监视周期,5s
- node monitor grace period:节点监视器宽限期,40s
- pod eviction timeout:pod驱逐超时时间,5m
1.4、kube-proxy
kube-proxy:kubernetes网络代理运行在node上它反映了node上Kubernetes API中定义的服务,并可以通过一组后端进行简单的TCP、UDP和SCTP流转发或者在一组后端进行循环TCP、UDP和SCTP转发,用户必须使用apiserver API创建一个服务来配置代理,其实就是kube-proxy通过在主机上维护网络规则并执行连接转发来实现kubernettes服务访问。
- kube-proxy 运行在每个节点上,监听API Server 中服务对象的变化,再通过管理iptables或者IPVS规则来实现网络的转发。
- kube-proxy不同的版本可以支持三种工作模式:
- UserSpace:k8s v1.1之前使用,k8s 1.2及以后就已经淘汰
- iptables:k8s 1.1版本开始支持,1.2开始为默认
IPVS:k8s 1.9引入到1.11为正式版本,需要安装ipvsadm,ipset工具包和加载ip_vs内核模块。IPVS相对iptables效率会更高一些,使用IPVS模式需要在运行Kube-Proxy的节点安装ipvsadm、ipset工具包和加载ip_vs内核模块,当Kube_Proxy以IPVS代理模块启动时,Kube-Proxy将验证节点上是否安装了IPVS模块,如果未安装,则Kube-Proxy将回退到iptables代理模式。
使用IPVS模式,Kube-Proxy会监视Kubernetes Service对象和Endpoints,调用宿主机内核Netlink接口以相应地创建IPVS规则并定期与Kubernetes Service对象Endpoints 对象同步IPVS规则,以确保IPVS状态与期望一致,访问服务时,流量将被重定向到其中一个后端Pod,IPVS使用哈希表作为底层数据结构并在内核空间中工作,这意味着IPVS可以更快地重定向流量,并且在同步代理规则时具有更好的性能,此外,IPVS为负载均衡算法提供了更多选项,例如:rr (轮询调度)、lc(最小连接数)、dh(目标哈希)、sh(源哈希)、sed(最短期望延迟)、nq(不排队调度)等。
1.5、Kubelet
kubelet是运行在每个worker节点的代理组件,它会监视已分配给节点的pod,具体功能如下:
- 向master汇报node节点的状态信息
- 接受指令并在Pod中创建docker容器
- 准备Pod所需的数据卷
- 返回pod的运行状态
- 在node节点执行容器健康检查
1.5、etcd
etcd是CoreOS公司开发目前是Kubernetes默认使用key-value数据存储系统,内部采用raft协议作为一致性算法,etcd基于Go语言实现,用于保存kubernetes的所有集群数据,etcd支持分布式集群功能,生产环境使用时需要etcd数据提供定期备份机制。etcd有多个不同的API访问版本,v1版本已经废弃,etcd v2和v3 本质上是共同一套raft协议代码的两个独立的应用,接口不一样,存储不一样,数据互相隔离,也就是说如果从Etcd v2升级到Etcd v3,原来v2的数据还是只能用v2的接口访问,v3的接口的数据也只能访问通过v3的接口访问。
etcd具有下面这些属性:
- 完全复制:集群中的每个节点都可以使用完整的存档
- 高可用性:Etcd可用于避免硬件的单点故障或网络问题
- 一致性:每次读取都会返回跨多主机的最新写入
- 简单:包括一个定义良好、面向用户的API(gRPC)
- 安全:实现了带有可选的客户端证书身份验证的自动化TLS
- 快速:每秒10000次写入的基准速度
- 可靠:使用Raft算法实现了存储的合理分布Etcd的工作原理
1.6、DNS
DNS负责为整个集群提供DNS服务,从而实现服务之间的访问。
- coredns
- kube-dns:1.18
- sky-dns
1.7、Dashborad
Dashbord是基于网页的Kubernetes用户界面,可以使用Dashboard获取运行在集群中的应用的概念信息,也可以创建或者修改Kubernetes资源(如Deployment,Job,DaemonSet等等),也可以对Deployment实现弹性伸缩、发起滚动升级、重启Pod或者使用向导创建新的应用。