kubernetes是一个容器编排开源软件,它能够轻松高效管理由千上万的主机组成的集群,并提供容器部署运行的环境。node
kubernetes最初由Google开发和设计,前身是Borg系统,Google有成千上万的容器运行在上面,主要帮忙Google实现简化开发和管理,而且提供基础设施的资源利用率。再内部稳定运行Borg数十年之久后,随着容器化的大流行,2014年Google开源了kubernetes,一个基于Borg和其它内部系统的开源系统。2015年,Google将kubernetes项目捐赠给了CNCF(云原生计算基金会)。nginx
1,kubernetes基于Google内部的Borg系统实现,有着长达数十年之久的稳定大规模运行实践经验。
2,Kubernetes提供的是一个平台,不是解决方案,实现容器化应用程序的一次编写并在各种型云基础设施上运行,它将公有云与私有云之间存在的复杂的基础设施差别抽象化掉了。
3,社区活跃多极高,在全部竞争对手中遥遥领先docker
1,安装部署比较麻烦
2,只能用于容器的编排管理后端
kubernetes能够被认为是一个集群的操做系统,它提供了注入服务发现,扩容,负载均衡,自恢复,选举等功能,使开发者不用关心基础设施相关的服务而能够把心思都集中再应用实现自己。服务器
kubernetes能够将容器化的应用运行在集群的任何主机上,并保证应用组之间的通讯和运行,而且可以自动实现根据主机资源使用状况的自动调度,最大化资源利用率。网络
做为管理集群状态的Master节点,它主要负责接收客户端的请求,安排容器的执行而且运行控制循环,将集群的状态向目标状态进行迁移,Master 节点内部由三个组件构成:API Server,Controller控制器,Scheduler 调度器。架构
主要由kubelet和kube-proxy两部分组成,它主要负责Node节点的全部管理操做。负载均衡
Pod是Kubernetes中最基本的概念,它也是Kubernetes对象模型中咱们能够建立或者部署的最小而且最简单的单元。框架
它将应用的容器、存储资源以及独立的网络IP地址等资源打包到了一块儿,表示一个最小的部署单元,可是每个pod中的运行的容器可能不止一个,这是由于pod最开始设计时就可以在多个进程之间进行协调,构建一个高内聚的服务单元,这些容器可以共享存储和网络,很是方便地进行通讯。运维
API Server负责处理来自用户的请求,其主要做用就是对外提供 RESTful的接口,包括用于查看集群状态的读请求以及改变集群状态的写请求。它是Kubernetes的中心组建,其它组件都会与其交互,她使用etcd作存储。
客户端经过建立到API Server的HTTP链接来监听变动,经过此链接,客户端会接收到监听对象的一系列变动通知。每当更新对象,服务器把新版本对象发送至全部监听该对象的客户端。
kubernetes Service服务是一种为一组功能相同的pod提供单一不变的接入点的资源。当服务存在时,它的IP地址和端口不会改变,默认提供集群内ip的访问。 客户端经过服务的IP地址和端口号创建链接,服务收到请求后从对应的Endpoint资源中查找后端pod地址和端口,而后将这些链接路由到提供该服务的任意一个pod上。经过这种方式,客户端不须要知道每一个单独的提供服务的pod的地址,这样这些pod就能够在集群中随时被建立或移除。
Service资源提供两种方法使集群外部客户端访问k8s内部服务:
1,将服务的类型设置成NodePort,这样每一个集群节点都会在节点上监听一个端口,这个端口会将接收到的流量重定向到基础服务。该基础服务仅在内部集群IP和端口上才可访问。
2,将服务的类型设置成LoadBalance(为NodePort的变种)这使得服务能够经过一个专用的负载均衡器来访问。负载均衡器将流量重定向到集群节点上监听的端口,这个端口会将接收到的流量重定向到基础服务。客户端经过负载均衡器的IP链接到服务。
用于部署应用程序并以声明的方式升级应用,为pod和ReplicaSet控制器提供描述性的更新方式,当建立一个Deployment时, ReplicaSet资源也会随之建立。使用Deployment能够更容易地更新 应用程序,由于能够直接定义单个Deployment资源所需达到的状态,并让Kubenetes处理中间的状态。
Ingress资源提供集群外部客户端访问k8s内部服务功能,它工做再7层,能实现Service资源不能实现的功能。当客户端向Ingress发送HTTP请求时,能够经过 Ingress 配置提供外部可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等,相似于7层代理。
1,客户端执行dns查找查找到Ingress控制器的ip。
2,客户端像Ingress控制器发送http请求。
3,控制器从http请求的host中肯定访问的具体Service资源,而后再查找到该资源的Endport对象,从而获取pod地址和端口。
4,Ingress控制器把请求转发给选定的pod。
Satefulset资源用于管理有状态的应用,能使pod拥有稳定的网络资源和独立的存储,还它可以保证这些 Pod 的顺序性和惟一性等。
用于存放pod中应用的配置,本质是一个键值对映射,值能够是短字符,也能够是完整的配置文件。
kubelet是一个节点上的主要服务,它监听API Server 接受新的或者修改的pod规范而且保证节点上的pod和其中容器的正常运行,还会保证节点会向目标状态迁移,该节点仍然会向Master 节点发送宿主机的健康情况。其实,就是负责全部运行在工做节点上内容的组件。
运行在各个节点上的代理服务kube-proxy负责宿主机的子网管理,同时也能将服务暴露给外部,其原理就是在多个隔离的网络中把请求转发给正确的pod或者容器。
运行在kubernetes主节点,利用API Server的监听机制等待新建立的pod,若是监听到有新建立pod,则根据策略配置和节点资源使用状况等等为pod分配节点。
运行在kubernetes主节点,用于建立和管理pod 的实例,可以在集群的层级提供复制、发布以及健康检查的功能。每一个控制器都链接到API Server进行监听更新,每一个控制器之间不相互通讯。主要的控制器有以下:
ReplicationController控制器确保在任什么时候候都有配置的数量的pod副本处于运行状态,如今已经处于废弃状态,被ReplicaSet控制器所取代。
ReplicaSet控制器是下一代的Replication控制器,ReplicaSet和Replication的惟一区别是选择器的支持。ReplicaSet支持新的基于集合的选择器需求,功能更强大,而Replication控制器仅支持基于相等选择器的需求。主要管理无状态的应用。
DaemonSet控制器确保所有(或者某些)节点上只运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它建立的全部 Pod。主要管理无状态的应用。
若是须要在每一个节点上运行日志收集程序和资源监控器则使用DaemonSet很是合适。
相似于crontab,它容许你运行一种pod,该pod在内部进程成功结束时,不重启容器。一旦任务完成,pod就被认为处于完成状态。
Deployment控制器负责使deployment资源的实际状态与对应Deployment API对象的指望状态同步。Deployment经过建立ReplicaSet来按照定义的策略来管理pod。
用于管理运行有状态的应用,例如分布式应用每一个实例须要单独固定的存储,固定的ip等。
而为了使用Ingress功能,就须要运行一个Ingress控制器,能够用nginx提供Ingress控制器功能。若是Ingress控制器压力太大,能够扩容成多台,而后经过给Ingress控制器前添加LB来作负载均衡,外部客户端经过访问负载均衡的VIP来访问业务。
用于管理node资源,使节点对象列表于集群中实际运行的机器列表保持同步,同事监控每一个节点的监控状态,删除不可达pod。
用于LoadBalancer类型的服务被建立或者删除时,从基础设施请求或者释放负载均衡器。
主要用于维护Service管理的pod的ip和端口。Endpoint控制器按期根据匹配标签选择器的pod的ip,端口更新端点列表。
用于根据用户请求,来建立或者删除命名空间中的资源。
用于根据持久卷声明来找到合适的持久卷进行绑定或者解绑。
Cloud Native Computing Foundation(云原生计算基金会)主要有Docker,Google,CoreOS等重要的容器技术厂商发起成立,主要做用是推广云原生技术,造成社区,开源项目管理与推动生态系统健康发展。云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的表明技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
Docker Compose是一个基于Docker Engine进行安装的Python工具。 该工具使得用户能够在一个声明式的配置文件中定义一个多容器的应 用,并经过一个简单的命令完成部署。Compose文件能够是YAML或JSON格式,其中定义了全部的容器、网络、卷以及应用所需的密码。docker-compose命令行工具会解析该文件,并调用Docker来执行部署。
Docker-Compose只能管理当前主机上的Docker,解决主机本地Docker容器编排问题。
Docker Swarm是一个基于Docker引擎之上的容器编排软件。相似于kubernetes,它也能够轻松高效管理大规模主机组成的集群,并提供容器部署运行的环境。目前,和kubernetes的PK中处于下风。
Mesos是一个遵循Apache协议的开源项目,是一个集群管理工具,能够将整个数据中心的资源(包括CPU、内存、存储、网络等)进行抽象和调度,使得多个应用同时运行在集群中分享资源,并没有需关心资源的物理分布状况。
Mesos是以与Linux内核一样的原则而建立的,不一样点仅仅是在于抽象的层面。Mesos内核运行在每个机器上,同时经过 API 为各类应用提供跨数据中心和云的资源管理调度能力。这些应用包括Hadoop、Spark、Kafka、Elastic Search,Cassandra等。还可配合框架Marathon来管理大规模的Docker等容器化应用。目前,主要用于大数据相关场景。
https://www.redhat.com/zh/topics/containers/what-is-kubernetes
https://draveness.me/understanding-kubernetes/