kubernetes一些简单概念

Posted by 聪少 on 2018-08-17

Kubernetes是Google大爷在2014年发布的一个开源项目。

Cluster

Cluster是计算、存储和网络资源的集合,kubuernetes利用这些资源运行各种基于容器的应用。

Master

Master是Cluster的大脑,作用主要调度应用在哪里运行。

Node

Node主要是运营容器应用,有master管理,node负责监控并上报容器状态,根据master设置的策略来管理容器的生命周期。

Pod

Pod是kubernetes的最小工作单元,每个pod可以包含一个或者多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。

kubernetes为什么要引入Pod:

  • 可管理性

有些容器联系非常密切,将它们封装到同一运行单元中是一种更改层次的抽象。Kubernetes以pod为最小单元进行调度、拓展、资源共享、管理生命周期等。

  • 通信和资源共享

Pod中的所有容器使用同一个网络namespace,即相同的IP和Port空间,他们可以直接通过localhost通信。可以共享存储。kubernetes挂载volume到Pod中,本质是把volume挂载到每个容器上。

Controller

Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

Kubernetes提供了多种Controller:

Replication Controller

Replication Controller为Kubernetes的一个核心内容,应用托管到Kubernetes之后,需要保证应用能够持续的运行,Replication Controller就是这个保证的key,主要的功能如下:

  • 确保pod数量:它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新的,反之则会删除掉多余的以保证Pod数量不变。

  • 确保pod健康:当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。

  • 弹性伸缩 :在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。

  • 滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。

Deployment

Deployment同样为Kubernetes的一个核心内容,主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Control,ler之外的新特性:

  • Replication Controller全部功能:Deployment继承了上面描述的Replication Controller全部功能。

  • 事件和状态查看:可以查看Deployment的升级详细进度和状态。

  • 回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。

  • 版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。

  • 暂停和启动:对于每一次升级,都能够随时暂停和启动。

  • 多种升级方案:Recreate----删除所有已存在的pod,重新创建新的; RollingUpdate----滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。

其他

  • daemonset
  • statefuleSet
  • job

Service

支持外界访问一组特定pod的方式,Service有自己的IP和端口,并为Pod提供了负载均衡功能。

Namespace

同一Cluster中划分的虚拟Cluster,不同的namespace里的资源是完全隔离的。