在k8s和容器docker出来之前,最火的技术莫过于开源云平台openstack了,那么openstack做了什么事情呢?利用虚拟化技术实现资源的弹性使用,如果你是做开发的,你肯定知道数据库连接池,谁需要谁就拿走连接,用完了就换回去。同理,云平台无非就是把计算、存储、网络这三种资源进行了池化,进而希望达到弹性使用的目的。(弹性就是想啥时要都有,想要多少都行)。
openstack实际上就是利用虚拟化技术(例如KVM)等对服务器集群进行管理,管理的目标就是要达到两个方面的灵活性。哪两个方面呢?比如有个人需要一台很小很小的电脑,只有一个CPU,1G内存,10G的硬盘,一兆的带宽,你能给他吗?像这种这么小规格的电脑,现在随便一个笔记本电脑都比这个配置强了,家里随便拉一个宽带都要100M。然而如果去一个云计算的平台上,他要想要这个资源的时候,只要一点就有了。
所以说它就能达到两个方面灵活性:
空间灵活性和时间灵活性,就是常说的云计算的弹性。
全部内容可以参考另一篇博客:为什么需要云计算
首先,云计算是为了解决计算、网络、存储这三种资源的弹性问题,但是它遗留了两个问题:
鉴于以上的两种问题,有人提出了比KVM更加轻量级的虚拟化技术,希望能够解决上述的问题:
docker被人拿到台面上来,docker主要依赖于两个技术,分别是cgroup和namespace,这两个技术保证了容器的隔离性。
docker和KVM的对比:
详情参考:为什么需要容器
docker如果一直跑单机,自然不需要k8s。可是万一你想在一个集群中跑k8s呢?那你就不得不面对两个问题:
k8s的发展就依赖于这股全民皆容器的浪潮当中,k8s是容器的编排工具,所谓编排,就是对容器进行管理,从端口暴露到外网,负载均衡,服务注册与发现,应用的编排与弹性伸缩,滚动更新,灰度发布等等。这些内容都交由k8s去实现。
同时,k8s可以说是最好的微服务载体,把一个非常大的单体应用分解为很多小的互相连接的微服务,一个微服务副本后面可能需要多个实例的支撑。副本的数量可以根据系统的负载进行动态的调整,每个微服务独立开发,升级,扩展。最后,k8s具有非常强大的横向扩展能力,这个能力能够帮助企业从几个结点的集群,平滑的扩展到几百个结点的集群,大大增强了系统的弹性。
Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。一个pod里面可以包含多个容器。这多个容器共享Pod的ip地址。
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。
label是k8s中的键值对,用户可以自己设定key和value。某一个对象可以有多个label,同一个lable也可以打给多个对象。因此,通过选择label,就能够选择一组合适的资源对象。当所有的资源都有了label之后,使用label selector就相当于在数据库当中使用where语句,最终能够得到一组相同label的资源。
k8s集群有两种集群角色,一种是Master,一种是Node,Master相当于大脑,控制着整个集群的运转,Node是k8s完成实际工作的节点。
Master节点主要有以下几个组件:
API Server提供HTTP/HTTPS RESTful API,即Kubernetes API。 API Server是Kubernetes Cluster的前端接口,各种客户端工具(CLI或 UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。
Scheduler负责决定将Pod放在哪个Node上运行。Scheduler在调度 时会充分考虑Cluster的拓扑结构,当前各个节点的负载,以及应用对 高可用、性能、数据亲和性的需求。是一个内部的调度器。
Controller Manager负责管理Cluster各种资源,相当于所有资源的控制中心,保证资源处于预期 的状态。Controller Manager由多种controller组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等。
etcd负责保存Kubernetes Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件。相当于一个配置中心,里面包含了所有组件的配置文件。
Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络, flannel是其中一个可选方案。calico也是一种网络方案。二者的区别主要在于,flannel是二层overlay网络,而calico是路由转发网络。
整个Master结点的运作过程如上图所示。
Node节点上一般会运行以下进程:
kubelet是Node的agent,当Scheduler确定在某个Node上运行Pod 后,会将Pod的具体配置信息(image、volume等)发送给该节点的 kubelet,kubelet根据这些信息创建和运行容器,并向Master报告运行 状态
service在逻辑上代表了后端的多个Pod,外界通过service访问 Pod。service接收到的请求是如何转发到Pod的呢?这就是kube-proxy 要完成的工作.每个Node都会运行kube-proxy服务,它负责将访问service的 TCP/UPD数据流转发到后端的容器。如果有多个副本,kube-proxy会 实现负载均衡.
Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络, flannel是其中一个可选方案(二层overlay网络)。calico也是其中一个方案(依靠路由转发实现)
Master结点和Node结点实际的工作流程如上图所示:
其中etcd会将应用的配置和当前的状态信息保存在etcd当中,当执行kubectl get xxx(某种资源)的时候可以读取etcd当中相关的信息。