全体上了解流程和原理;

一、背景

根据分布式的架构中,需求办理的服务是十分多的,无论是服务的数量仍是体系区分;

从服务的才能上看,能够进行分层管控,只是其中有相当一部分服务层,改动更新的频率很低,所以感知也不明显;

K8S | 核心原理分析

就以自己当下参加研发的体系来说;

经过K8S进行办理的服务近百个,这中间有部分服务采用集群形式,即便是这个规划的体系,也简直不可能依赖纯人工运维的形式,主动化流程必不可少;

二、继续集成

此前围绕该主题写过一个完好的实践事例,首要围绕Jenkins、Docker、K8S等组件的运用层面,总结源码编译、打包、镜像构建、布置等主动化办理的流程;

K8S | 核心原理分析

Jenkins:是一个扩展性十分强的软件,用于主动化各种任务,包含构建、测试和布置等;

Docker:作为开源的运用容器引擎,能够把运用程序和其相关依赖打包生成一个Image镜像文件,是一个规范的运转环境,提供可继续交给的才能;

Kubernetes:作为开源的容器编排引擎,用来对容器化运用进行主动化布置、 扩缩和办理;

三、K8S架构

1、中心组件

K8S | 核心原理分析

Control-Plane-Components:操控平面组件

对集群做出大局决议计划,例如:资源调度、检测、事情呼应,能够在集群中的任何节点上运转;

  • api:开放K8S的API,组件之间经过API交互,相当于操控面的前端;
  • controllermanager:运转操控器进程,逻辑上是一个独自的进程;
  • scheduler:监听新建未指定运转节点的Pods,并为Pod挑选运转节点;
  • etcd:兼具一致性和高可用性的键值数据库,作为保存K8S数据的后台库;

Node:节点组件

该组件会在每个节点上运转,负责保护运转的Pod并提供Kubernetes运转环境;

  • kubelet:在每个节点上运转的代理,保证容器都运转在Pod中;
  • kube-proxy:每个节点上运转的网络代理, 保护节点上的网络规矩;

Container-Runtime:容器运转时

负责运转容器的软件,支撑Docker、containerd、CRI-O等多个容器运转环境,以及任何完结Kubernetes-CRI容器运转环境接口;

2、分层结构

从全体的功用上来考虑,K8S集群能够分为:用户、操控平面、节点三个模块;

K8S | 核心原理分析

用户侧:不论是CLI命令行仍是UI界面,会与操控面板的APIserver进行交互,APIserver再与其他组件交互,最终履行相应的操作命令;

操控平面:曾经也称为Master,中心组件包含APIserver、controller、scheduler、etcd,首要用来调度整个集群,以及做出大局决议计划;

节点:经过将容器放入在节点上运转的Pod中来履行工作负载,简单的了解工作负载便是各种运用程序等,节点上的中心组件包含Pod、kubelet、Container-Runtime、kube-proxy等;

3、中心才能

站在研发的视角来看,K8S提供极端强壮的运用服务办理才能;

3.1 发现与负载

服务Service能够将运转在一个或一组Pod上的网络运用程序揭露为网络服务的方法,一般运用标签对资源目标进行筛选过滤;

K8S | 核心原理分析

3.2 调度

调度器经过监测机制来发现集群中新创立且尚未被调度到节点上的Pod,由于Pod中的容器和Pod本身可能有不同的资源要求,调度会将Pod放置到合适的节点上;

K8S | 核心原理分析

3.3 主动弹性

K8S能够经过目标检查工作负载的资源需求,例如CPU利用率、呼应时长、内存利用率、或许其他,然后判别是否需求履行弹性,垂直维度能够是更多的资源分配,水平维度能够是更多的集群布置;

K8S | 核心原理分析

K8S能够主动弹性,也具有主动修正的才能,当节点故障或许运用服务异常时,会被检查到,可能会进行节点迁移或许重启;

四、运用事例

1、服务布置

在此前的实践事例中,用CLI命令行和脚本文件的方法,完结的布置动作,而在整个流程中触及集群的多个组件协作,多次的通信和调度;

kubectl create -f pod.yaml

K8S | 核心原理分析

2、交互流程

K8S | 核心原理分析

【1】CLI命令行和UI界面,都是经过APIserver接口,与集群内部组件交互,比方上述的Pod布置操作;

【2】在APIserver收到请求之后,会将序列化状况的目标写入到etcd中完结存储操作;

【3】Scheduler调度器经过监测(Watch)机制来发现集群中新创立且尚未被调度到节点上的Pod;

【4】在集群中找到一个Pod的所有可调度节点,对这些可调度节点打分,选出其中得分最高的节点来运转Pod,然后调度器将这个调度决定告诉给APIserver;

【5】APIserver完结信息存储后,然后告诉相应节点的Kubelet;

【6】Kubelet是根据PodSpec来工作的,保证这些PodSpec中描绘的容器处于运转状况且运转状况良好,每个PodSpec是一个描绘Pod的YAML或JSON目标;

【7】Pod是能够在Kubernetes中创立和办理的、最小的可布置的核算单元,包含一个或多个容器;

五、参阅源码

    文档库房:
    https://gitee.com/cicadasmile/butte-java-note
    脚本库房:
    https://gitee.com/cicadasmile/butte-auto-parent