[前端学DevOps]Kubernetes架构基础—云时代的变革

592 阅读11分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

[前端学DevOps]Kubernetes架构基础—云时代的变革

相比于虚拟化技术,容器技术更轻便、优雅,也更符合微服务时代应用的构建与部署需求。基于容器技术的Kubernetes并不是一个孤立的云平台,它有称为云计算规范的野心。与此同时,它已俨然成为云计算的事实标准。

Kubernetes简称K8s,因此下文介绍时,均用K8s来展开讨论。

K8s的优点

  • K8s可以被看作一个云计算控制平面的框架,而云计算三要素——计算、网络和存储,均以插件形式与Kubernetes集成。
  • 在容器技术基础之上,K8s还做了更精妙的模型抽象。以规范后的模型作为统一的API,K8s打破了集群管理者和应用开发者的边界。它用统一的语言将不同角色进行关联,通过特定的语义来实现平台层和应用层的协商。
  • K8s的扩展性非常强,基于自定义模型,形成了丰富的生态圈。

本文将主要介绍K8s架构基础:包含容器技术的优势、K8s对象设计的原则,K8s控制平面组件的协同工作原理和控制模板组件。

前言

容器技术经历了几代技术革新,其核心目标从未改变:如何将应用进程限制在独立的运行环境中,以满足封装和隔离的需求

Docker的出现,彻底改变了容器技术乃至云计算行业的格局,其引入了容器镜像的概念,将应用、应用的全部依赖、甚至操作系统打包存储和分发,彻底解决了软件交付的方式,简化了应用部署的复杂性。

依托于Docker技术,谷歌推出了K8s,着力于集群管理容器编排服务发现。K8s将基础架构层面的计算、网络、存储,以及运行在技术架构之上的应用和服务都进行了抽象,通过统一的模型来管控云计算中设计的所有要素,并理出一组独立的、可组合的控制流程从而减少了开发者的工作量。

云时代的变革

应用程序的部署经历了三个时代:物理机时代、虚拟化时代和容器化时代,相应的应用部署如图:

应用部署的时代变迁.png

物理机时代

早期的软件架构多是单体架构,一个系统的所有功能跑在单一进程中,需要由算力强大的机器作为支撑。其存在了诸多不足:

  • 程序运行依赖包需要预先在主机上安装,测试环境部署上生产环境会存在缺少依赖而引起故障和回滚。
  • 多个应用程序共生在同一主机时,不同应用程序共享相同的运行时环境,这使得应用程序可能互相影响。
  • 不同的应用程序以进程的形式共生在同一计算节点上,彼此没有隔离。
  • 在此架构和部署模式下,应用部署在哪个节点往往是固定的,使得自动化运维变得困难。
  • 资源管理以计算节点为单位,关键应用需要备用节点,因此需要额外采购设备,但备用节点闲置不用,资源利用率极低。

虚拟化时代

硬件的更迭速度已无法满足软件的发展趋势,于是虚拟化技术应运而生,其对计算资源的隔离有更高的要求。虚拟机(VM)的本质是在一个物理机上模拟出多个完整的操作系统,每个操作系统实例都管理自己独立的文件系统和设备驱动,分配了特定CPU、Memory、磁盘等计算资源。

有了虚拟化技术,一台物理节点可以拆分成多个粒度更小的逻辑节点。随之而来的是如何管理如此复杂的应用实例,云计算就是为解决海量应用在大规模服务器集群中的管理而产生的技术,可以说云计算是虚拟化的伴生技术。

云计算是将成千上万的计算节点组成一个集群,统一管控,对计算、存储和网络等计算系统资源进行抽象,使得云用户无须关心基础架构,只需定义自己需要的计算资源,云平台可以自动选择最合适的计算资源,并分配给用户以满足业务需求。

然而,虚拟化云平台管理的核心是虚拟机,是一个操作系统,在操作系统上部署应用的环节并未省略,因此云计算又一句其管理范围划分了新的层次,如图:

云计算分类.png

  • 基础架构即服务(Infrastructure as a Service,即IaaS)

基础架构即服务只负责到基础架构层面,它是对计算、网络和存储资源的抽象,并提供对这些基础资源的访问和监控访问。IaaS的用户在对云平台发出请求后,云平台只负责为用户提供基础资源,例如一个虚拟机,如何使用该虚拟机依然由用户自己负责,即IaaS用户在创建一个虚拟机后需要部署某个应用时,应用部署的自动化依然需要自己负责。

  • 平台即服务(Platform as a Service,即PaaS)

在IaaS的基础上,云平台会依据应用部署的目标环境分配存储,构建应用接入网络。应用接入网络解决应用如何访问的问题,通常包含负载均衡配置、域名服务配置等。

另外,针对每个实例,除了安装操作系统,还提供一些辅助应用部署和运行的软件,如给Tomcat、Node.js等提供中间件,应用启动配置脚本和应用分发代理。

PaaS解决问题的目标是面向应用的,一旦通过PaaS创建应用实例,则网络拓扑已经搭建完毕,中间件和文件分发系统已经构建在操作系统中,用户只需部署代码即可访问应用。

  • 软件即服务(Software as a Service,即SaaS)

该模式下,软件已经部署完毕,云用户是软件用户,无需管理软件本身。但是选择SaaS意味着放弃个性化要求,只使用软件供应商提供的标准服务。

容器化时代

虚拟化技术不能为应用解决环境依赖的问题,不能解决程序分发的问题,而且把应用部署变得更复杂了,因此容器技术应运而生。

容器技术依赖于现存的成熟技术,为应用打造了完全隔离的运行环境,基于预分配的资源保证服务质量,基于分层的文件系统和镜像仓库完成增量分发。

容器化相较于虚拟机技术的显著优势:

  • 容器的运行基于进程而非虚拟机,无须模拟操作系统。其特定是启动速度快、占用资源少,有利于计算资源全部向应用倾斜,降低硬件成本。

  • 容器基于Linux Namespace技术隔离进程,该技术可以使用户进程拥有独立的网络配置、文件系统、用户空间、进程空间等。

  • 容器基于Linux Control Group技术,对用户进程进行资源限定,可以为每个容器实例分配CPU、Memory、磁盘I/O等资源上限,能够隔离同一主机上多个用户进程彼此之间的干扰。

  • 与虚拟机类似,容器也有容器镜像,并且Docker还支持Dockerfile,允许用户像源代码一样管理容器镜像源文件,容器镜像是面向应用的而不是操作系统的。

  • 容器支持分层的文件结构,当构建容器镜像时,Docker会将Dockerfile中定义的每一行命令定义成一个文件层级,一个Docker镜像就是多个文件层的集合。容器运行时,会按照镜像层级由下到上按层加载,是镜像打包时的逆操作,由此实现一次打包、到处运行的目的。

  • 每个文件层都有基于其内容计算出来的Digest,在文件分发时,如果某个文件层未发生变化,则无需重新拉取,由此解决增量文件部署的问题。无论基础镜像有多大,只要基础镜像不更新,则更新镜像版本时,都只拉取变更部分,不会过多消耗带宽。

  • 容器镜像可以上传至镜像仓库,在任何其它计算节点上,都可以从镜像仓库拉取和运行镜像,镜像可以通过不同的Tag进行版本管理。

而K8s在容器化时代下扮演什么角色呢?

  1. 集群管理

K8s是以计算节点为核心的,成规模的计算节点组成一个彼此网络互通的集群,K8s能监控和管理这些节点的健康状况及可用资源。

  1. 作业调度和作业管理
  • 支持多种存储方式:允许容器挂载多样的存储类型,如本地存储、公有云提供的网络存储等。
  • 自动可控的升级和回退:当新的容器镜像发布时,能够以某种策略用新的容器镜像创建新的容器,同时删除已存在的旧的容器,最终让容器达到预期的状态。
  • 高利用率的调度机制:根据容器申请的CPU和Memory,在集群中找到一个最合适的节点来运行容器,避免单个节点负载过高或过低,从而充分利用集群节点的资源。
  • 有效的自愈机制:如果容器退出或者服务不健康,那么能够删除并且重建容器,并把它从服务端点中移除,直到新的容器做好服务的准备。
  • 密码和配置管理:提供存储和管理敏感信息,如密码,也能提供存储和管理应用的配置信息。随时可以更新这些信息而不用重新编译容器镜像。
  1. 服务发现和服务治理

容器能够利用DNS和集群IP地址向集群内外提供服务。在分发流量的时候能够达到负载均衡,避免出现某个容器的流量过高的情况。

以上的功能其实在很多云计算平台都能解决,那么K8s的核心竞争力究竟在哪呢?

  1. 声明式系统

声明式系统与命令式系统相对应。

image-20210812164759415.png

声明式系统追求的是最终一致性,由系统保证一直尝试,并使实际状态一致,因此整个系统都基于异步调用。K8s的最核心优势是,将其解决问题领域中的所有对象做了非常好的抽象,比如将计算节点抽象成Node,将运行应用的实体抽象成Pod,将可供访问的应用服务抽象成Service等。

而这些对象的抽象是面向不同用户场景的,比如由面向平台层的Node,有面向应用层的Deployment,有面向安全的NetworkPolicy,有面向流量管理的Service等。K8s除去了传统云计算中不同类型的云平台的边界,从云平台基础架构到服务接入,再到应用运维,都被整合到这个大一统的平台上来了。

  1. 控制器模式

控制器模式是K8s系统运作的关键,K8s中每种抽象出来的对象,都有其对应的控制器组件。每个控制器监听其所关注的对象的变更,然后按照对象中最新的期望状态进行系统配置,配置完成后,更新该对象的实际状态。这些控制器通力合作,负责让整个集群上运行的应用与用户的期望一致。

image-20210812211355986.png

  1. 插件化框架

K8s提供了插件化框架,比如Pod的启动需要创建容器实例、挂载存储、配置网络,而不同用户的不同场景的底层存储,其网络环境可能也不同。因此K8s提供了容器运行接口、容器存储接口、容器网络接口,使得不同企业可按需定制方案等。

image-20210812211701876.png

  1. 标准化推动

除了定义云计算管理的核心对象,K8s还提供了基于自定义资源的对象扩展能力。大厂背书和活跃的社区推动,使得各类技术方案再未来极可能成为整个业界的标准。


接下来将会持续更新K8s系列文章。

如果对您有帮助,请麻烦点赞哟!您的鼓励是我最大的支持。