learn-tech/专栏/Kubernetes入门实战课/10自动化的运维管理:探究Kubernetes工作机制的奥秘.md
2024-10-16 06:37:41 +08:00

13 KiB
Raw Blame History

                        因收到Google相关通知网站将会择期关闭。相关通知内容
                        
                        
                        10 自动化的运维管理探究Kubernetes工作机制的奥秘
                        你好我是Chrono。

在上一次课里我们看到容器技术只实现了应用的打包分发到运维真正落地实施的时候仍然会遇到很多困难所以就需要用容器编排技术来解决这些问题而Kubernetes是这个领域的唯一霸主已经成为了“事实标准”。

那么Kubernetes凭什么能担当这样的领军重任呢难道仅仅因为它是由Google主导开发的吗

今天我就带你一起来看看Kubernetes的内部架构和工作机制了解它能够傲视群雄的秘密所在。

云计算时代的操作系统

前面我曾经说过Kubernetes是一个生产级别的容器编排平台和集群管理系统能够创建、调度容器监控、管理服务器。

容器是什么容器是软件是应用是进程。服务器是什么服务器是硬件是CPU、内存、硬盘、网卡。那么既可以管理软件也可以管理硬件这样的东西应该是什么

你也许会脱口而出这就是一个操作系统Operating System

没错从某种角度来看Kubernetes可以说是一个集群级别的操作系统主要功能就是资源管理和作业调度。但Kubernetes不是运行在单机上管理单台计算资源和进程而是运行在多台服务器上管理几百几千台的计算资源以及在这些资源上运行的上万上百万的进程规模要大得多。

所以你可以把Kubernetes与Linux对比起来学习而这个新的操作系统里自然会有一系列新名词、新术语你也需要使用新的思维方式来考虑问题必要的时候还得和过去的习惯“说再见”。

Kubernetes这个操作系统与Linux还有一点区别你值得注意。Linux的用户通常是两类人Dev和Ops而在Kubernetes里则只有一类人DevOps。

在以前的应用实施流程中,开发人员和运维人员分工明确,开发完成后需要编写详细的说明文档,然后交给运维去部署管理,两者之间不能随便“越线”。

而在Kubernetes这里开发和运维的界限变得不那么清晰了。由于云原生的兴起开发人员从一开始就必须考虑后续的部署运维工作而运维人员也需要在早期介入开发才能做好应用的运维监控工作。

这就会导致很多Kubernetes的新用户会面临身份的转变一开始可能会有点困难。不过不用担心这也非常正常任何的学习过程都有个适应期只要过了最初的概念理解阶段就好了。

Kubernetes的基本架构

操作系统的一个重要功能就是抽象,从繁琐的底层事务中抽象出一些简洁的概念,然后基于这些概念去管理系统资源。

Kubernetes也是这样它的管理目标是大规模的集群和应用必须要能够把系统抽象到足够高的层次分解出一些松耦合的对象才能简化系统模型减轻用户的心智负担。

所以Kubernetes扮演的角色就如同一个“大师级别”的系统管理员具有丰富的集群运维经验独创了自己的一套工作方式不需要太多的外部干预就能够自主实现原先许多复杂的管理工作。

下面我们就来看看这位资深管理员的“内功心法”。

Kubernetes官网上有一张架构图但我觉得不是太清晰、重点不突出所以另外找了一份图片来源。虽然这张图有点“老”但对于我们初学Kubernetes还是比较合适的。

Kubernetes采用了现今流行的“控制面/数据面”Control Plane / Data Plane架构集群里的计算机被称为“节点”Node可以是实机也可以是虚机少量的节点用作控制面来执行集群的管理维护工作其他的大部分节点都被划归数据面用来跑业务应用。

控制面的节点在Kubernetes里叫做Master Node一般简称为Master它是整个集群里最重要的部分可以说是Kubernetes的大脑和心脏。

数据面的节点叫做Worker Node一般就简称为Worker或者Node相当于Kubernetes的手和脚在Master的指挥下干活。

Node的数量非常多构成了一个资源池Kubernetes就在这个池里分配资源调度应用。因为资源被“池化”了所以管理也就变得比较简单可以在集群中任意添加或者删除节点。

在这张架构图里我们还可以看到有一个kubectl它就是Kubernetes的客户端工具用来操作Kubernetes但它位于集群之外理论上不属于集群。

你可以使用命令 kubectl get node 来查看Kubernetes的节点状态

kubectl get node

可以看到当前的minikube集群里只有一个Master那Node怎么不见了

这是因为Master和Node的划分不是绝对的。当集群的规模较小工作负载较少的时候Master也可以承担Node的工作就像我们搭建的minikube环境它就只有一个节点这个节点既是Master又是Node。

节点内部的结构

Kubernetes的节点内部也具有复杂的结构是由很多的模块构成的这些模块又可以分成组件Component和插件Addon两类。

组件实现了Kubernetes的核心功能特性没有这些组件Kubernetes就无法启动而插件则是Kubernetes的一些附加功能属于“锦上添花”不安装也不会影响Kubernetes的正常运行。

接下来我先来讲讲Master和Node里的组件然后再捎带提一下插件理解了它们的工作流程你就会明白为什么Kubernetes有如此强大的自动化运维能力。

Master里的组件有哪些

Master里有4个组件分别是apiserver、etcd、scheduler、controller-manager。

apiserver是Master节点——同时也是整个Kubernetes系统的唯一入口它对外公开了一系列的RESTful API并且加上了验证、授权等功能所有其他组件都只能和它直接通信可以说是Kubernetes里的联络员。

etcd是一个高可用的分布式Key-Value数据库用来持久化存储系统里的各种资源对象和状态相当于Kubernetes里的配置管理员。注意它只与apiserver有直接联系也就是说任何其他组件想要读写etcd里的数据都必须经过apiserver。

scheduler负责容器的编排工作检查节点的资源状态把Pod调度到最适合的节点上运行相当于部署人员。因为节点状态和Pod信息都存储在etcd里所以scheduler必须通过apiserver才能获得。

controller-manager负责维护容器和节点等资源的状态实现故障检测、服务迁移、应用伸缩等功能相当于监控运维人员。同样地它也必须通过apiserver获得存储在etcd里的信息才能够实现对资源的各种操作。

这4个组件也都被容器化了运行在集群的Pod里我们可以用kubectl来查看它们的状态使用命令

kubectl get pod -n kube-system

注意命令行里要用 -n kube-system 参数表示检查“kube-system”名字空间里的Pod至于名字空间是什么我们后面会讲到。

Node里的组件有哪些

Master里的apiserver、scheduler等组件需要获取节点的各种信息才能够作出管理决策那这些信息该怎么来呢

这就需要Node里的3个组件了分别是kubelet、kube-proxy、container-runtime。

kubelet是Node的代理负责管理Node相关的绝大部分操作Node上只有它能够与apiserver通信实现状态报告、命令下发、启停容器等功能相当于是Node上的一个“小管家”。

kube-proxy的作用有点特别它是Node的网络代理只负责管理容器的网络通信简单来说就是为Pod转发TCP/UDP数据包相当于是专职的“小邮差”。

第三个组件container-runtime我们就比较熟悉了它是容器和镜像的实际使用者在kubelet的指挥下创建容器管理Pod的生命周期是真正干活的“苦力”。

我们一定要注意因为Kubernetes的定位是容器编排平台所以它没有限定container-runtime必须是Docker完全可以替换成任何符合标准的其他容器运行时例如containerd、CRI-O等等只不过在这里我们使用的是Docker。

这3个组件中只有kube-proxy被容器化了而kubelet因为必须要管理整个节点容器化会限制它的能力所以它必须在container-runtime之外运行。

使用 minikube ssh 命令登录到节点后,可以用 docker ps 看到kube-proxy

minikube ssh docker ps |grep kube-proxy

而kubelet用 docker ps 是找不到的,需要用操作系统的 ps 命令:

ps -ef|grep kubelet

现在我们再把Node里的组件和Master里的组件放在一起来看就能够明白Kubernetes的大致工作流程了

每个Node上的kubelet会定期向apiserver上报节点状态apiserver再存到etcd里。 每个Node上的kube-proxy实现了TCP/UDP反向代理让容器对外提供稳定的服务。 scheduler通过apiserver得到当前的节点状态调度Pod然后apiserver下发命令给某个Node的kubeletkubelet调用container-runtime启动容器。 controller-manager也通过apiserver得到实时的节点状态监控可能的异常情况再使用相应的手段去调节恢复。

其实这和我们在Kubernetes出现之前的操作流程也差不了多少但Kubernetes的高明之处就在于把这些都抽象化规范化了。

于是,这些组件就好像是无数个不知疲倦的运维工程师,把原先繁琐低效的人力工作搬进了高效的计算机里,就能够随时发现集群里的变化和异常,再互相协作,维护集群的健康状态。

插件Addons有哪些

只要服务器节点上运行了apiserver、scheduler、kubelet、kube-proxy、container-runtime等组件就可以说是一个功能齐全的Kubernetes集群了。

不过就像Linux一样操作系统提供的基础功能虽然“可用”但想达到“好用”的程度还是要再安装一些附加功能这在Kubernetes里就是插件Addon

由于Kubernetes本身的设计非常灵活所以就有大量的插件用来扩展、增强它对应用和集群的管理能力。

minikube也支持很多的插件使用命令 minikube addons list 就可以查看插件列表:

minikube addons list

插件中我个人认为比较重要的有两个DNS和Dashboard。

DNS你应该比较熟悉吧它在Kubernetes集群里实现了域名解析服务能够让我们以域名而不是IP地址的方式来互相通信是服务发现和负载均衡的基础。由于它对微服务、服务网格等架构至关重要所以基本上是Kubernetes的必备插件。

Dashboard就是仪表盘为Kubernetes提供了一个图形化的操作界面非常直观友好虽然大多数Kubernetes工作都是使用命令行kubectl但有的时候在Dashboard上查看信息也是挺方便的。

你只要在minikube环境里执行一条简单的命令就可以自动用浏览器打开Dashboard页面而且还支持中文

minikube dashboard

小结

好了今天我们一起来研究了Kubernetes的内部架构和工作机制可以看到它的功能非常完善实现了大部分常见的运维管理工作而且是全自动化的能够节约大量的人力成本。

由于Kubernetes的抽象程度比较高有很多陌生的新术语不太好理解所以我画了一张思维导图你可以对照着再加深理解。

最后小结一下今天的要点:

Kubernetes能够在集群级别管理应用和服务器可以认为是一种集群操作系统。它使用“控制面/数据面”的基本架构Master节点实现管理控制功能Worker节点运行具体业务。 Kubernetes由很多模块组成可分为核心的组件和选配的插件两类。 Master里有4个组件分别是apiserver、etcd、scheduler、controller-manager。 Node里有3个组件分别是kubelet、kube-proxy、container-runtime。 通常必备的插件有DNS和Dashboard。

课下作业

最后是课下作业时间,给你留两个思考题:

你觉得Kubernetes算得上是一种操作系统吗和真正的操作系统相比有什么差异 说说你理解的Kubernetes组件的作用你觉得哪几个最重要

欢迎积极留言或者提问,和其他同学一起参与讨论,我们下节课见。