Kubernetes是Google开源的一款容器编排工具,它是诞生在Google内部运行N多年的博格系统之上的产物,因此其成熟度从其诞生初期就广泛受到业界的关注,并且迅速成为编排工具市场的主流,其社区活跃度非常高,版本迭代速度也很惊人,它的主要作用是对Docker容器做编排工作,当然,Docker只是容器工具的一种引擎,K8s可支持多种容器引擎,但从目前来说Docker容器引擎是具有绝对优势的,容器需要编排,也很容易理解,因为我们最核心要跑到业务通常都是LNMT/P的不同形式的扩展,但NMT/P他们的运行是有先后顺序的,也就是说MySQL要先启动,然后是Tomcat或PHP,最后是Nginx,而控制这种顺序就需要有容器编排工具来帮我们实现,另外,我们的业务希望7x24小时在线,如何保障?靠人是很难做到实时的,但编排工具可以,K8s帮我们实现了很多控制器,这控制器可以帮我们监控容器运行的状态,并自动帮我们重建(在容器时代重启就是重建)容器,并且还可以在容器处理能力不足时,自动根据我们定义的扩展规则,自动创建新Pod(k8s中最小单元,每个Pod中可有一个或多个容器),并且在压力下去后,自动删除Pod等等功能。
另外这里是K8s的中文官方文档zh站点:
https://k8smeetup.github.io/docs/
Kubernetes:
它至少需要3个Master节点
Master节点的主要组件:
API Server: 主要用来接收其它组件发来的请求,并作出相应的处理.
Scheduler: 主要负责挑选出一个最佳node节点来运行pod,它挑选合适的node,通常分两个阶段,
第一个阶段:是先通过初步筛选, 根据运行pod的最大要求,如: 4G内存, 6颗CPU等需求,来做
初步筛选,假如从20台中选出了3台, 则进入第二阶段,在从这3台中选出一台最符合的节点,
这时就需要综合考量各种因素,最后将选出了一台最佳运行节点告诉给API Server,在由
Master节点负责调度Pod在该node节点上运行起来。
Controller:它是负责监控Node上运行的Pod是否正常工作,若它发现自己监控的某个Pod故障了,
它会向API Server发出通告,并要求Master在其它节点上再重新启动一个相同的Pod,
然后将故障的Pod Kill掉。
Controller-Manager:它是负责监控所有Controller是否正常工作的,在Kubernetes集群中,有很多
个功能各异的Controller, 监控Pod健康状态的Controller只是其中之一,Controller-Manager
它用于监控这些Controller工作状态的,一旦Controller故障,它将重启一个新的Controller来
代替它工作。
但是若Controller-Manager故障怎么办? 其实Master在创建时,要求最少要有3个节点,每个节点都会启动一个Controller-Manager,启动一个为主Controller-Manager,其它两个或多个为备用的Controller-Manager,一旦主Controller-Manager故障,则备用的Controller-Manager将代替它继续工作。
Node0:
Pod:它是Kubernetes中最基本的单元,一个Pod其实是一个容器的抽象,或叫容器的壳,它内部
其实就是一个或多个容器。一个容器中只能运行一个应用程序,所以有时一个应用程序需要
强依赖另一个应用程序一起工作,如:ELK中要收集每个应用的日志,它就需要在每个应用
节点上部署自己的日志收集器,如Logstash, 那么对于Nginx,它的日志要放入ELK中,它就需要
和Logstash放到一起,但一个容器中只能运行一个应用程序,所以就需要在一个Pod中运行
两个容器,来完成这个需求,所以在K8s系统中,将一个Pod做为一个整体,一个基本原子来管理。
Label Selector:在一个Kubernetes集群中,需要管理的Pod有很多,它们被调度到不同的Node节点上
运行,这么多Pod运行在不同的Node节点上,怎么对它们做管理? 通过字符串名称?那么一个
Pod运行过程中故障,又被重启到其它Node上,那么它的字符串名称必然要改变,那么这又怎么
能唯一标示一个Pod? 所以这就需要用到Label Selector(标签选择器),实际上,Pod在K8s系统
中它们都有一类标签,如:将运行Nginx的Pod都打一个App=Nginx的标签,将运行HAProxy的Pod
都打上App=HAProxy,等等...那么在查找所有运行Nginx的Pod时,就可以通过标签选择器,通过
条件App, 并且其值为Nginx来查询,就可以将所有是App=Nginx的Pod都标记出来,进行管理操作了。
Kubelet:它运行在Node上,接受APIServer发来的启动,停止或删除Pod请求,并按照请求,在Node实际执行
操作的守护进程。
Docker: 是实际Pod的运行环境提供者.