Borg 谷歌内部公司使用的容器编排工具
kubernetes 开源容器编排工具,开源在github.com
官网:https://github.com/kubernetes
官网下载:https://github.com/kubernetes/kubernetes/releases
程序开发出来就是运行在云平台之上,而非传统的运行在单机操作系统之上。
程序员开发的API接口不再是不同主机跨操作系统的接口,而是k8s集群的API接口,直接在k8s集群上来书写代码进行测试。
在k8s之上实现的无服务器应用程序叫:Knative
传统提供一个web服务,要么运行nginx、要么运行httpd、这个应用程序是一个守护进程一直在运行,无论是否有用来进行访问,这个系统资源始终不停的处于消耗当中(不论是CPU\还是内存)。
无服务器:程序平时是不运行的,只有被客户端访问时才会运行,当结束访问也就随之关闭。当被调用时才会运行。每个应用程序都相当于一个函数,实现函数化调用。
Function as a Service 函数本身都部署在应用程序服务器上,客户端只需要发送请求,服务端被调用时将函数调用起来,将结果返回给客户端。每个函数都是一个独立的可以被调用的个体。
如果有成千上万的功能,那可能就是成千上万个函数,以用户无法感知的在多个节点运行。
k8s是一个开源平台对自动部署,伸缩,运维容器化应用的开源平台,支持跨主机的集群多节点完成容器编排。以http、https协议对外提供API服务。
只需要提供一组主机形成集群,在主机上运行服务编排系统,当我需要去运行一个服务时,只需要提供给这个系统,这个系统会根据自己检测到的众多主机中,最适合运行此服务的节点。把它自动部署上去,并运行起来,这样的系统叫做服务编排系统。
只需要告诉它,我想要运行什么程序,将程序提交给服务编排系统,编排系统根据自己底层节点资源消耗状态并根据应用程序自身的需求,选择最佳目标节点,来运行程序。
可以无需考虑底层系统环境,应用程序自身自带所需要的依赖的运行环境,也就是容器。
标准化的打包应用程序的方式,镜像。运行方式,容器。底层应用程序只需要有底层运行引擎就可以,每一个节点只需要有docker 跑着,当部署应用程序时,不是部署应用程序本身,而是把应用程序的镜像下载到对应的节点上,启动为容器。
应用程序的镜像自带的应用程序自身所依赖到的所有环境,因此可以一次打包到处运行,无需再考虑底层系统环境异构与否或者满足与否。
单一容器没有太大的生产价值,只有能够自动化容器进行编排以后,容器的价值才能发挥出来。
docker出现的镜像机制,极富创造性的解决了应用程序打包的根本性难题,不用再考虑底层系统环境异构或是否能够满足应用程序运行环境的问题。推动了容器技术快速普及以及生产落地。
容器本身仅提供了托管运行应用的底层逻辑,而只有能够把多个容器彼此间的依赖关系也反映出来,实现容器编排机制之后,才是真正产生价值的位置。
容器只是运行应用程序的元子,单元。而把他们能够投入生产使用的,并真正解决生产难题,解决痛点,依赖的时容器编排系统。
容器编排系统其实只是一个容器的生命周期管理工具。尤其是我们在组件一个微服务环境当中,存在的服务数量非常多的时候,并且期望能够以动态注册,部署等方式来完全实现管理时。容器编排系统的价值体现才会更加充分。
一般来讲软件团队会使用容器编排系统来完全以下任务的自动化,容器编排系统的核心价值所在。
1.容器的提供和部署。如何获取容器的镜像,如何去部署容器并运行起来。
2.容器的冗余和可用性。
如果某一容器宕机,容器编排系统必须通过自动逻辑,自动将出现故障的容器恢复回来,甚至是提供一个高可用逻辑,让某一容器出现故障后不至于使得服务整体无用。
3.规模的扩展,或者是实现应用规模的自动伸缩。
当客户端请求量大的时候进行扩容,当客户端请求小的时候进行缩容。把多个应用程序部署在一个集群上来统一进行调度,使整体系统资源合理充分的进行调用。
4.节点迁移。一旦底层节点出现故障或资源紧缺时,能把容器进行迁移到其它节点上去。用户对其是没有感知的,自动实行迁移。
5.容器之间实现资源分配
6.网络映射,网络暴露。必要时将容器提供的服务暴露到集群外部,为外部提供访问。只有接入层需要被暴露到网络外部。
7.负载均衡,服务发现
8.健康状态检测
9.应用程序配置自动实现
简单来说,容器编排是指容器应用的自动布局,协同以及管理,主要负责完成以下具体内容。
1.Kubernetes 目前最流行的编排工具,由CNCF组织(云源生基金会)提供研发更新。
2.Docker Swarm docker自带的编排工具
3.Apache Mesos and Marathon Mesos:数据中心资源统一管理的操作系统 Marathon:容器编排工具
故事:
docker-EE 支持K8S 之后,K8S全面获胜。K8S是google公司采用golang语言研发的一款开源软件。早在10几年前google公司就已经在使用容器来进行部署,有着自己特有的闭源编排工具,编排技术十分成熟。
docker公司只是一个创业公司,将google的容器技术进行美化,发明了docker。但是编排技术还是google公司的技术要生熟很多,所有k8s在2015年上线后就被全面应用。
组合多台主机资源形成集群、资源池,统一对外提供计算、存储、等能力的集群。每一个主机都需要安装kubernetes的应用程序,让大家在应用程序上进行通信,从而完成协调工作。
k8s属于有中心节点架构的系统 、master/nodes模型
集群,计算存储网络资源的集合,k8S利用这些资源来基于容器产生应用
客户端请求发送给 master ,master通过调度器分析各nodes现有的可用资源状态,找一个最佳适配请求的容器节点,进行调度。由本地nodes节点负责启动容器,容器镜像在本地的harbor仓库当中。
负责运行容器,运行容器应用。node由master统一管理。负责监控,向master汇报状态,并且根据master要求来运行nodes。
kubelet:调度结果由kubelet来执行,接收任务。将不同节点的pod信息,iamge,卷发送给kubelet,根据这些信息创建容器,并向master进行汇报。kubelet采集客户端信息,代理。
docker:容器引擎,运行容器
kubeproxy:每个node上都会运行proxy服务。负责将service发来的TCP/UDP数据流,转发到后端容器上,如果有多个副本,kubeproxy就会产生负载均衡。service代理了后端多个pod,外界通过service访问pod,service接受到这些请求通过proxy访问容器。
Pod网络:flannel网络,节点间相互通讯。
1、nodes节点网络 — ens33网卡通信
2、service集群网络 — flanneld进行通信,全部由iptables/lvs维护和转发
3、pod服务网络 — docker0进行通信
是CoreOS团队针对kubernetes 设计的一个网络规划服务,它的功能是让集群中不同的节点主机创建的 Docker 容器都具有全集群唯一的虚拟IP地址。
而且它还能在这些IP地址之间建立一个覆盖网络(overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内,实现不同主机间容器通信。
同一Pod内多个容器间通信:local本地通信,pause网络栈通信
各个pod之间的通信:overlay Nerwork叠加网络通信(全覆盖网络)
pod和service之间的通信:各节点的Iptables规则、LVS转发
存储 flannel 可分配的IP地址资源
监控 ETCD 中每个 Pod 的实际地址,并在内存中简历维护 Pod 节点路由表