上一节我们介绍了《Kubernetes 快速上手》,主要是引导大家开始使用Kubernetes,大家可以尝试把自己的应用部署在Kubernetes上;这节给大家介绍下Kubernetes的架构和核心组件,帮助大家更好的理解Kubernetes.
一、Kubernetes 架构
Kubernetes集群采用主从架构,由master节点和node节点构成,如下图:
关于Kubernetes的架构说明:
- master节点可以有多个,构成高可用集群。
- node节点可以根据业务需要随时进行扩展,不要求在搭建环境的时候一次性部署。
- 资源有限的情况下(只有一个节点),可以在master节点上同时部署node节点上的组件,成为单机集群。
- 图中的docker也可以是其他容器引擎,比如rkt等。
二、Kubernetes 核心组件
在Kubernetes的架构图中,可以看到master节点上部署了etcd,API Server,scheduler,controller manager 组件;node节点上部署了kubelet,kube-proxy组件,下面从两方面介绍Kubernetes的核心组件:
2.1 组件功能说明
先从每个组件的功能进行说明:
-
etcd 主要用于为 Kubernetes 提供存储系统,保存了整个集群的状态数据。
-
API Server用于暴露Kubernetes API.任何资源请求/调用都是通过API Server提供的接口进行操作。同时提供认证、授权、访问控制、API注册和发现等机制。
-
scheduler 负责资源的调度,按照预定的调度策略将pod调度到相应的node节点上。它的工作流程大致如下图所示:
-
controller manager 负责维护集群的状态,比如故障检测,自动伸缩,滚动更新等。它的实现方式是通过在集群中运行处理相关任务的后台线程来实现对应的功能。通过源码我们看到有以下控制器:
每个Controller负责完成一项任务,各个Controller共同支撑整个Kubernetes集群的功能流程,比如:- Endpoints Controller:端点控制器,填充Endpoints对象(连接services和pods)。
- Replication Controller:副本控制器,负责维护集群中每个pod的副本数。
- PodGC Controller:负责pod的清理工作。
- ResourceQuota Controller: 确保指定的资源对象在任何时候都不会超量占用系统物理资源。
- DaemonSet Controller: 检测node个数变化,通知API Server创建/删除指定pod。
- …
-
kubelet 主要负责处理master节点下发到node节点的任务,负责node节点上容器的创建、删除、监控等生命周期管理,上报node节点的信息,如CPU,内存,pod的IP等到master节点。
-
kuber-proxy 用于提供集群内部的服务发现和负载均衡能力。
2.2 组件协作流程
知道了每个组件的功能后,下面举两个创建资源的例子来说明各个组件在整个流程中的作用.
2.2.1 创建副本集
在部署应用的时候,我们通常会定义一个Deployment编排来创建环境,Deployment创建好之后,Kubernetes会自动创建副本控制器。当然我们也可以直接定义副本控制器的编排来创建环境。下图描述了在创建副本控制器(rc)的过程中,各个组件的协作关系:
- 我们向API Server发起创建rc的请求,API Server把数据持久化到etcd,然后返回。
- controller manager 从API Server获取当前rc列表,并依次遍历每个rc,并向API Server获取rc对应pod的状态。
- API Server接受到获取pod状态的请求,然后向各个kubelet 发起获取pod的状态的请求。
- kubelet 调用容器引擎(docker)获取容器的状态,然后把结果返回给API Server。
- API Server把pod状态返回给controller manager,controller manager进行对比预期状态和实际状态,如果两个状态不一致,就会向API Server发起创建pod的请求。
2.2.2 创建容器组
容器组(pod)是Kubernetes调度的最小单位,pod里面有若干容器,容器里面就是我们的实际应用。下图描述了在创建容器组(pod)的过程中,各个组件的协作关系:
- 向API Server发起创建pod的请求,API Server把数据持久化到etcd,然后返回。
- Scheduler 监听到有需要创建的pod,然后根据调度策略,选取一个最合适的node节点进行绑定,最后将绑定结果告诉API Server,API Server把绑定结果写入etcd。
- kubelet监听到有需要创建pod,调用本地容器引擎接口创建容器,然后把结果返回API Server.
- API Server把结果信息写入etcd。
总结
本文介绍了Kubernetes的架构和核心组件,了解了以上信息,可以方便我们理解Kubernetes的工作原理,在使用Kubernetes的过程中遇到问题也容易定位。下节给大家分享《Kubernetes Service详解》。