kubernetes是什么 关于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涉及的基本概念。


图像噪声的成因分类与常见图像去噪算法简介
有刷电机驱动方法:通过单开关电路和半桥电路进行驱动
ET610电能表现场校验仪的应用特点及按键操作方法
浩康科技Crypton Tech推出了超高速USB3.0解决方案
现代汽车推动印尼电动汽车工业的发展
kubernetes是什么 关于K8S架构原理的硬核干货分享
高端音频应用电阻器选择
三思“多杆合一”解决方案助力城市新建设
小型气象站可提高农业生产产量,它的应用有哪些
RFID技术智能交通信息化的四大应用
解析在CentOS7上安装docker-machine的过程
利用我们的UART到无线桥接为现有硬件添加连通性
荣耀V40或将成为目前最好的“电竞屏”
中国智能手机在2018年出货量同比下降11%
射频开关的主要作用
东芝内存芯片业务获批艰难 IPO计划即将开启
三坐标测量机——汽车零部件几何量测量与品质控制系统
多功能食品安全快速分析仪的功能说明
WT9110功放芯片概述及功能特性
深圳华强北的成熟:从模仿到被模仿