Kubernetes之组件介绍
1、架构介绍
kubernetes是Google开源的容器集群管理系统,是大规模容器应用编排系统,是在众多容器之上的又一抽象层。
它支持自动化部署,大规模可伸缩,应用容器化管理。
在kubernetes中部署应用是一件容易的事,因其有着弹性伸缩,横向扩展的优势并同时提供负载均衡能力以及良好的自愈性(自动部署,自动重启,自动复制,自动扩展等)。
整体架构如下图:
2、核心组件介绍
2.1 Master组件
2.1.1 API Server
- Kubernetes API集群的统一入口,各组件的协调者,以RESTful API提供接口方式,所有的对象资源的增删改查和监听操作都交给API Server处理后再提交给etcd数据库做持久化存储。即是所有服务访问统一入口。
2.1.2 Controller Manager
- 在pod工作流中起着管理和控制整个集群的作用,主要对资源对象进行管理,当node节点中运行的pod对象或是node自身发生意外或故障时,Controller Manager会及时发现并处理,以确保整个集群处于理想工作状态。核心逻辑就是和解循环;控制器负责创建kubernetes集群上的具体对象,并确保其当前状态status与用户自定的期望状态spec保持相同。即维持副本期望数目。
2.1.2.1 Replication Controller
Replication Controller称为副本控制器,在Pod工作流中主要用于保证集群中Replication Controller所关联的Pod副本数始终保持在预期值,比如若发生节点故障的情况导致Pod被意外杀死,Replication Controller会重新调度保证集群仍然运行指定副本数,另外还可通过调整Replication Controller中spec.replicas属性值来实现扩容或缩容;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes中建议使用ReplicaSet来取代ReplicationController。
ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。
虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。
Horizontal Pod Autoscaling(HPA)仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩所容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容。
2.1.3 Scheduler
- 在整个pod工作流中负责调度pod到具体的node节点,Scheduler通过api server监听pod状态,如果有待调度的pod,则根据Scheduler Controller中预选策略和优选策略给各个预备node节点打分排序,最后将pod调度到分数最高的node上,然后由node中的kubelet组件启停pod。当然如果部署pod指定了NodeName属性,Scheduler会根据该属性指调度到指定node节点上。即负责接受任务,选择合适的节点进行分配任务。
- 整个调度流程分两步:
- ①预选策略(Predicates):遍历所有当前kubernetes集群中的Node,按照具体的预选策略选出符合要求的Node列表;如果没有符合的Node节点,则该Pod会被暂时挂起,直到有Node节点能满足条件。通用的预选策略筛选规则有:PodFitsResources、PodFitsHostPorts、HostName、MatchNodeSelector。
- ②优选策略(Priorities): 有了第一步预选策略的筛选后,再根据优选策略给待选Node节点打分,最终选择一个分值最高的节点去部署 Pod。kubernetes用一组优先级函数处理每一个待选的主机。每一个优先级函数会返回一个0-10的分数,分数越高表示节点越适应需求,同时每一个函数也会对应一个表示权重的值。最终主机的得分用以下公式计算得出: FinalScoreNode = (weight1 priorityFunc1) + (weight2 priorityFunc2) + … + (weightn * priorityFuncn) 。
2.1.4 ETCD
- 官方将它定位成一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。即是键值对数据库,储存K8S集群所有重要信息(持久化)。
2.1.5 CoreDNS
- 提供集群的dns服务,实现服务注册和服务发现,为service提供dns记录。即可以为集群中的SVC创建一个域名IP的对应关系解析。
2.2 Node组件
2.2.1 Kubelet
- kubelet在pod工作流中是为保证它所在的节点pod能够正常工作,核心为监听API server,当发现节点的pod配置发生变化则根据最新的配置执行相应的动作,保证pod在理想的预期状态,其中对pod进行启停更新操作用到的是容器运行时。另外kubelet也负责volume(cvi)和网络(cni)管理。
- kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret,获取容器和节点状态等工作,kubelet将每个Pod转换成一组容器。即是直接跟容器引擎交互实现容器的生命周期管理。
2.2.2 Kube-proxy
- 在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。实现让Pod节点(一个或者多个容器)对外提供服务。
- kube- proxy负责为service提供cluster内部的服务发现和负载均衡(负责将后端pod访问规则具体为节点上的iptables/ipvs规则)。即负责写入规则至IPTABLES、IPVS实现服务映射访问。
- IPTABLES组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
- IPVS被称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS(Linux Virtual Server即Linux虚拟服务器)下的提供负载平衡功能的一种技术。
2.2.3 Container
- 负责镜像管理以及pod和容器的真正运行(CRI)。
- CRI即Container Runtime Interface(容器运行时接口),定义了容器和镜像的服务的接口,因为容器运行时与镜像的生命周期是彼此隔离的,因此需要定义两个服务,该接口使用Protocol Buffer,基gRPC。
2.3 其它组件
2.3.1 Dashboard
- 给K8S集群提供一个B/S结构访问体系。
2.3.2 Ingress Controller
- 官方只能实现四层代理,INGRESS可以实现七层代理。
2.3.3 Federation
- 提供一个可以跨集群中心多K8S统一管理功能。
2.3.4 Prometheus
- 提供K8S集群的监控能力。
2.3.5 ELK
- 提供K8S集群日志统一分析介入平台。