Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。经过Kubernetes可以进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了做为Google生产环境运行工做负载15年的经验,并吸取了来自于社区的最佳想法和实践。Kubernetes通过这几年的快速发展,造成了一个大的生态环境,Google在2014年将Kubernetes做为开源项目。Kubernetes的关键特性包括:node
Kubernetes属于主从分布式架构,主要由Master Node和Worker Node组成,以及包括客户端命令行工具kubectl和其它附加项。web
7. kubelet根据调度结果执行Pod建立操做: 绑定成功后,会启动container, docker run, scheduler会调用API Server的API在etcd中建立一个bound pod对象,描述在一个工做节点上绑定运行的全部pod信息。运行在每一个工做节点上的kubelet也会按期与etcd同步bound pod信息,一旦发现应该在该工做节点上运行的bound pod对象没有更新,则调用Docker API建立并启动pod内的容器。算法
API Server主要用来处理REST的操做,确保它们生效,并执行相关业务逻辑,以及更新etcd(或者其余存储)中的相关对象。API Server是全部REST命令的入口,它的相关结果状态将被保存在etcd(或其余存储)中。API Server的基本功能包括:docker
另外,API Server也做为集群的网关。默认状况,客户端经过API Server对集群进行访问,客户端须要经过认证,并使用API Server做为访问Node和Pod(以及service)的堡垒和代理/通道。数据库
Kubernetes默认使用etcd做为集群总体存储,固然也可使用其它的技术。etcd是一个简单的、分布式的、一致的key-value存储,主要被用来共享配置和服务发现。etcd提供了一个CRUD操做的REST API,以及提供了做为注册的接口,以监控指定的Node。集群的全部状态都存储在etcd实例中,并具备监控的能力,所以当etcd中的信息发生变化时,就可以快速的通知集群中相关的组件。后端
Controller-Manager Serve用于执行大部分的集群层次的功能,它既执行生命周期功能(例如:命名空间建立和生命周期、事件垃圾收集、已终止垃圾收集、级联删除垃圾收集、node垃圾收集),也执行API业务逻辑(例如:pod的弹性扩容)。控制管理提供自愈能力、扩容、应用生命周期管理、服务发现、路由、服务绑定和提供。Kubernetes默认提供Replication Controller、Node Controller、Namespace Controller、Service Controller、Endpoints Controller、Persistent Controller、DaemonSet Controller等控制器。api
scheduler组件为容器自动选择运行的主机。依据请求资源的可用性,服务请求的质量等约束条件,scheduler监控未绑定的pod,并将其绑定至特定的node节点。Kubernetes也支持用户本身提供的调度器,Scheduler负责根据调度策略自动将Pod部署到合适Node中,调度策略分为预选策略和优选策略,Pod的整个调度过程分为两步:安全
1)预选Node:遍历集群中全部的Node,按照具体的预选策略筛选出符合要求的Node列表。如没有Node符合预选策略规则,该Pod就会被挂起,直到集群中出现符合要求的Node。服务器
2)优选Node:预选Node列表的基础上,按照优选策略为待选的Node进行打分和排序,从中获取最优Node。网络
Kubelet是Kubernetes中最主要的控制器,它是Pod和Node API的主要实现者,Kubelet负责驱动容器执行层。在Kubernetes中,应用容器彼此是隔离的,而且与运行其的主机也是隔离的,这是对应用进行独立解耦管理的关键点。
在Kubernets中,Pod做为基本的执行单元,它能够拥有多个容器和存储数据卷,可以方便在每一个容器中打包一个单一的应用,从而解耦了应用构建时和部署时的所关心的事项,已经可以方便在物理机/虚拟机之间进行迁移。API准入控制能够拒绝或者Pod,或者为Pod添加额外的调度约束,可是Kubelet才是Pod是否可以运行在特定Node上的最终裁决者,而不是scheduler或者DaemonSet。kubelet默认状况使用cAdvisor进行资源监控。负责管理Pod、容器、镜像、数据卷等,实现集群对节点的管理,并将容器的运行状态汇报给Kubernetes API Server。
每个Node都会运行一个Container Runtime,其负责下载镜像和运行容器。Kubernetes自己并不停容器运行时环境,但提供了接口,能够插入所选择的容器运行时环境。kubelet使用Unix socket之上的gRPC框架与容器运行时进行通讯,kubelet做为客户端,而CRI shim做为服务器。
protocol buffers API提供两个gRPC服务,ImageService和RuntimeService。ImageService提供拉取、查看、和移除镜像的RPC。RuntimeSerivce则提供管理Pods和容器生命周期管理的RPC,以及与容器进行交互(exec/attach/port-forward)。容器运行时可以同时管理镜像和容器(例如:Docker和Rkt),而且能够经过同一个套接字提供这两种服务。在Kubelet中,这个套接字经过–container-runtime-endpoint和–image-service-endpoint字段进行设置。Kubernetes CRI支持的容器运行时包括docker、rkt、cri-o、frankti、kata-containers和clear-containers等。
基于一种公共访问策略(例如:负载均衡),服务提供了一种访问一群pod的途径。此方式经过建立一个虚拟的IP来实现,客户端可以访问此IP,并可以将服务透明的代理至Pod。每个Node都会运行一个kube-proxy,kube proxy经过iptables规则引导访问至服务IP,并将重定向至正确的后端应用,经过这种方式kube-proxy提供了一个高可用的负载均衡解决方案。服务发现主要经过DNS实现。
在Kubernetes中,kube proxy负责为Pod建立代理服务;引到访问至服务;并实现服务到Pod的路由和转发,以及经过应用的负载均衡。
kubectl是Kubernetes集群的命令行接口。运行kubectl命令的语法以下所示:
$ kubectl [command] [TYPE] [NAME] [flags]
这里的command,TYPE、NAME和flags为:
$ kubectl get pod pod1 $ kubectl get pods pod1 $ kubectl get po pod1
$kubectl get pods
另外,能够经过运行kubectl help命令获取更多的信息。
在Kunbernetes中能够以附加项的方式扩展Kubernetes的功能,目前主要有网络、服务发现和可视化这三大类的附加项,下面是可用的一些附加项: