Kubernetes是由google公司在2014年发布的一款开源的容器编排引擎,用于容器化应用程序的自动化部署、扩展与管理。它能够编排多种容器任务,涵盖虚拟机集群管理、负载均衡以及网络流量分配等等。2017年,aws、微软云、阿里云等等著名的云计算公司都开始宣布原生支持kubernetes 。还有的平台可以做到把自己的k8s对外提供服务,让用户可以直接在上面部署应用程序,提供容器级服务的环境。这些大型云厂商的支持, 使得k8s在业内已经受到了广泛的认可和支持,容器编排市场占有率超过80%。
1.kubernetes特性
(1)自动装箱:基于资源依赖及其他约束能够自动完成容器的部署而且不影响其可用性。
(2)自我修复:一旦某一个容器崩溃,由于容器轻量级的特点,kubernetes能够在1秒中左右迅速启动新的容器。
(3)自动水平扩展:只要物理平台的资源支撑是足够得到,kubernetes就可以无限制的增加容器。
(4)服务发现和负载均衡:当我们需要在k8s上运行很多应用程序的时候,一个服务可以通过自动发现的形式找到它所依赖的服务,而且每一种服务如果起了多个容器,他能实现自动负载均衡。
(5)自动发布回滚:执行日常的运维任务。
(6)秘钥和配置管理:k8s通过配置中心的方式来保存所有应用的配置信息,当容器启动时,会去配置中心加载对应的配置信息。
(7)存储编排:根据容器自身的需求自动创建能够满足自身需要存储卷。
2.kubernetes架构
kubernetes是从传统运维角度来说的集群,组合多台主机的资源整合成一个大的资源池并统一对外提供计算存储等能力。每一个主机上都安装了k8s的相关应用程序,并通过这个应用程序协同工作,把多个主机当一个主机来使用。但是在k8s集群中,主机是分角色的,k8s是一个有中心节点架构的集群系统(master/nodes模型)。
k8s一般有3个master节点以实现HA,N个node节点提供计算存储能力来运行容器。master负责接受客户端的请求,而后master负责分析各个node现有的可用资源状态,将请求调度到一个可运行容器的最佳的node节点。最后,node节点首先在本地检查是否有镜像,最后在以Pod(node节点的最小调度单元)的形式将容器启动起来。
3.kubernetes核心组件
(1)master节点核心组件
Controller:负责检测pod的健康。
API Server:API Server专门负责接收、解析、处理请求。
Scheduler(调度器):它负责观测每一个node上总共可用的cpu计算和存储资源,并根据用户请求创建的容器所需要的资源量在众多node中挑选出一个符合条件的node来创建容器。kubernetes设计了一个两级调度的的方式来完成调度,第一步先进行预选;对每一个node进行评估,选出所有符合的node。第二步再在选出来的node上根据调度算法中的优选算法来选出一个最佳的node。
Controller Manager:它负责监控每一个控制器的健康状态,如果控制器不健康,由Controller Manager会重新生成一个控制器接管。Controller Manager如果宕机,会由从master上的Controller Manager接管。
(2)etcd
它是一个key:value的数据库,类似redis。负责存储集群中API Server中保存的各个状态信息(持久化到共享存储),以防止集群中的主master节点宕机,其他master节点可以读取到之前的集群信息。etcd同样是restfull风格的集群,通过http或https通信。在一个k8s集群中,etcd是高可用的。防止一个etcd宕机之后不能进行集群leader选举。
(3)node节点核心组件
Kubelet:负责与master通信,接受master调度过来的任务并执行,可能包括;创建Pod,管理Pod的健康状态、创建存储卷、启动容器等。
Kube-Proxy:节点中的每一个Pod发生变化以后,结果是保存在API Server中。而后API Server会生成一个通知事件,Kube-Proxy负责接收API Server的通知事件,一旦发现了某一个Service背后的Pod信息发生了改变(IP、Port等),由Kube-Proxy负责在每一个节点上将变化后的service转换成IPVS或IPtables规则中。而每创建一个Service,Service的实现也要靠Kube-Proxy在每一个节点上创建成IPVS或IPtables规则。