Kubernetes(K8S)

一、简介

  Kubernetes是Google公司在2014年6月开源的一个容器集群管理系统,使用Go语言开发,也叫K8S。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。

 Kubernetes特点:

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展: 模块化, 插件化, 可挂载, 可组合
  • 自愈: 自动布置,自动重启,自动复制,自动扩展

二、基本对象概念

  (1)Pod

  Pod是Kubernetes中最小部署单元,所有的容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器。Pod中容器共享存储和网络,同一个Pod中的容器会部署在同一个docker宿主机上并且能够共享资源。

  (2)Service

  Service是一个应用服务抽象,定义了Pod逻辑集合和访问这个pod集合的策略(比如访问策略)。Service代理Pod集合对外表现为一个访问入口,分配一个机器IP地址,来自这个IP的请求将负载均衡转发到后端Pod中的容器。Service通过Lable Selector选择一组Pod提供服务。

  (3)Volume

  数据卷

  • 可以用来共享Pod容器中使用的数据
  • 持久化数据

  (4)Namespace

  是kubernetes系统中的另一个重要的概念,通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。Kubernetes集群在启动后,会创建一个名为“default”的Namespace,如果不特别指明Namespace,则用户创建的Pod、RC、Service都被系统创建到“default”的Namespace中。

  (5)Label

  Label机制是K8S中一个重要设计,通过Label进行对象弱关联,灵活地分类和选择不同服务或业务,让用户根据自己特定的组织结构以松耦合方式进行服务部署。Label是一对KV,对用户而言非常有意义的,但对K8S本身而言没有直接意义的。Label可以在创建对象时指定,也可以在后期修改,每个对象可以拥有多个标签,但key值必须是唯一的。

  (6)RC(Replication Controller)

  Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods。对于利用pod 模板创建的pods,Replication Controller根据label selector来关联,通过修改pods的label可以删除对应的pods。

  (7)Deployment

  Kubernetes Deployment提供了官方的用于更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment对象中只描述您所期望的理想状态(预期的运行状态),Deployment控制器为您将现在的实际状态转换成您期望的状态,例如,您想将所有的webapp:v1.0.9升级成webapp:v1.1.0,您只需创建一个Deployment,Kubernetes会按照Deployment自动进行升级。现在,您可以通过Deployment来创建新的资源(pod,rs,rc),替换已经存在的资源等。

  Deployment集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一版本(成功/稳定)的Deployment等功能,在某种程度上,Deployment可以帮我们实现无人值守的上线,大大降低我们的上线过程的复杂沟通、操作风险。

  (8)StatefulSet

  使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个来保证可用性,但是由于是无状态的,Pod挂了的时候与之前的Volume的关系就已经断开了,新起来的Pod无法找到之前volume。StatefulSet 的目的就是给为数众多的有状态负载提供正确的控制器支持。

  当应用有以下任意要求时,StatefulSet的价值就体现出来了。 
   ● 稳定的、唯一的网络标识。 
   ● 稳定的、持久化的存储。 
   ● 有序的、优雅的部署和扩展。 
   ● 有序的、优雅的删除和停止。 

  (9)DaemonSet

  DaemonSet能够让所有(或者一些特定)的Node节点运行同一个pod。当节点加入到kubernetes集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。

  (10)Job

  在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了。在这种场景下,创建pod就显得不那么合适。于是就是了Job,Job指的就是那些一次性任务。通过Job运行一个容器,当其任务执行完以后,就自动退出,集群也不再重新将其唤醒。还可以执行定时任务。

三、主要功能 

1.数据卷
   Pod中的容器之间共享数据或者持久化数据,可以使用数据卷。

2.应用程序健康检查
   容器内服务可能进程堵塞无法处理请求,可以设置监控健康检查策略保证应用的健壮性。(默认情况下只保证容器本身正常,不会对应该程序状态检测)

3.复制应用程序实例
   控制器维护Pod副本的数量,保证一个Pod或一组同类的Pod数量始终可用。

4.弹性伸缩
   根据设定的指标(CPU利用率)自动缩放Pod副本数。

5.服务发现
   使用环境变量或DNS服务插件保证容器中程序发现Pod入口的访问地址。

6.复制均衡
   一组Pod副本分配一个使用的机器IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可以通过这个ClusterIP访问应用。

7.滚动更新
   更新服务不中断,一次更新一个Pod,而不是同时删除整个服务

8.服务编排
   通过文件描述部署服务,使得应用程序部署变得更有效。

9.资源监控
   Node节点组件集成cAdvisor资源收集工具,可以通过Heapster汇总整个集群节点资源数据,然后存储到IfluxDB时序数据库中,再由Grafana展示。

10.提供认证和授权
   支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略 

 

四、系统架构和组件功能

  

  4.1组件和功能

   Kubernetes集群包括Kubernetes节点(Node )和Kubernetes服务(master node)两种角色,代理角色的组件包括Kube-proxy 和Kubelet,它们同时部署在一个节点上,这个节点也就是代理节点。服务角色的组件包括kube-apiserver,kube-scheduler,kube-controller-manager。

  Master组件:

  • apiserver:作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
  • scheduler:负责集群的资源调度,为新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
  • controller-manager:负责执行各种控制器,目前有两类:
  • endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
    replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。

   Node组件: 

  • kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
  • proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
  • docker或rocket/rkt:运行容器

  4.2工作流程

  1.Kubectl(user commands): k8s APIs客户端工具,通过用户输入命令操作APIs资源

  2.认证,用户输入命令要通过APIs的认证

  3.认证通过之后,交由APIs中REST中对象处理(Kubernetes以RESTFul形式开放接口,用户可操作的REST对象有三个Pod,service,controller)

  4.APIs中的操作处理都会持久化存储到一个分布式存储etcd

  5.Scheduler调度组件,会检测REST对象中是否有新的动作产生,并将具体操作,根据算法下发到node节点中

  6.Controller通过API Server提供的接口实时监控整个集群的每个资源对象的当前状态,当发生各种故障导致系统状态发生变化时,会尝试将系统状态修复到“期望状态”

  7.kubeletl类似于一个agent,处理AIPs下发的任务,如创建Pod、容器、获取节点信息等

  8.proxy负责网络代理,Service具体实现就是有proxy处理,维护网络规则和四层负载均衡工作

posted @ 2018-04-23 16:44  Bigberg  阅读(2742)  评论(0编辑  收藏  举报