Ansible就是一个编排工具。
docker :我们应用程序被容器化了,面向容器化的应用程序。
docker compose 是一个docker编排工具,面向单台主机编排,
docker swarm 是面向集群化的编排工具,
docker machine
mesos,marathon(容器遍排框架) AWS的。
kubernetes
DevOps(应用模式的开发),MicroServices,Blockchain
CI: 持续集成
CD: 持续交付 Dlivery
CD: 持续部署 Deployment
谷歌:Borg系统(容器系统)
kubernetes特性
自动装箱,自我修复,自动水平扩展,自动服务发现和负载均衡,自动发布和回滚
密钥和配置管理,存储编排。批量处理执行。
集群:组合多台主机的资源整合成一台大的资源池,并统一对外提供计算存储等能力的集群。
我们用许多台主机,在每一台主机上安装上kubernetes相关应用程序,并通过这个应用程序协同工作,把多个主机当成一个主机来使用。前提是在每一台主机上装上相关应用程序,让大家在这个应用程序级别上进行通信从完成彼此间协调,
在k8s集群中主机是分角色的,所谓集群有两种模型一种是p2p的,没有中心节点,每一个节点都能直接接收用户请求,能路由请求,另一种是有中心节点的,如mysql主从复制。
K8S是一个有中心节点的,master/nodes。master做为主节点,一般不需要太多,一般有三个就够了,nodes相当于worker,nodes就是运行容器的节点的。
有一个或一组节点是主节点master,是整个集群的唯一入口,node每一个节点贡献一部分计算能力,存储能力相关资源节点,实际是运行容器的节点,
用户请求先发给master,master当中有一个调度器去分析各node现有的可用资源状态,找一个最佳适配运行所请求的容器节点,并把它调度上去,由这个本地的容器引擎(docker)负责把它运行起来,先检查本地是否有镜像,
如果没有镜像它会负责把镜像拖下来再启动。
提供服务能让客户端访问的一般使用套接字,套接一般提供的是API接口。要使用专门编好的客户端程序,kubernetes把master上的一个组件做为API-SERVER,API-SERVER接收请求,解析请求,处理请求的,如果用户这次的请求是要创建一个容器,这个容器会运行在node上,但是到底运行在
哪个node上了,这个是由调度器决定的,叫做scheduler,负责观察每个node上总共可用的计算和存储资源并根据用户所请求创建这个容器所需要的资源量。k8s不但可以设定容器的资源上限,还能设定的容器资源下限,
kubernetes设计了一个两级调度的方式完成方式,1,先做预选,评估一下在每一个节点到底有多少个是符合这个容器运行需求的,2、优选,从这些预选项出来的节点再做一次优选。
在某个node上把这个容器启动起来了,可以做容器内部应用程序的健康检测的,叫做可用性探测机制来探测服务的可用性,一旦这个容器挂了,node上有个应用程序用来负责这个应用程序始终是健康运行的。如果node死掉了,之前拖管在此node的上所有应用程序也就没用了。
此时需要在其他节点上创建出一个一模一样的节点来代替已经死掉的node节点。kubernetes还实现了一大堆的叫控制器的应用程序,负责去监控他所管理的每一个容器是否是健康运行的。一旦发现运行不正常了,控制器就负责向master-apiserver发请求,再由scheduler从其他节点找一个合适的再重新启动为容器。
如果用于监控容器的控制器不健康了,在master上有个控制器管理器,负责监控每一个控制器是健康的,如果控制不健康了,由控制管理器确保他是健康的。
控制器管理是冗余的。
master是一个非常重要的节点是整个集群的大脑,有三个核心组件,1、API-Server组件,负责接收并处理请求的。2、scheduler,调度容器创建的请求。3、控制器管理器,确保已经创建的容器处理健康状态。控制器管理器是确保控制器是健康的,而控制器才是用来确定容器健康的,
kubernetes支持众多控制器,控制容器自身健康的只是其中一种,他还有很多其他的控制器。
在k8s上运行的最小单元不是容器,而是pod,kubernetes并不直接调度容器,他调度的目标叫pod,pod可以理解为容器的外壳,给容器做了一层封装。pod成为kubernetes上最小的调度逻辑单元,pod内部主要就是用来放容器的,但是pod有一工作特点,
一个pod中可以包含多个容器,多个容器共享同一个底层网络名称空间,pod是模拟传统的虚拟机的,一个pod内的所有容器还会共享存储卷。存储卷属于pod,一般情况下一个pod只放一个容器,如果一个pod内放几个容器,有一个主容器,其他容器是辅助这个主容器完成更多功能来实现的,比如在一个pod里运行了一个Nginx,那么这个容
器就不能再运行别的应用程序了,那么我们还想运行一个日志收集应用程序,那就只能把这个日志收集应用软件运行在和Nginx同一个pod的不同的容器中就可以。
node是kubernetes的工作节点,负责运行由master指定的各种任务,最核心的任务就是以pod的形式去运行容器的。理论上讲node可以是任何形式的计算设备,只要能够有传统意义上的CPU,内存,存储空间并且能装上kubernetes集群代理程序,都可以做为整个kubernetes整个集群的一份子,
因此kubernetes集群实现的效果就是整合所有的node节点,整合起来当一个很大的计算池来使用,终端用户就无需关心我们资源到底是运行在哪个节点上的,所以就实现了云的物理计算,调度和编排脱离的用户的视线,用户就无需关注究竟你的pod或容运行于哪一个对应的node之上,
这么多pod运行在某一个集群当中,如果想分类管理怎么办,如要删除某一个pod,该怎么删除了,我想一个控制器只管理一部分pod,能挑选出这一类pod吗。不能靠pod名称来区分的,我们想把一类pod归组,来用一个控制器来管理这一类pod,他怎么会认为目录符合我们要求的pod的有几个了。
为了能够实现pod的识别,我们需要在pod的基础上付加一些源数据,在创建完pod时可以给pod直接打上标签,让控制器或让人能够直接基于这个标签的值来识别出pod来,例如我们创建出了4个Nginx的pod来,我们可以给每个pod上加一个标签叫app,他的值都等于Nginx,那么我们找拥有key叫app并且他的值是Nginx,这样就可以把他挑选出来了,
这个去筛选的机制要靠一个组件来实现,叫标签选择器,selector组件,标签选择器就是一种根据标签来过滤符合条件资源对象机制,标签不关pod能用很多其他资源也都能用。
master/nodes
master: API Server,Scheduler,Controller-Manager
node: kubelet,docker(容器引擎) kube-proxy
Pod, Lable,Lable Selector