1.docker的三种编排工具node
Docker的第一类编排工具:nginx
a.docker compose(docker原生):只能对一个主机上的容器进行编排,没法编排多个主机上的容器;git
b.docker swarm(docker原生):能够对多个主机上的容器进行编排;github
c.docker machine(docker原生):能够将一个主机迅速初始化到docker swarm集群里.算法
以上三个称为docker三剑客docker
Docker的第二类编排工具:bash
mesos:它不是docker的编排工具,而是资源分配工具,因此mesos必需要依赖于容器编排框架marathon.服务器
Docker的第三类编排工具:网络
kubernetes(简称k8s):这个容器编排工具占据了80%以上的市场份额.架构
有了容器和容器编排技术,对持续集成(CI)、持续交付Delivery(CD)和持续部署Deployment(CD)的需求有了很大帮助,这也就是DevOps的理念,DevOps并非一种技术,而是一种运动、一种文化、一种思想.
2.k8s介绍
k8s的代码托管在github之上:https://github.com/kubernetes/kubernetes/releases
特性:
a.能够自动装箱,即:能够自动完成容器的部署,而不影响可用性; b.能够自我修复,若是容器崩溃了,能够1s内从新启动,有了k8s后,咱们再也不关注个体,而是关注群体; c.能够自动实现水平扩展,一个容器不够,再启动一个; d.能够自动实现服务发现和负载均衡,能够自动发现每一个微服务之间的关系,也能够自动对容器内多个服务作负载均衡; e.能够实现自动发布和回滚; f.能够实现密钥和配置管理,也就是说每一个容器不是加载容器内的配置文件,而是加载远程服务器上(配置中心)的配置文件; g.能够实现存储编排; h.能够实现任务的批量处理执行.
k8s是一个有中心节点架构的集群,由master节点(至少三个)和nodes节点(运行容器的节点)组成,客户的启动容器等请求会先发给master节点,master节点有个调度器会分析node节点资源(cpu、内存)的可用状态,找到最佳适配的node来启动用户请求的容器.
master上的第一个组件叫调度器(Scheduler),它的工做原理有两步:第一步调度器先作预选,即先评估有多少个node符合容器需求;第二步调度器再作优选,即在符合的node中选择一个最佳的node来运行容器.若是node宕机了,那么托管在node之上的全部容器也就不见了,此时k8s能够在其余节点上建立出来和宕机node上如出一辙的容器.
另外,master上还有一个组件叫控制器,它会不停的Loop,用来周期性监控每一个node的健康状态;控制器是有多个的(由于有至少三个master),master上还有一个组件叫控制器管理器(Controller-Mnager),控制器管理器用来监控每一个控制器的健康.
在k8s上运行的最小单元不是容器,而是pod.pod能够理解为容器外壳,pod里面装的就是容器.一个pod里面能够放多个容器,这些容器能够共享一个底层的网络名称空间、存储卷,这样一来,pod对外更像一个虚拟机.
通常说来,一个pod里只放一个容器;若是一个pod必需要放多个容器,那么里面有一个是主容器,其余都是辅助容器,辅助容器主要是为了辅助主容器的主程序的某些功能而设置的.
一个pod里面的全部容器只能运行在一个node上,最终用户无需再关注pod运行在哪一个node之上,这也就是云的概念,也就是把不少的node作为一个资源池,来进行统一管理.pod尽可能由控制器管理,而不要手工管理.
3.pod能够分为两类
a.自主式pod:即自我管理的pod.建立Pod,首先交给Apiserver,而后调度器调度给指定的node节点.若是容器须要启动,由node上kubelet组件来完成;若是node发生故障,那么pod也就消失了.
b.控制器管理的Pod(建议建立这种Pod):这种Pod是有生命周期的对象.由master上的调度器将pod调度至某node进行运行或者中止,Replica Set(副本集控制器),可是该控制器并不直接使用,而是使用一个声明更新的控制器Deployment,这个也是用的最多的,Deployment控制器只能管理那些无状态的应用;有状态的应用是由Stateful Set控制器管理.
对于Deployment控制器,它还支持二级控制器,叫HPA(horizontalPodAutoscaler),该控制器能够自动水平扩展pod,也就是当一个pod压力大时,HPA控制器会自动水平扩展加几个新的pod来分解压力,具体加几个,HPA会根据当前节点的cpu、内存负荷来计算,一旦访问量小了,HPA还会自动减小pod个数;
若是咱们想在一个Node上只运行一个副本,须要用DaemonSet控制器;
若是须要运行做业(如备份、清理数据等),须要conjob控制器.以上所讲的都是pod的控制器,用来管理不一样类型的pod.
4.service
标签选择器(Lablel Selector)组件:是一个根据标签来过滤符合要求的资源机制,给pod打上标签(Lablel),能够实现分组效果.
客户端是经过service来找到pod的,service是经过pod的标签选择器来找到pod的.
service只是一个iptables方式的net地址转换路由规则,到了1.11版本,支持了ipvs方式的分发规则,支持各类调度算法,这也就实现了负载均衡,装完k8s,须要建立一个DNS pod,这是由于service的名字须要DNS服务器来解析,这种pod是k8s的组成部分,被称为k8s基础架构的pod,也被称为k8s的附件,英文名叫AddOns.这种DNS是用来解析service名字的,而不是pod的,DNS名称解析是K8s自动维护的,不须要人工干预.
一句话:service里面的地址存在于iptables net或者ipvs中,service是用来调度流量的,而不会启动或者中止容器.
pod的启动或者关闭、建立等是由控制器来作的,好比建立一个nginx pod,就得先建立一个nginx控制器,nginx控制器就会自动帮咱们建立nginx pod;而后再建立一个nginx service,把nginx pod发布出去.
service有两种类型:一种是调度流量仅供k8s内部使用;另一种则调度流量供k8s外部使用.
service是用来分发流量给pod,控制器是用来建立、启动和中止pod,标签选择器是让service根据标签来识别每一个pod的.
5.网络
在k8s中,须要三种网络
a.各pod在一个网络中; b.service在另一个网络,即service的地址和pod的地址是不一样网段的, pod的地址是配置在pod内部的网络名称空间,是能够ping通的, 但service的地址是虚拟的,是假地址,只存在于iptables或者ipvs中. c.node又存在于另一个网络. 因此外部先到达node网络,而后再到service网络,最后才到pod网络.
pod之间怎么通讯呢?同一个pod内的多个容器经过lo进行通讯;
各pod之间经过overlay network(叠加网络)进行通讯,即便pod之间跨主机,通讯也没问题;
pod与service之间经过网关(也就是docker 零桥的地址)进行通讯.
node上有个组件叫kube-proxy,它负责和ApiServer进行通讯,kube-proxy一旦发现service背后的pod地址发生变化,就会改变service在ipvs中的pod地址,因此service的管理是靠kube-proxy来实现的.
kubelet--node上用于和master通讯的一个组件,试图启动node上的容器,启动容器是由容器引擎来操做的,最流行的容器引擎是docker.
6.通讯简介
在master(master是有多个的)上的数据并不存在master本地,而是存在共享存储DB中,这个共享DB叫etcd.etcd的数据以key-value形式存储,集群中全部状态信息都在etcd中,因此ectd要作冗余,通常至少三个节点,etcd经过https方式访问,etcd有一个端口用于集群内部通讯(也就是和其它etcd通讯),还有一个端口用于对ApiServer通讯,因此etcd内部通信须要点对点的专门证书,对ApiServer通讯须要另一套证书;ApiServer向客户端提供服务,须要一套证书;ApiServer和node上的kubelet组件和kube-proxy组件通讯也须要CA证书,因此作K8s的部署,须要创建5个CA,这个比较考验功底.
把k8s归为如下三类节点:master、node(部署pod)和ectd(存储集群状态信息),彼此经过http或https进行通讯,网络分为:pod网络、service网络和node网络.因此须要构建出三类网络,可是K8s本身不提供这三类网络,依赖于第三方插件CNI.
k8s经过CNI(容器网络接口)插件体系接入网络.目前常见的CNI插件是flannel,其实网络用于提供两个功能:一个是给pod、service等提供ip地址;另外就是提供网络测试的功能,来隔离不一样Pod之间的通讯.
flannel插件只支持网络配置(供ip地址的功能),不支持网络策略,CNI插件中的calico能够同时支持网络配置和网络策略,可是calico的部署和使用门槛比较高,因而,又有了第三个CNI插件canel,它用flannel提供网络配置,用calico提供网络策略.这些插件能够做为k8s之上的守护进程运行,也能够在k8s里面的容器运行.
名称空间--能够将不一样种类的pod运行在不一样的名称空间中.好比能够把名称空间分为开发名称空间、测试名称空间等,能够经过网络策略来定义名称空间之间、同一个名称空间的pod之间的网络行为.
参考博客:http://blog.itpub.net/28916011/viewspace-2213456/