首页 > 其他分享 >K8S架构原理详解

K8S架构原理详解

时间:2023-04-09 21:56:19浏览次数:33  
标签:Node 架构 Kubernetes Controller 详解 集群 Pod K8S 节点

Kubernetes是什么,为什么上手这么难?

 

Kubernetes是一个基于容器技术的分布式集群管理系统。它是谷歌在大规模应用容器技术方面数十年经验的实际成果。因此,支持大规模的集群管理承载着非常多的组件,分布式本身的复杂度非常高。

 

Kubernetes到底有什么?

 

接下来我们一步步来看看Kubernetes到底有什么?

首先,既然是分布式系统,那么肯定有多个Node节点(物理主机或者虚拟机),它们共同构成了一个分布式集群,而这些节点之间会有一个Master节点,统一管理Node节点。如图所示:

 

 

 

问题1:Master节点和Worker节点如何通信?

首先,当Master节点启动时,会运行一个Kube-apiserver进程,它提供了集群管理的API接口,是集群中各个功能模块之间进行数据交互和通信的中心枢纽,同时也提供了一个完善的集群安全机制。

在Node节点上,利用Kubernetes中的kubelet组件,每个Node节点上都会运行一个kubelet进程,负责向Master汇报本节点的运行状态,如Node节点注册、终止、定期健康报告等等,并接收来自Master的命令并创建相应的Pod。

在Kubernetes中,Pod是最基本的运行单元。它与Docker容器略有不同,因为Pod中可能包含一个或多个容器(可以是Docker容器),这些容器内部共享网络资源,即可以通过localhost相互访问。

关于如何在Pod中实现网络共享,每个Pod启动,内部都会启动一个pause容器(谷歌的image)。它使用默认的网络模式,其他容器的网络设置为它,完成网络共享问题。

如图所示:

 

 

问题2:Master如何将Pod调度到指定的Node上?

这项工作由Kube-scheduler完成。整个调度过程通过执行一系列复杂的算法,最终为每个Pod计算出一个最优的目标Node,这是由Kube-scheduler进程自动完成的。

最常见的是循环调度(RR)。当然也有可能我们需要将Pod调度到指定的Node上。我们可以通过将节点的标签(Label)与Pod的节点选择器属性进行匹配来达到指定的效果。

如图所示:

 

 

问题3:各个节点和Pod的信息统一在哪里维护,谁来维护?

从上面的Pod调度来看,我们必须有一个存储中心来存储每个节点的每个Pod的资源使用情况、健康状态和基本信息,这样Pod调度才能正常进行。

在Kubernetes中,etcd组件被用作高可用和一致的存储库。该组件可以内置在Kubernetes中,也可以外部构建供Kubernetes使用。

集群上的所有配置信息都存储在etcd中。考虑到各个组件的相对独立性和整体的可维护性,这些存储的数据的增删改查都是统一由Kube-apiserver来调用的,并且apiserver还提供了REST支持,不仅为各个内部组件提供服务但也向集群外的用户公开服务。

外部用户可以通过REST接口或kubectl命令行工具管理集群,该工具内部与apiserver通信。

如图所示:

 

 

问题4:外部用户如何访问集群中运行的Pod?

前面我们讲了外部用户如何管理Kubernetes,但我们更关心的是内部运行的Pod如何对外访问。

用过Docker的同学应该都知道,如果使用bridge模式,在创建容器的时候会分配一个虚拟IP,外部无法访问该IP。我们需要做一层端口映射,将容器中的端口映射到宿主机的端口Map并绑定,这样外部就可以通过访问宿主机的指定端口来访问容器内部的端口。

那么,Kubernetes的外部访问也是这样实现的吗?答案是否定的,Kubernetes中的情况更加复杂。因为上面说的Docker是单机模式,一个容器对外暴露一个服务。在分布式集群中,服务往往由多个应用提供,以分担访问压力,而这些应用可能分布在多个节点上,这就涉及到跨主机通信。

这里Kubernetes引入了Service的概念,将多个相同的Pod包装成一个完整的服务,对外提供服务。至于获取这些相同的Pod,每个Pod在启动时都会设置labels为attribute。

在服务中,我们传递选择器Selector,选择与整体服务具有相同Name标签属性的Pod,将服务信息通过Apiserver存储到etcd中,由Service Controller完成。同时在每个节点上启动一个kube-proxy进程,负责从服务地址到Pod地址的代理和负载均衡。

如图所示:

 

 

问题5:Pod如何动态扩容和伸缩?

既然我们知道服务是由Pod组成的,那么服务的扩展也意味着Pod的扩展。通俗地说,就是在需要的时候将Pod做多个副本,在不需要的时候将Pod缩减到指定的副本数。

在Kubernetes中,使用Replication Controller进行管理,为每个Pod设置一个预期的副本数。当实际副本数量不符合预期时,动态调整数量以达到预期值。所需值可以由我们手动更新,也可以由自动缩放代理更新。如图所示:

 

 

问题6:各个组件如何协同工作?

最后说一下Kube-controller-manager进程的作用。我们知道ectd是作为集群数据的存储中心,而apiserver是用来管理数据中心,充当其他进程与数据中心通信的桥梁。

Service Controller和Replication Controller由Kube-controller-manager管理。作为一个守护进程,每个Controller都是一个控制回路,通过apiserver监控集群的共享状态,并尝试将实际状态中不符合预期的变化。关于Controller,管理器还包括Node Controller、ResourceQuota Controller、Namespace Controller等。

如图所示:

 

 

总结

 

本文通过问答的方式不涉及任何深入的实现细节。从整体的角度,从概念上介绍了Kubernetes涉及的基本概念。相关用途包括:

  • Node

  • Pod

  • Label

  • Selector

  • Replication Controller

  • Service Controller

  • ResourceQuota Controller

  • Namespace Controller

  • Node Controller

与运行过程相关的是:

  • kube-apiserver

  • kube-controller-manager

  • kube-scheduler

  • kubelet

  • kube-proxy

  • pause


标签:Node,架构,Kubernetes,Controller,详解,集群,Pod,K8S,节点
From: https://www.cnblogs.com/fengyun2050/p/17301174.html

相关文章

  • Taro架构构析(1):多端框架分析,Taro WePY uni-app对比
    多端框架分类全包型这类框架最大的特点就是从底层的渲染引擎、布局引擎,到中层的DSL,再到上层的框架全部由自己开发,代表框架是 Qt和Flutter。这类框架优点非常明显:性能(的上限)高;各平台渲染结果一致。缺点也非常明显:需要完全重新学习DSL(QML/Dart),以及难以适配中国特色的端:小程序......
  • AlertDialog(对话框)详解
    本节继续给大家带来是显示提示信息的第三个控件AlertDialog(对话框),同时它也是其他Dialog的的父类!比如ProgressDialog,TimePickerDialog等,而AlertDialog的父类是:Dialog!另外,不像前面学习的Toast和Notification,AlertDialog并不能直接new出来,如果你打开AlertDialog的源码,会发现构造方法......
  • Weex原理及架构剖析
    早期H5和Hybrid方案的本质是,利用客户端App的内置浏览器(也就是webview)功能,通过开发前端的H5页面满足跨平台需求。比如PhoneGapcordovaionic……该方案提升开发效率,同时也满足了跨端的需求。但有一个问题就是,前端H5的性能和客户端的性能相差甚远。Facebook推出ReactNative关于......
  • Docker架构
    概念理解镜像(image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。架构Docker是一个CS架构的程序,由两部分组成:服务端(server):Docker守护......
  • ReactJS到React-Native,架构原理概述
    React是一个纯JS的UI库,只能干HTML/CSS/JS提供的Web服务(新的H5API不一定支持), React-Native厉害在于它能打通JS和NativeCode,让JS能够调用丰富的原生接口,充分发挥硬件的能力,实现非常复杂的效果,同时能保证效率和跨平台性。在一定程度上,ReactNative和NodeJS有异曲同工之妙......
  • 云计算的三种模式IaaS/PaaS/SaaS/BaaS对比:SaaS架构设计分析
    SaaS——软件即服务(SoftwareasaService)的出现改变了传统使用软件转变为使用服务。SaaS与传统软件的最大区别是,前者按年付费租用服务,后者一次买断。这貌似只是“报价方式”的区别,实际上这是一个根本性的变化,这带来的是对服务模式、销售模式、公司价值等多维度的根本影响。传......
  • internet域名架构的实现
    环境根域:192.168.3.109com服务器:192.168.3.110hxg.com服务器主:192.168.3.108​ 从:192.168.3.107apache主机(www.hxg.com):192.168.3.104转发服务器:192.168.3.101本地DNS服务器:192.168.3.102测试客户端:192.168.3.103配置www.hxg.com主机安装apache$y......
  • [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构
    这是一篇系列博文。请关注我,学习更多.NETMAUI开发知识![MAUI项目实战]手势控制音乐播放器(一):概述与架构[MAUI项目实战]手势控制音乐播放器(二):手势交互[MAUI项目实战]手势控制音乐播放器(三):动画[MAUI项目实战]手势控制音乐播放器(四):圆形进度条在之前的博文中提到这个......
  • js异步——浅谈Chrome浏览器架构
    前言在讲述事件循环和消息队列之前,需要了解JS的单线程执行机制,JS的执行是从上到下依次执行的,这些便是同步任务,而异步操作类似于系统中断,即当前进程外部的实体(主线程之外的、宿主环境提供的、特殊的线程,如IO线程(HTTP请求)和定时器线程等)可以触发代码执行,然后在异步任务完毕后,执......
  • 分布式存储技术(下):宽表存储与全文搜索引擎的架构原理、特性、优缺点解析
    对于写密集型应用,每天写入量巨大,数据增长量无法预估,且对性能和可靠性要求非常高,普通关系型数据库无法满足其需求。对于全文搜索和数据分析这类对查询性能要求极高的场景也是如此。为了进一步满足上面两类场景的需求,有了宽表存储和搜索引擎技术,本文将对他们的架构、原理缺点做介绍。......