K8S的基本架构及结构设计解读
1 Kubernetes的基本架构及组件功能
Kubernetes是由Google开发的开源容器集群管理系统。作为一个引领潮流的集群管理技术,它开创性地引入了众多新的功能特性,主要有以下几点:
资源调度
自动伸缩
服务发现
部署运行
由于它的强大集群管理功能,K8S目前十分受欢迎,Kubernetes是一个典型的master/slave结构。
1.1 master运行三个组件:
· apiserver:kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
· scheduler:负责集群的资源调度,为新建的pod分配机器。
· controller-manager:负责执行各种控制器,目前有两类:
· endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
· replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致。
1.2 slave(称作minion)运行两个组件:
· kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
· proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
2 结构设计意图解读
为什么要有单个Pod包含多个容器的结构?
Pod是kubernetes的最小部署和操作单元,单个Pod可以包含一个或多个容器。Pod对外暴露,逻辑上是一个应用实例,而其中的容器不对外暴露,外部无法直接访问。从我的理解来看,k8s把基本操作单元设计成Pod这种豌豆荚形式,可以更好地对接容器时代倡导的微服务架构。在微服务模式下,传统的一体化结构的服务被分解成能独立运行的几个微服务(要了解什么是微服务结构,可以参看http://microservices.io/patterns/microservices.html)。Pod内各容器运行微服务的各个组成模块,各组成模块组合统一对外提供服务,而Pod本身提供如监控等其他辅助功能。所以,从外界的角度来看,一个pod即为一个服务。
为什么要有抽象的Service对象?
Service定义了一个Pod的逻辑集合和访问这个集合的策略,通过后端pod的集合向外提供服务。使用service对象的好处有:
后端pod可以多实例,提供更大的访问容量,以及更好的可靠性(防止机器切换或缩容造成无法连接的情况发生);前端Pod不必关心哪个后端pod在给它提供服务,只需通过Service抽象层和label selector选择后端pod多实例中的一个。Service这一抽象层把外部使用者(前端pod)和后端pod有效隔离开来。即使组成这个后端的Pod变化,前端Pod不会意识到这个变化,也不会跟踪后端。此外,service抽象层可以保证大访问容量下多个后端pod之间的负载均衡。
为什么把Scheduler从Master中剥离,单独成为一个组件?
在Kubernetes中,调度器Scheduler的工作从master剥离出来成为了一个独立的组件。这样至少有两点好处:
1. 脱离了耦合,现有的调度器(调度算法)可以方便地替换为其他调度器。
2. Scheduler成为独立组件,可以方便调度器进行自动伸缩:调度高峰,Scheduler可以多实例化并行处理调度任务,提高响应速度;调度峰谷,可以减少Scheduler实例,减少资源的占用。
- 点赞
- 收藏
- 关注作者
评论(0)