认识Kubernetes组件

Kubernetes架构

 

 

 

 

 

Kubernetes核心组件

 

 etcd:

etcd是key-value键值存储数据库,在kubernetes中用来存储Kubernetes的信息(如pod、rc、service等资源信息)。

kubelet:

kubelet运行在minion节点,主要作用有:

  1. Node管理
    • 管理注册节点信息
    • 监控容器和节点资源
    • 定期向master汇报本节点资源消耗情况
  2. Pod管理
    kubelet通过apiserver监听etcd,所有针对pod的操作都会被监听到,如果其中有涉及本节点的pod,则按照要求进行创建、修改、删除等操作
  3. 容器状态检查
    kubelet通过两类探针检查容器的状态:
    • LivenessProbe: 判断一个容器是否健康,如果不健康则会删除这个容器,并按照restartPolicy看是否重启这个容器。
    • ReadinessProbe: 用于判断容器是否启动完全。如果返回失败,则endpoint controller会将这个pod的end potint 从service的endpoint列表中删除。(每个pod会被分配一个单独的Pod IP,Pod IP+ContainerPort组成了一个endpoint)

Apiserver

用于暴露Kubernetes API。任何的资源请求/调用操作都是通过apiserver提供的接口进行。

Controller-manager

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

  1. Replication Controller
  2. Node Controller
  3. ResourceQuota Controller
  4. Namespace Controller
  5. Endpoint Controller
  6. Service Controller

Flannel

flannel是针对Kubernetes设计的一个网络覆盖工具,其目的是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

kube-Proxy

Proxy运行在minion节点,负责为pod提供代理功能,会定期从etcd获取service信息,并根据service信息通过修改iptables来实现流量转发(1.9之前),将流量转发到要访问的pod所在的节点上去。

Scheduler

负责集群资源的调度和管理,例如当有 pod 异常退出需要重新分配机器时,scheduler 通过一定的调度算法从而找到最合适的节点

Kubernetes部分概念

Pods

Pod是Kubernetes进行资源调度的最小单位,每个Pod中运行着一个或多个密切相关的业务容器,这些业务容器共享容器的IP和Volume。一个Pod一旦被创建,其信息就会放到etcd中存储,然后由master调度到一个Node绑定,由这个Node上的kubelet进行实例化。

每个Pod会被分配一个单独的Pod IP,Pod IP + ContainerPort组成了一个Endpoint

Service

Service定义了一个Pod的逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义Label和selector完成。比如pods有一个buy的标签,分出了一组pods,那么这组pods就属于一个service,他们提供统一的服务,又有一组sell分出了另一组pods,他们属于另一个service。在service调用的时候,不用关系具体调用的是哪一个pod。Service收到kube-proxy发来的消息,再重定向到具体的pod端口。

一般还需要一个Deployment或者RC来帮助service来保证其服务能力与质量。

 

外部访问Service

由于Service对象在Cluster IP Range池中分配到的IP只能在内部访问,所以其Pod都可以无碍访问到它。但如果这个service作为前端服务,准备为集群外的客户端提供服务,我们就需要给这个服务提供公共IP了。

Kubernetes支持两种对外提供服务的Service的type定义:NodePort和LoadBalancer

NodePort

在定义Service时,指定spec.type=NodePort,并指定spec.ports.nodePort的值,系统就会在Kubernetes集群中的每个node上打开一个主机上的真实端口。这样一来,能访问Node的客户端就都能通过端口号访问内部的Service了。

LoadBalancer

如果云服务商支持外界负载均衡器,则可以通过spec.type=LoadBalancer定义Service,同时指定负载均衡器的IP地址。

Deployment

Pod是运行服务的基础,最初使用Replication Controller(RC)来部署、升级Pod。Replica Set是下一代RC,区别在于RC只支持给予等式的selector(env=dev或environment!=qa),而Replica Set还支持新的基于集合的selector (version in (v1.0,v2.0)或env notin (dev,qa)),这为复杂的运维管理带来很大方便。Deployment使用了Replica Set,是更高一层的概念,并且提供了额外的新特性:

  • 事件和状态查看:可以查看Deployment的升级详细进度和状态
  • 回滚:当升级pod镜像或相关参数时发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本
  • 版本记录:每一次对Deployment的操作,都能保存下来,给后续可能的回滚使用
  • 暂停和启动:对于每一次升级,都能随时暂停和启动
  • 多种升级方案:Recreate——删除所有已存在的pod,重新创建新的;Rolling Update——滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。

Namespace

Namespace(命名空间)通过将系统内部的对象分配到不同的Namespace中,形成逻辑上分组的不同项目、小组或者用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。

Kubernetes集群在启动后,会创建一个名为“Default”的Namespace,如果不特别指明Namespace,则用户创建的Pod、Service、Deployment等都会被系统创建到“Default”的Namespace中。

StatefulSet

Statefule是一个给Pod提供唯一标志的控制器,它可以保证部署和扩展的顺序。

当应用有以下任意要求时,StatefulSet的价值就体现出来了。

  • 稳定的、唯一的网络标识。
  • 稳定的、持久化的存储。
  • 有序的、优雅的部署和扩展。
  • 有序的、优雅的删除和停止。

上面提到的点中,在Pod调度时,稳定性和持久化是同一个意思。如果一个应用不需要任何稳定的标识或顺序的部署、删除和扩展,那么应该使用提供无状态备份的控制器来部署应用。诸如Deployment或者ReplicaSet可能更适合无状态服务需求。

使用StatefulSet,给定Pod的存储必须是给予请求存储等级(Storage Class)的PersistentVolume Provisioner,或者是有管理员预先配置。删除和(或)减少StatefulSet副本,不会删除StatefulSet相关的卷。这样做是为了保证数据安全,比自动清除StatefulSet相关资源更有价值。StatefulSet需要Headless服务来负责Pod的网络一致性,并且更新已经存在的StatefulSet需要手动执行。

Kubernetes存储系统

普通Volume

普通Volume,最简单的一种是单节点存储卷。它和Docker的存储卷类似,使用的是Pod所在Kubernetes节点的本地目录。具体有两种,一种是EmptyDir,是一个匿名的空目录,由Kubernetes在创建Pod时创建,删除Pod时删除。另一种是hostPath,与EmptyDir的区别是,它在Pod之外独立存在,由用户指定路径名。单节点存储卷在Pod迁移到其它节点后数据就会丢失,所以只能用于存储临时数据或用于在同一个Pod里的容器共享数据。

第二种类型是跨节点绑定的存储卷。这种存储卷不和某个具体的Kubernetes节点绑定,而是独立于Kubernetes节点存在的。

Persistent Volume

普通Volume和使用它的Pod之间是一种静态绑定关系,我们无法单独创建一个普通Volume,因为它不是一个独立的Kubernetes资源对象。而Persistent Volume(PV)是一个Kubernetes资源对象,所以我们可以单独创建。它不和Pod直接发生关系,而是通过Persistent Volume Claim(PVC)来实现动态绑定。

创建PV有两种方式,静态和动态。

静态方式是管理员手动创建一堆PV,组成一个PV池,供PVC来绑定。动态方式是通过一个叫storage class的对象由存储系统根据PVC的要求自动创建。

一个PV创建完成后状态会变成Available,等待被PVC绑定。一旦被PVC绑定,PV的状态会变成Bound,就可以被相应的Pod使用。Pod使用完后会释放PV,PV的状态变成Released。

变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略,Retain、Delete和Recycle。

Retain就是保留现场,Kubernetes不作处理。Delete策略,Kubernetes会自动删除该PV以及里面的数据。Recycle方式,Kubernetes会将PV里的数据删除,然后把PV状态变成Available,又可以被新的PVC绑定使用。

参考地址:

https://www.kubernetes.org.cn/k8s

 

posted @ 2020-04-08 18:41  一颗会发光的螺丝钉  阅读(254)  评论(0)    收藏  举报