云原生的概念和演进都是围绕云计算的核心价值展开的,比如弹性、自动化、韧性,所以云原生所涵盖的技术领域非常丰富。
随着云计算技术的不断发展,云原生架构已经成为了新一代软件开发的重要趋势。本文将为您介绍云原生架构的相关技术,帮助您更好地理解和应用这些技术,提升您的后端开发、系统架构和解决方案架构的能力。
Docker 容器基于操作系统虚拟化技术,具有共享操作系统内核、轻量、无资源损耗、秒级启动等优势,极大地提升了系统的应用部署密度和弹性。同时,Docker 提出了创新的应用打包规范(Docker 镜像),实现了应用与运行环境的解耦,使应用可以在不同计算环境间一致、可靠地运行。
容器技术呈现出了一个优雅的抽象场景,即开发所需要的灵活性和开放性、运维所关注的标准化和自动化达成行对平衡,容器镜像已经成为应用分发的工业标准。
随后,Kubernetes 开源,凭借优秀的开放性、可扩展性以及活跃的开发者社区,在容器编排中脱颖而出,成为分布式资源调度和自动化运维的事实标准。Kubernetes 屏蔽了底层架构的差异,以优良的可移植性,帮助应用在包括数据中心、云端、边缘计算等不同环境中运行时保证一致性。
部署方式的演变:
1、容器技术的核心价值
- 敏捷:容器技术在提升企业架构敏捷性的同时,使业务迭代变得更加快速,为创新探索提供了坚实的技术保障
- 弹性:互联网时代企业系统经常需要面对促销活动、突发事件等各种预期之外的爆发性流量增长。通过容器技术,可以充分发挥云计算的弹性优势,降低运维成本
- 可移植性:容器已经成为应用分发和交付的标准技术,可实现应用与底层运行环境的解耦,K8S 可以屏蔽 IaaS 层架构的差异性,帮助应用平滑地运行在不同的基础设施上,CNCF 推出了 K8S 一致性认证,进一步保障不同 K8S 实现的兼容性,使企业更愿意采用容器技术来构建云时代应用的基础设施
2、典型的容器技术
典型的容器技术有很多,我会主要介绍容器编排、安全容器、边缘容器三种。
容器编排
所谓容器编排是指管理和自动化容器化应用程序的部署、扩展和管理的过程。 K8S 成为了资源调度和容器编排的事实标准,已经广泛应用于自动部署、扩展和管理容器化应用中,它提供了一种高效的方式来管理容器的生命周期,包括部署、扩展和自我修复。K8S 可以自动化地处理容器的放置、调整、负载均衡和服务发现等功能。
分布式应用管理的核心能力
- 资源调度:根据应用请求的资源量,比如 CPU、内存或 GPU 等设备资源,在集群中选择合适的节点来运行应用
- 应用部署和管理:支持应用的自动发布和回滚,以及与应用相关的配置管理,可以自动化编排,让存储与容器应用的生命周期相关联
- 自动修复:K8S 可以监测集群中所有的宿主机,当出现故障时,节点健康检查会自动迁移应用,还支持应用的自愈,从而极大地简化运维管理的复杂度
- 服务发现和负载均衡:通过 Service 资源发现各种应用服务,结合 DNS 和多种负载均衡机制,支持容器化应用之间的相互通信
- 弹性伸缩:K8S 可用于监测业务上所承担的负载,如果过高或者响应时间过长,就会自动扩容该业务
K8S 控制平面的组件和架构
K8S 的控制平面包含了四个主要的组件:API Server(API 服务器)、Cotroller Manager(控制器管理服务器)、Schedule(调度器)、Etcd,请看示意图:
K8S 在容器编排中的关键设计理念
- 声明式 API:开发人员只需要关注应用本身,不需要关注非系统执行的细节,比如 Deployment(无状态应用)、StatefulSet(有状态应用)、Job(任务类应用)等,它们都提供了对不同类型工作负载的抽象。对于 K8S 实现而言,相比于边缘触发方式,基于声明式 API 的条件触发的实现方式可以提供更加健壮和稳定的分布式系统实现
- 可扩展性架构:所有 K8S 组件都基于一致的、开放的 API 实现交互,第三方开发者也可以通过 CRD(Custom Resource Definition,自定义资源类型)或者 Operator 等方法提供领域相关的扩展实现。容器的可扩展能力极大提升了 K8S 的能力
- 可移植性:K8S 可以通过一系列的抽象,比如 Loadbalance Service(负载均衡服务)、CNI(Container Network Interface,容器网络接口)、CSI(Container Storage Interface,容器存储接口),帮助业务应用屏蔽底层基础设施的实现差异,实现容器的灵活迁移
安全容器
随着越来越多的企业选择云原生技术进行应用交付和资源调度,使得对容器安全的要求也越来越高。安全容器是一种提供更高级别安全隔离的容器技术,安全容器通过提供更严格的访问控制和隔离机制,帮助防止潜在的安全威胁。比如 Docker 的 RunC 容器共享宿主机内核,仅仅是通过 Namespaces 和 Cgroups 实现隔离,在实际生产环境中,尤其是在多租户的场景下,安全性受到了极大的挑战。
现阶段结合隔离技术实现的安全容器方案,主要包括三大类:
用户态内核
这种方案下的典型代表是 Google 的 gVisor,是一种进程虚拟化增强的容器,通过实现独立的用户态内核,捕获和代理应用的所有系统调用,隔离非安全的系统调用,从而间接达到安全的目的。
因为系统调用的代理和过滤机制,导致 gVisor 的应用兼容性和系统调用方面的性能相较于普通 RunC 容器要差一些,且不支持 virt-io 等虚拟框架,因此扩展性较差,不支持设备热插拔。
LibOS
基于 LibOS 技术的安全容器运行时,以 UniKernel、Nabla-Container 为代表,本质上是针对应用内核的一个深度裁剪和定制,因此需要与应用编译打包在一起,兼容性比较差,应用与 LibOS 的捆绑编译和部署会增加 DevOps 实现的难度。
MicroVM
当前虚拟化技术已经非常成熟,轻量虚拟化技术是对传统虚拟化技术的裁剪,有非常优秀的扩展能力,比较有代表性的是 Kata-Containers 和 Firecracker。VM GuestOS 可以对内核等组件进行自由定制,它具备完整的 OS 和内核,因此 VM GuestOS 的兼容性非常好,安全漏洞的防扩散能力也能突出,但相对 RunC 容器,运行时产生的系统开销会稍大,启动速度也相对慢一点。
边缘容器
随着互联网智能终端设备数量的不断增加,以及 5G 和万物互联时代的到来,传统云计算中心集中存储计算的模式已经无法满足终端设备对于时效、容量和算力等的需求,主要体现:
- 向边缘下沉,并通过中心进行统一交付、运维和管控已经成为云计算的重要发展趋势
- 以 K8S 为代表的云原生技术是云计算领域发展最快的技术方向之一,基于 K8S 构建的边缘容器,通用“云管边”架构,极大提升了云计算向边缘拓展的效率,并降低了边缘计算的成本。
鉴于边缘设备以及业务场景的特殊性,边缘应用对容器技术提出了新的需求:
- 资源协同:边缘计算需要提供云-边-端的资源协同管理,在云端统一管理边和端的节点和设备
- 应用协同:边云协同的方式,可以将这些编排部署能力延伸到边侧,以满足边缘侧日益复杂的业务和高可用性的要求
- 智能协同:边缘侧与中心云的智能协同是目前边缘计算项目中一个非常重要的协同场景
- 数据协同:服务之间的协同要求更高的数据协同
- 轻量化:边缘设备资源受限,部署在边缘侧的容器平台不可能是完整的 K8S 平台,必须精简
各云平台和开源社区均有对应的云产品项目上架,以阿里云 OpenYurt 为例:
OpenYurt 主打云边一体化的理念,基于原生 K8S 强大的容器编排和调度能力,通过众多边缘计算应用场景的锤炼,实现了一整套对原生 K8S 零侵入的边缘云原生方案,可以提供边缘自治、高效运维通道、边缘单元化管理、边缘流量拓扑管理、安全容器、边缘 Serverless 和 FaaS、异构资源支持等能力。能够帮助用户解决在海量边、端资源上完成大规模应用交付、运维和管控的问题,并提供中心服务下沉通道,实现与边缘计算应用的无缝对接。
OpenYurt 沿用了目前业界非常流行的中心管控、边缘自治的边缘应用管理架构,将云边端一体化协同作为目标,让云原生能力向边缘端拓展。在技术实现上,贯彻了“Extending Your Native Kubernetes to Edge”的核心设计理念,技术方案特点如下:
- 对原生 K8S 零侵入:对原生 K8S API 的完全兼容,不改动 K8S 核心组件
- 无缝转换:提供了可用于将原生 K8S 一键式转换成支持边缘计算能力的 K8S 集群的工具
- 系统开销低:参考了大量边缘计算场景的实际需求,在保证功能和可靠性的基础上,本着最小化、最简化的设计理念,严格限制新增组件的资源诉求
3、容器技术总结
综上所述,我们到现在对容器技术是什么、有什么应该是有概念了,这部分我们再整体总结以下。
容器是一种封装应用程序代码以及依赖项的技术,它可以确保应用程序在任何环境下都能以相同的方式运行,容器化的应用程序与底层技术设施可以隔离开,使得它们可以在不依赖于特定硬件或操作系统配置的情况下运行。
容器技术的核心组件
容器技术的实现依赖于以下三个核心组件:
- 容器引擎:比如我们现在常规使用的 Docker,容器引擎是用于创建、运行和管理容器的底层软件。
- 容器镜像:包含应用程序以及所有依赖项的模版,用于创建容器事例。
- 容器编排:管理一组容器的生命周期,包括部署、扩展和自我修复,比如现在常规使用的 Kubernetes、Docker Swarm。
容器技术的优势
容器技术对应企业应用级研发来说,优势主要集中在以下:
- 环境一致性:容器内的应用程序运行环节与生产环境保持一致,减少很多程序员:在我机器上没问题啊
- 资源隔离:每一个容器实例都是在自己的隔离空间中运行,同时提高了安全可靠性
- 快速部署和扩展:容器的启动非常快,很多几秒内就能完成,而且基于容器技术可以根据负载情况进行快速的伸缩
- 持续集成和持续部署(CI/CD):容器化技术把应用程序作为容器镜像进行版本控制和自动化部署,让 CI/CD 流程更加高效
容器技术的挑战
任何一个技术组件或者领域,它既然存在我们选择它的优势,同时也是存在一些不足和挑战的,容器技术的挑战主要来自:
- 安全性:容器需要适当合理的安全措施来防止潜在的安全威胁
- 存储和网络配置:容器的持久化存储和网络配置需要仔细规划和管理
- 状态管理:有状态应用程序在容器技术中的管理比无状态应用程序复杂的多
容器技术的发展趋势
随着技术的发展,以及容器技术本身存在的挑战,容器技术也是在持续往前发展的,我认为会有以下三个方向:
- 服务网格:通用服务网格技术提供流量管理、监控和安全功能,增强架构的能力
- 安全容器:容器技术提供更强的安全隔离,来保障容器的安全性
- 容器即服务(CaaS):云提供商提供容器化服务,简化企业内部对容器的管理和运维
容器技术是云原生架构的重要组成部分,它通过提供一种轻量级、可移植的额应用程序封装方式,极大地改变了软件开发和运维的方式,随着技术的不断发展和成熟,可以预见容器技术在为了的云原生领域还是会扮演着更加关键重要的角色。