Kubernetes 系统架构

Kubernetes 的总架构图

Master 和 Node

Kubernetes 将集群中的机器划分为一个 Master 节点和一群工作节点(Node)。其中,Master 节点上运行着集群管理相关的一组进程 etcd、API Server、Controller Manager、Scheduler,后三个组件构成了 Kubernetes 的总控中心,这些进程实现了整个集群的资源管理、Pod 调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个 Node 上运行 Kubelet、Proxy、Docker daemon 三个组件,负责对本节点上的 Pod 的生命周期进行管理,以及实现服务代理的功能。

etcd

用于持久化存储集群中所有的资源对象,如 Node、Service、Pod、RC、Namespace 等;API Server 提供了操作 etcd 的封装接口 API,这些 API 基本上都是集群中资源对象的增删改查及监听资源变化的接口。

API Server

提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的 API 来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

API Server 内部有一套完备的安全机制,包括认证、授权和准入控制等相关模块

Controller Manager

集群内部的管理控制中心,其主要目的是实现 Kubernetes 集群的故障检测和恢复的自动化工作,比如根据 RC 的定义完成 Pod 的复制或移除,以确保 Pod 实例数符合 RC 副本的定义;根据 Service 与 Pod 的管理关系,完成服务的 Endpoints 对象的创建和更新;其他诸如 Node 的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由 Controller Manager 完成的。

Scheduler

Scheduler 是集群分发调度器,负责 Pod 在集群节点中的调度分配。具体工作包括:

  • Scheduler 收集和分析当前 Kubernetes 集群中所有 Minion/Node 节点的资源(内存、CPU)负载情况,然后依此分发新建的 Pod 到 Kubernetes 集群中可用的节点。
  • 实时监测 Kubernetes 集群中未分发和已分发的所有运行的 Pod。
  • Scheduler 也监测 Minion/Node 节点信息,由于会频繁查找 Minion/Node 节点,Scheduler 会缓存一份最新的信息在本地。
  • Scheduler 在分发 Pod 到指定的 Minion/Node 节点后,会把 Pod 相关的信息 Binding 写回 API Server。

Kubelet

Kubelet 可以看做节点上的 Pod 管家, 负责本 Node 节点上的 Pod 的创建、修改、监控、删除等全生命周期管理,同时 Kubelet 定时“上报”本 Node 的状态信息到 API Server 里。

kubelet 是 Master API Server 和 Node 之间的桥梁,接收 Master API Server 分配给它的 commands 和 work,通过 kube-apiserver 间接与 Etcd 集群交互,读取配置信息。

具体的工作如下:

  • 设置容器的环境变量、给容器绑定 Volume、给容器绑定 Port、根据指定的 Pod 运行一个单一容器、给指定的 Pod 创建 network 容器。
  • 同步 Pod 的状态、同步 Pod 的状态、从 cAdvisor 获取 container info、 pod info、 root info、 machine info。
  • 在容器中运行命令、杀死容器、删除 Pod 的所有容器。

Proxy

实现了 Service 的代理与软件模式的负载均衡器。

客户端通过 Kubectl 命令行工具或 Kubectl Proxy 来访问 Kubernetes 系统,在 Kubernetes 集群内部的客户端可以直接使用 Kuberctl 命令管理集群。Kubectl Proxy 是 API Server 的一个反向代理,在 Kubernetes 集群外部的客户端可以通过 Kubernetes Proxy 来访问 API Server。

Proxy 是为了解决外部网络能够访问跨机器集群中容器提供的应用服务而设计的,运行在每个 Minion 上。Proxy 提供 TCP/UDP sockets 的 proxy,每创建一种 Service,Proxy 主要从 etcd 获取 Services 和 Endpoints 的配置信息(也可以从 file 获取),然后根据配置信息在 Minion 上启动一个 Proxy 的进程并监听相应的服务端口,当外部请求发生时,Proxy 会根据 Load Balancer 将请求分发到后端正确的容器处理。

所以 Proxy 不但解决了同一主宿机相同服务端口冲突的问题,还提供了 Service 转发服务端口对外提供服务的能力,Proxy 后端使用了随机、轮循负载均衡算法。

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress