文章编号:11343时间:2024-09-30人气:
无服务器计算正成为现代应用程序开发的热门选择,它提供了按需扩展、降低运营成本和消除服务器管理开销的众多优势。Kubernetes,作为一种容器编排工具,在无服务器环境中也发挥着至关重要的作用,它使开发人员能够在 Kubernetes 集群上无缝运行无服务器工作负载,从而充分利用这两种技术的强大功能。
在 Kubernetes 集群上实现无服务器化有两种主要策略:
Serverless Operators 是一种 Kubernetes 控制器,它允许开发人员将无服务器函数作为 Kubernetes 资源定义。这些控制器负责将函数部署到 Kubernetes 集群,管理它们的扩展和生命周期。一些流行的 Serverless Operators 包括 OpenFaaS、Knative 和 Fission。
CRI 是 Kubernetes 用于与容器运行时交互的接口。无服务器运行时,如 OpenWhisk 和 Kubeless,可以使用 CRI 将无服务器函数作为容器部署到 Kubernetes 集群。这些运行时负责管理函数的生命周期,包括启动、停止和扩展。
Kubernetes 集群无服务器化提供了将无服务器计算优势与 Kubernetes 编排功能相结合的独特优势。通过利用自动扩展、降低运营成本和简化应用程序开发等特性,开发人员能够在 Kubernetes 集群上无缝地运行无服务器工作负载,从而充分利用这两种技术的强大功能。随着无服务器计算的持续发展,Kubernetes 集群无服务器化有望成为现代应用程序开发中越来越重要的趋势。
Knative是什么?
要了解这个问题,你必须先了解什么是Kubernetes?以及Kubernetes最大的问题是什么?
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
那么问题来了!Kubernetes有一个最大的槽点就是入门门槛略高,而Knative正是为了解决这个问题来的。
Knative 的⽬标是在基于 Kubernetes 之上为整个开发⽣命周期提供帮助。 它的具体实现⽅式是:⾸先使你作为开发⼈员能够以你想要的语⾔和以你想要的⽅式来编写代码,其次帮助你构建和打包应⽤程序,最后帮助你运⾏和伸缩应⽤程序。
为此,Knative 将重点放在三个关键组件上: Build(构建) 你的应⽤程序,为其提供流量 Serving(服务) ,以及确保应⽤程序能够轻松地⽣产和消费 Event(事件) 。
Build(构建)
通过灵活的插件化的构建系统将⽤户源代码构建成容器。 ⽬前已经⽀持多个构建系统,⽐如 Google 的 Kaniko,它⽆需运⾏ Docker daemon 就可以在 Kubernetes 集群上构建容器镜像。
Serving(服务)
基于负载⾃动伸缩,包括在没有负载时缩减到零。 允许你为多个修订版本(revision)应⽤创建流量策略,从⽽能够通过 URL 轻松路由到⽬标应⽤程序。
Event(事件)
使得⽣产和消费事件变得容易。 抽象出事件源,并允许操作⼈员使⽤⾃⼰选择的消息传递层。
Knative 是以 Kubernetes 的⼀组⾃定义资源类型(CRD)的⽅式来安装的,因此只需使⽤⼏个 YAML ⽂件就可以轻松地开始使⽤ Knative。
可以看出,knative 是为了解决容器为核心的 serverless 应用的构建、部署和运行的问题。
Knative 提供了一组标准中间件,专注于在云原生平台上构建和运行应用的通用任务,比如源码到容器的构建、将服务绑定到事件生态系统(通过事件触发工作负载的执行)、管理部署期间的路由和流量以及工作负载的自动扩展。 该框架为用户提供了“部署任何负载都需要的熟悉的、惯用的语言支持以及标准化的模式,这些负载包括传统的应用,也包括函数或容器应用”。
相对于传统的 Serverless 解决方案,Knative 的优良性得到开发者和企业认可,这也是其短时间内得到业内各大厂商追捧的主要原因。
Knative 的优势
便利性: Knative 以 Kubernetes 和 istio 作为其底层框架,因此无论是线上还是线下,任何 Kubernetes 集群,无论是云上 Kubernetes 服务还是自建 Kubernetes 集群,都能通过安装 istio 和 knative 插件快速的搭建 serverless 平台。
标准化: Knative 联合 CNCF,把所有事件标准化,统一为 CloudEvent,提供事件的跨平台,同时让函数和具体的调用方能够解耦。
服务间解耦: 使用 Knative 使得应用不在与底层依赖服务强绑定,可以跨云实现业务互通
成熟的生态: Knative 基于 Kubernetes 体系构建,与 kubernetes 生态结合更紧密;
自动伸缩: 监控应用的请求,并自动扩缩容, 得益于 Istio 能力加持,天生支持蓝绿发布、回滚功能,方便应用发布流程。
应用监控: 支持日志的收集、查找和分析,并支持 VAmetrics 数据展示、调用关系 tracing。
不难看出,Knative虽然很年轻,但其成长速度非常快。 其作为当今云原生态领域发展最快的开源项目之一,不仅通过提供简化工作流程的工具来解决这些问题,而且还为Kubernetes集群带来了非服务器工作负载的强大功能。 目前已有不少项目加入到了年轻的Knative生态系统,且趋势是不断增加的。
目前Knative 还在不断的更新优化中,每一次更新优化都离客户的最终诉求更近了一步,Knative 的未来必定是一片坦途,相信将来通福云以及整个行业将会看到很多选项和机会将Knative 运用起来。
MinIO是一种高性能对象存储解决方案,原生支持Kubernetes部署。 MinIO提供与AmazonWebServicesS3兼容的API并支持所有核心S3功能。 MinIO是在GNUAffero通用公共许可证v3.0下发布的。
也许提起对象存储技术,我们都经历过Fastdfs长时间的拉锯战,即使现在大部分都在使用云服务厂商提供的OSS对象存储服务,但是其所花费的经济成本也是递增的,而且数据都存储在别人的服务器上,从一定程度上来说,对于文件资源的把控粒度是极其不可控制,公网数据是何其的没有隐私可言。 虽然,对于开发层面上来说,只需要整合对应的SDK,对其使用已经是开箱即用。 但是,对于选择自研对象存储技术来说,Minio何尝不失为一大利器。 其搭建过程与整合方面,几乎已经没有什么瓶颈可言。 不论是从传统服务器的安装,还是基于Docker以及Kubernetes的部署,简直简单得不要不要的。
基本概述,MinIO’ssoftware-definedsuiterunsseamlesslyinthepubliccloud,,MinIOcandeliverarangeofusecasesfromAI/ML,analytics,backup/restoreandmodernwebandmobileapps.
MinIO在最大数量的环境中支持最广泛的用例。 自云原生以来,MinIO的软件定义套件在公共云、私有云和边缘无缝运行——使其成为混合云的领导者。 凭借行业领先的性能和可扩展性,MinIO可以提供一系列用例,包括AI/ML、分析、备份/恢复以及现代Web和移动应用程序。
HybridCloud:混合云
Borncloudnative:云原生
MinIOispioneeringhighperformanceobjectstorage:高性能对象存储的先驱
Builtontheprinciplesofwebscale:建立在网络规模的原则上
The#.开源对象存储,并且最适合企业
ThedefactostandardforAmazonS3compatibility:AmazonS3兼容性的事实标准
Simplypowerful:简单强大[极简主义]
基本特点MinIO的企业级特性代表了对象存储空间的标准。 从AWSS3API到S3Select以及我们对内联擦除编码和安全性的实施,我们的代码广受赞誉,并经常被一些技术和商业领域的大腕复制。
ErasureCoding:纠错码
MinIO使用以汇编代码编写的每个对象内联擦除编码来保护数据,以提供尽可能高的性能。 MinIO使用Reed-Solomon代码将对象条带化为具有用户可配置冗余级别的数据和奇偶校验块。 MinIO的ErasureCoding在对象级别执行修复,可以独立修复多个对象。
在N/2的最大奇偶校验下,MinIO的实现可以确保在部署中仅使用((N/2)+1)个操作驱动器进行不间断的读写操作。 例如,在12个驱动器的设置中,MinIO将对象分片到6个数据和6个奇偶校验驱动器,并且可以可靠地写入新对象或重建现有对象,而部署中仅剩下7个驱动器。
Bitrotprotection:Bitrot保护
静默数据损坏或bitrot是磁盘驱动器面临的严重问题,导致数据在用户不知情的情况下损坏。 原因是多方面的(驱动器老化、电流峰值、磁盘固件中的错误、幻像写入、读取/写入方向错误、驱动程序错误、意外覆盖),但结果是一样的-数据受损。
MinIO对HighwayHash算法的优化实现确保它永远不会读取损坏的数据-它即时捕获和修复损坏的对象。 通过在READ上计算散列并在从应用程序、网络到内存/驱动器的WRITE上对其进行验证来确保端到端的完整性。 该实现专为速度而设计,可以在IntelCPU的单核上实现超过10GB/秒的散列速度。
Encryption:加密处理
在飞行中加密数据是一回事;保护静态数据是另一回事。 MinIO支持多种复杂的服务器端加密方案来保护数据——无论数据在哪里。 MinIO的方法以可忽略的性能开销确保机密性、完整性和真实性。 使用AES-256-GCM、ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。
加密对象使用AEAD服务器端加密进行防篡改。 此外,MinIO与所有常用的密钥管理解决方案(例如HashiCorpVault)兼容并经过测试。 MinIO使用密钥管理系统(KMS)来支持SSE-S3。
如果客户端请求SSE-S3或启用自动加密,则MinIO服务器使用唯一的对象密钥加密每个对象,该对象密钥受KMS管理的主密钥保护。 鉴于极低的开销,可以为每个应用程序和实例打开自动加密。
IdentityManagement:身份管理
MinIO支持身份管理中最先进的标准,与OpenID连接兼容提供商以及关键的外部IDP供应商集成。 这意味着访问是集中的,密码是临时的和轮换的,而不是存储在配置文件和数据库中。 此外,访问策略是细粒度和高度可配置的,这意味着支持多租户和多实例部署变得简单。
ContinuousReplication:连续复制
传统复制方法的挑战在于,它们无法有效扩展超过数百TB。 话虽如此,每个人都需要一个复制策略来支持灾难恢复,并且该策略需要跨越地域、数据中心和云。
MinIO的持续复制专为大规模、跨数据中心部署而设计。 通过利用Lambda计算通知和对象元数据,它可以高效快速地计算增量。 Lambda通知确保更改立即传播,而不是传统的批处理模式。
连续复制意味着如果发生故障,即使面对高度动态的数据集,数据丢失也将保持在最低限度。 最后,与MinIO所做的一样,持续复制是多供应商的,这意味着您的备份位置可以是从NAS到公共云的任何位置。
GlobalFederation:全球联合会
现代企业到处都有数据。 MinIO允许将这些不同的实例组合起来形成一个统一的全局命名空间。 具体来说,可以将任意数量的MinIO服务器组合成一个分布式模式集,多个分布式模式集可以组合成一个MinIO服务器联合。 每个MinIOServerFederation都提供统一的管理和命名空间。
MinIO联合服务器支持无限数量的分布式模式集。 这种方法的影响是对象存储可以为大型、地理分布的企业大规模扩展,同时保留从单个控制台容纳各种应用程序(Splunk、Teradata、Spark、Hive、Presto、TensorFlow、H20)的能力。
Multi-CloudGateway:多云网关
所有企业都在采用多云战略。 这也包括私有云。 因此,您的裸机虚拟化容器和公共云服务(包括Google、Microsoft和阿里巴巴等非S3提供商)必须看起来相同。 虽然现代应用程序具有高度可移植性,但支持这些应用程序的数据却不是。
让这些数据无论位于何处都可用,是MinIO解决的主要挑战。 MinIO在裸机、网络附加存储和每个公共云上运行。 更重要的是,MinIO通过AmazonS3API确保您从应用程序和管理的角度来看这些数据的视图看起来完全相同。
MinIO可以走得更远,使您现有的存储基础设施与AmazonS3兼容。 影响是深远的。 现在,组织可以真正统一他们的数据基础设施——从文件到块,所有这些都显示为可通过AmazonS3API访问的对象,而无需迁移。
WORM:WORM对象锁定
启用WORM后,MinIO会禁用所有可能改变对象数据和元数据的API。 这意味着一旦写入的数据就可以防篡改。 这对于许多不同的监管要求具有实际应用。
基本架构MinIO被设计为云原生,可以作为由外部编排服务(如Kubernetes)管理的轻量级容器运行。 整个服务器是一个约40MB的静态二进制文件,并且在使用CPU和内存资源方面非常高效-即使在高负载下也是如此。 结果是您可以在共享硬件上共同托管大量租户。
MinIO在带有本地连接驱动器(JBOD/JBOF)的商用服务器上运行。 集群中的所有服务器的能力相同(完全对称架构)。 没有名称节点或元数据服务器。
MinIO将数据和元数据作为对象一起写入,无需元数据数据库。 此外,MinIO将所有功能(擦除代码、bitrot检查、加密)作为内联、严格一致的操作执行。 结果是MinIO非常有弹性。
每个MinIO集群是一组分布式MinIO服务器,每个节点一个进程。 MinIO作为单个进程在用户空间运行,并使用轻量级协程来实现高并发。 驱动器被分组到擦除集(默认情况下每组16个驱动器),并且使用确定性散列算法将对象放置在这些集上。
MinIO专为大规模、多数据中心的云存储服务而设计。 每个租户运行自己的MinIO集群,与其他租户完全隔离,使他们能够保护他们免受升级、更新和安全事件的任何中断。 每个租户通过跨地域联合集群来独立扩展。
MinIO服务器功能MinIO的企业级特性代表了对象存储空间的标准。 从AWSS3API到S3Select以及我们对内联擦除编码和安全性的实施,我们的代码广受赞誉,并经常被一些技术和商业领域的大腕复制。
默认情况下,对唯一对象名称的每次新写入操作都会导致覆盖该对象。 您可以将MinIO配置为创建每个对象突变的版本,从而保留该对象的完整历史记录。 MinIO还支持一次写入多次读取(WORM)锁定版本化对象,以确保在指定的持续时间内或直到显式解除锁定为止的完全不变性。
版本控制和对象锁定功能仅适用于分布式MinIO部署:
BucketVersioning:存储桶版本控制
MinIO支持在单个存储桶中保存对象的多个“版本”。 通常会覆盖现有对象的写入操作会导致创建新的版本化对象。 MinIO版本控制可防止意外覆盖和删除,同时支持“撤消”写入操作。 存储桶版本控制是配置对象锁定和保留规则的先决条件。
对于版本化存储桶,任何改变对象的写入操作都会导致该对象的新版本具有唯一的版本ID。 MinIO标记客户端默认检索的对象的“最新”版本。 然后,客户端可以明确选择列出、检索或删除特定对象版本。
其中:
具有单一版本的对象:MinIO为每个对象添加一个唯一的版本ID作为写入操作的一部分。
2.具有多个版本的对象:MinIO保留对象的所有版本,并将最新版本标记为“最新”。
3.检索最新的对象版本
4.检索特定对象版本
WORM:对象锁定
MinIO对象锁定(“对象保留”)强制执行一次写入多次读取(WORM)不变性以保护版本化对象不被删除。 MinIO支持基于持续时间的对象保留和无限期合法保留保留。
MinIO对象锁定提供关键数据保留合规性,并符合CohassetAssociates的SEC17a-4(f)、FINRA4511(C)和CFTC1.31(c)-(d)要求。
其中:
不带锁的桶:MinIO版本控制保留了对象突变的完整历史。 但是,应用程序可以明确删除特定的对象版本。
带锁的桶:对存储桶中的对象应用默认的30天WORM锁定可确保所有对象版本的最短保留期和保护期。
3.锁定桶中的删除操作:删除操作遵循版本化存储桶中的正常行为,其中MinIODeleteMarker为对象创建一个。 但是,对象的非删除标记版本仍受保留规则约束,并且不会受到任何特定删除或覆盖尝试的影响。
4.锁定存储桶中的版本化删除操作:MinIO会阻止任何删除在WORM锁定下持有的特定对象版本的尝试。 客户端可以删除版本的最早可能时间是锁定到期时。
MinIO是一个软件定义的高性能分布式对象存储服务器。 您可以在消费级或企业级硬件以及各种操作系统和架构上运行MinIO。
MinIO支持两种部署模式:独立和分布式:
独立部署:具有单个存储卷或文件夹的单个MinIO服务器。 独立部署最适合使用MinIO进行对象存储的应用程序的评估和初始开发,或为单个存储卷提供S3访问层。 独立部署不提供对全套MinIO高级S3特性和功能的访问。
分布式部署:一台或多台MinIO服务器,所有服务器上至少有四个总存储卷。 分布式部署最适合生产环境和工作负载,并支持MinIO的所有核心和高级S3特性和功能。 对于生产环境,MinIO建议使用4个节点和4个驱动器的基线拓扑。
Kubernetes,简称K8s,起源于Google,是一个开源的容器编排平台。 它由Google在2014年开源,并由Cloud Native Computing Foundation(CNCF)维护。 在云计算和微服务架构日益普及的今天,Kubernetes已成为业界标准的容器管理平台。 “K8s”是“Kubernetes”的缩写,形成方式是保留单词的第一个和最后一个字母(K和s),然后用中间剩余字母的数量(8个)来代替中间的字母。 这种缩写方式在技术界较为常见,用于简化较长或难以记忆的名称。 Kubernetes是用于自动部署、扩展和管理容器化应用程序的系统。 与Docker Swarm和Mesos等其他容器编排工具相比,Kubernetes提供了更为强大和灵活的工具来管理复杂的应用架构。 它可以视为一个操作系统,专为运行在多个服务器上的容器设计。 Kubernetes能自动调度和平衡容器在各个服务器上的运行,无需担心单个服务器的故障或负载。 以在线购物网站后端服务的容器化和扩展为例。 最初,这些服务都部署在单独的虚拟机上,需要手动进行扩展和更新。 使用Kubernetes后,可以自动化和优化这些过程,确保高可用性和资源的最优利用。 使用Kubernetes部署一个Python Flask应用的示例:创建Dockerfile以容器化应用,然后创建Kubernetes的YAML配置文件,最后使用kubectl命令行工具部署应用。 通过修改replicas字段并重新应用YAML配置,可以轻松扩展应用。 Orchestration(编排)在计算机科学和信息技术中指的是自动配置、协调和管理计算机系统和软件。 在微服务和容器化的环境中,编排通常用于自动化多个服务或容器的部署、扩展和管理。 Cloud Native Computing Foundation(CNCF)是一个非盈利组织,旨在推动云原生计算的发展和普及。 它由linux Foundation于2015年成立,为开发者提供了一系列工具和最佳实践。 Docker Swarm是Docker的原生编排解决方案,用于管理Docker容器。 与Kubernetes相比,Docker Swarm更简单易用,但功能上可能没有Kubernetes那么全面。 Apache Mesos是一个开源的集群管理器,提供了有效地隔离和共享跨分布式应用或框架的资源。 Mesos最初是为大数据处理和实时分析设计的,但现在也被用于各种其他用途,包括容器编排。 容器编排工具用于自动化管理容器的生命周期,包括部署、扩展、更新和监控等。 主要的容器编排工具包括Kubernetes、Docker Swarm和Apache Mesos。 YAML(YAML Aint Markup Language)是一种数据序列化格式,常用于配置文件和数据交换。 AWS ECS是Amazon Web Services(AWS)提供的容器管理服务,用于运行和管理Docker容器。 与Kubernetes不同,ECS是与AWS环境紧密集成的,提供了与其他AWS服务(如EC2、EBS、ELB等)无缝对接的能力。 自动扩展是一种能力,允许应用根据实际需求动态地增加或减少资源。 零停机时间更新是一种软件部署方法,目的是在更新应用时避免影响用户。 在容器编排环境中,这通常通过逐步替换旧版本的容器实例来实现。 故障恢复是一种机制,用于在系统或应用组件出现故障时自动恢复正常运行状态。 Dockerfile是一个文本文件,包含了一系列用于构建Docker镜像的指令。 FROM python:3.8-slim是Dockerfile指令,表示基础镜像是python:3.8-slim。 COPY /是Dockerfile指令,用于将宿主机上的文件复制到Docker镜像的根目录(/)下。 apiVersion: apps/v1是Kubernetes YAML配置文件中的一个字段,指定了API版本。 kind: Deployment是Kubernetes YAML配置文件中的一个字段,用于指定资源类型。 metadata是Kubernetes YAML配置文件中的一个字段,用于存储资源的元数据。 name: flask-app是Kubernetes YAML配置文件中metadata字段下的一个子字段,用于给资源(在这个例子中是一个Deployment)命名。 spec是Kubernetes YAML配置文件中的一个字段,用于描述资源(如Pod、Deployment、Service等)的“规格”或期望状态。 replicas: 3是Kubernetes Deployment中spec字段下的一个子字段,用于指定应用应该有多少个副本(或实例)。 selector是Kubernetes Deployment中spec字段下的一个子字段,用于定义如何找到这个Deployment应管理的Pod。 matchLabels是Kubernetes Deployment中selector字段下的一个子字段,用于指定标签选择器的匹配规则。 app: flask-app是Kubernetes YAML配置文件中用于标签(labels)的一个键值对。 template是Kubernetes Deployment中spec字段下的一个子字段,用于描述应该如何创建Pod。 labels是Kubernetes YAML配置文件中的一个字段,用于给资源(如Pod、Service、Deployment等)添加键值对形式的标签。 app: flask-app是与第一个app: flask-app相同的键值对,用于标记Pod模板。 containers是Kubernetes Pod模板中spec字段下的一个子字段,用于定义Pod内运行的容器列表。 image: your-docker-repo/flask-app:latest是Kubernetes Pod模板中containers字段下的一个子字段,指定了容器应该使用哪个Docker镜像。 kubectl是Kubernetes的命令行工具,用于与Kubernetes集群进行交互。 kubectl apply -f 是使用kubectl命令行工具的命令,用于应用(或更新)一个Kubernetes配置文件。 AWS Lambda是Amazon Web Services(AWS)提供的无服务器计算服务。 无服务器(Serverless)架构是一种构建和运行应用的方法,其中应用开发者不需要管理服务器或基础设施。 Deployment对象在Kubernetes中是一种API对象,用于描述一个应用的期望状态。 基础设施即代码(Infrastructure as Code,简称IaC)是一种IT基础设施管理方法,其中,计算、网络和存储资源的配置信息被编写和存储为可版本控制的代码文件。 IaC允许开发者和运维团队用代码的方式描述和管理整个应用环境。 如果想体验gpt4,可以评论或者私信把问题发给我,然后我有空的话帮你问一下。
近年来,云原生 (Cloud Native)可谓是 IT 界最火的概念之一,众多互联网巨头都已经开始积极拥抱云原生。 而说到云原生,我们就不得不了解本文的主角 —— 容器(container)。 容器技术可谓是撑起了云原生生态的半壁江山。 容器作为一种先进的虚拟化技术,已然成为了云原生时代软件开发和运维的标准基础设施,在了解它之前,我们不妨从虚拟化技术说起。
何谓虚拟化技术
1961 年 —— IBM709 机实现了分时系统
计算机历史上首个虚拟化技术实现于 1961 年,IBM709 计算机首次将 CPU 占用切分为多个极短 (1/100sec) 时间片,每一个时间片都用来执行着不同的任务。 通过对这些时间片的轮询,这样就可以将一个 CPU 虚拟化或者伪装成为多个 CPU,并且让每一颗虚拟 CPU 看起来都是在同时运行的。 这就是虚拟机的雏形。
容器的功能其实和虚拟机类似,无论容器还是虚拟机,其实都是在计算机不同的层面进行虚拟化,即使用逻辑来表示资源,从而摆脱物理限制的约束,提高物理资源的利用率。 虚拟化技术是一个抽象又内涵丰富的概念,在不同的领域或层面有着不同的含义。
这里我们首先来粗略地讲讲计算机的层级结构。计算机系统对于大部分软件开发者来说可以分为以下层级结构:
应用程序层函数库层操作系统层硬件层
各层级自底向上,每一层都向上提供了接口,同时每一层也只需要知道下一层的接口即可调用底层功能来实现上层操作(不需要知道底层的具体运作机制)。
但由于早期计算机厂商生产出来的硬件遵循各自的标准和规范,使得操作系统在不同计算机硬件之间的兼容性很差;同理,不同的软件在不同的操作系统下的兼容性也很差。于是,就有开发者人为地在层与层之间创造了抽象层:
应用层函数库层API抽象层操作系统层硬件抽象层硬件层
就我们探讨的层面来说,所谓虚拟化就是在上下两层之间,人为地创造出一个新的抽象层,使得上层软件可以直接运行在新的虚拟环境上。 简单来说,虚拟化就是通过模访下层原有的功能模块创造接口,来“欺骗”上层,从而达到跨平台开发的目的。
综合上述理念,我们就可以重新认识如今几大广为人知的虚拟化技术:
从 2019 年初开始,就有不少创业公司陆陆续续向我咨询 Kubernetes 等云原生技术。
我总是会问这些创业公司的部署流程是怎样的,因为这能让我大概了解到一个公司的技术复杂度处在哪个阶段。 有些公司仅仅使用scp部署简单的PHP应用程序,就能让公司走的很远,而有些公司的架构达到极限,不得不使用诸如Redis或者Kafka这样的基础组件作为内部通信,从而将系统拆分为不同的服务。
当他们知道我的履历里有Kubernetes的相关实战经验后,便总会问起它。 大多数公司对上手Kubernetes很感兴趣,但同时也对Kubernetes是否适用于特定的用例表示出了担心。 我在上一家公司是怎样使用它的?学习它困难吗?开发团队有哪些使用它的经验?
当然,有时候一些关于实施不当的可怕故事会使他们担心迁移到Kubernetes是一个错误。 经常听到一些非常合理的怀疑,同时又希望部署更加简单但又犹豫不决已经成为一种常态。
所以这里我直接切入重点。 基于我已经在两家非常不同的公司使用了Kubernetes,如果我今天从头开始做一家创业公司,我极有可能从Kubernetes开始。 这是我的结论。
简而言之,运用Kubernetes带来的积极因素远远超过了少数不利因素。 我认为它值得许多创业公司的投资。 并非所有的创业公司,也不一定是你的公司,但是一定有很多这样的公司 。
让我们来看一下几点原因。
Kubernetes最初是由Google开发的开源容器编排系统,后来被贡献给了开源社区,目前有大量新的第三方库和插件(术语叫做operators)。
Kubernetes不是像阿里云或者腾讯云这样的云平台,事实上,你可以在自己的数据中心,硬件上运行和部署Kubernetes,不过我不建议初学者使用。 它更像是一种用来描述工作系统的语言。 一旦我们对系统进行了足够详细的描述,Kubernetes便可以使用其计算资源(Kubernetes的术语是nodes)来执行系统的容器。
对于初创公司来说,最大的好处就是,这种“描述工作系统”的过程可作为文档和代码的集中位置来定义基础架构 。
我不想撒谎,像AWS或者阿里云的Kubernetes容器服务目前价格偏高,除了最少3到5个实例节点外,还需要一部分管理费。 但是请考虑你要花多少钱才能让工程师手动启动节点。 这些纯粹的基础架构变更所浪费的时间仅仅是在开发产品上花费的时间。 如果你是一家想实现下一个更大目标的公司,你应该乐于付出合理的开销,以神奇的方式消除团队中容易出错且耗时的过程。
使用现成的Terraform工具,你还可以通过简单的单行更改创建一个可以扩展的集群。 在我的上一个团队,我们仅仅通过将Git提交命令从2改到4,就将集群从2个节点增长到了四个节点。 添加节点后,Kubernetes会自动将资源移动到新的节点上,不需要进一步的工作。 然后你可以继续解决工作中的实际问题。
传统的Linux生产系统通常看起来像这样:你有一些用Java,Python或Ruby编写的代码。 应用程序代码通常由不太了解服务器的人编写(或者至少没有服务器的实践经验)。
假设你有一台机器在阿里云ECS中,由你的运营团队中的某人管理,该人不太了解应用程序代码。 当应用程序团队完成某些工作时,他们希望能够部署这些更改。 运维团队希望确保所做的更改不会破坏任何系统的内容。
你也不希望系统在部署期间离线。 如果出现问题,你希望能够回滚到以前的代码版本。 从上载资产到启动服务器的部署过程需要30分钟怎么办?难道要将系统离线30分钟吗?可能不会。 你可能会想出一些系统来保持版本n-1的运行,直到版本n启动为止,此时你将切换到新版本。
这听起来确实有点复杂,有很多要记住的地方,还有很多可能出错的地方。 这些部署规则会用一系列脚本进行编写,这些脚本需要进行版本控制和维护,并且很可能本身包含错误。 而且,当我们将公司扩展为各个独立的团队时,他们所有人都可能一天多次部署。 然后噩梦就开始了。 运维团队开始对系统中的客户流失感到不知所措。 随着过程变得越来越繁琐,部署花费的时间也越来越长。
这个故事听起来很熟悉吗?
Kubernetes消除了很多复杂性。 要部署新版本的服务,我们可以简单地更新容器镜像以指向新版本的代码。 我们还可以定义运行状况检查,以在宣布新版本正常运行之前执行该检查。 如果未通过,则旧版本的代码将继续运行 。
我们可以使用仅供内部使用的DNS名称(例如order_service)定义服务,该名称将自动平衡正在运行的副本的负载。 无需维护运行实例的列表。 并且,如果我们在部署后发现问题,则可以使用简单的回滚命令查找先前的容器镜像并将其应用。 通常这只需要几秒钟,然后我们回到运行软件的最新已知稳定版本。
听起来不是很好吗?
我在一些复杂的系统上工作过,这些系统要求管理部署的人员了解a)Python,b)Bash,c)我们正在运行的OS版本的一些细微差别,d)JVM标志,e) SCP命令(您可以在不查看文档的情况下编写有效的SCP命令吗?)……等等。
还有一些组织开销。 部署脚本和基础结构代码通常由运维团队管理。 但是开发人员经常需要更改部署代码,例如,在启动时设置标志,并扩大系统规模。 这在开发人员和操作人员之间造成了紧张关系,因为这两个团队之间产生了彼此的要求,但往往会遵循不同的目标。
所有的这些复杂性会增加你在启动过程中的开销。 如果你想快速开发新功能并且能够轻松地从一个项目跳到另一个项目,想保持尽可能小的摩擦。 那么Kubernetes消除了很多痛苦,让你专注于产品。
当然这个世界上没有灵丹妙药,而且在某些情况下,像Kubernetes这样的东西有点过于庞大。
如果你只是运行WordPress,则不需要Kubernetes。 如果你运行的CMS只是偶尔进行一次升级,升级库或安装插件,而实际上从未真正部署过,则不需要Kubernetes。 Kubernetes确实是针对管理大型,不断变化的系统进行了优化。
显然,如果你要编写需要与Linux内核接口的底层嵌入式系统或软件,那么Kubernetes不适合你。 这适用于任何容器化解决方案。
Kubernetes确实有一种称为“状态集”的资源类型,旨在运行诸如数据库和管理状态的消息代理之类的东西。 从理论上讲,运行有状态集可以允许您运行多个副本并上下缩放它们,以及附加和扩展存储。 但是这样做总是让我有些紧张。 借助应用程序服务,我希望使开发人员可以轻松调整设置和部署,而不会遇到麻烦。 对于数据库,反而相反。 因为意外更改设置或将系统升级到新版本比较少见。 我也不想让我的数据库在集群中争夺CPU和内存。
如果我使用的是阿里云并且可以访问RDS,那么我特别倾向于不使用Kubernetes来存储数据库。 你选择的云提供商中的RDS或类似产品将更易于管理自动备份,扩展和监控。
Kubernetes非常适合需要随时间扩展和增长的任何项目 。
如果你是一家初创公司,那么几乎可以肯定你属于该类别。 你现在可能很小,但是你在不断成长。 这就是你说服投资者的理由,也是你聘请如此多开发人员的原因。 你的系统将要快速更改和扩展,因此你希望以尽可能减少成本和摩擦的方式构建系统。
仅出于这个原因,我认为任何电子商务,SaaS或类似公司尽早投资Kubernetes都是有意义的。 即使你只是在集群中部署单个简单的Web应用程序,对未来进行规划也意味着精心构建基础架构,以使你的团队能够快速移动一年或三年。
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/3ed36a8438b9b0a380e1.html,复制请保留版权链接!
前言在维护遗产代码时,一个关键挑战是处理全局变量,这些变量通常存在于整个代码库中,使维护和更新变得困难,本文将探讨遗产代码中全局变量的处理,重点关注变量的维护和安全实践,全局变量的存储位置在大多数编程语言中,全局变量存储在数据段中,数据段是一个内存区域,用于存储程序的静态数据,包括常量、字符串和全局变量,数据段在程序运行时不会改变,并...。
技术教程 2024-10-01 11:03:12
简介Oracle10g是一款强大的数据库管理系统,广泛用于企业和组织中,下载Oracle10g需要遵循特定的最佳实践和提示,以确保成功的安装和高效的运行,本文将介绍Oracle10g下载过程中的最佳方法,以及一些有用的技巧,以帮助您顺利完成下载过程,最佳实践1.选择正确的版本确定您需要下载的Oracle10g版本,Oracle提供了多...。
互联网资讯 2024-09-30 23:23:01
简介ASP,ActiveServerPages,是一种服务器端脚本语言,可用于创建动态Web应用程序,Access是一款桌面数据库管理系统,可用于管理和操作数据,将ASP和Access结合使用,可以为您的Web应用程序提供强大的数据操作功能,ASP的优点服务器端脚本语言,增强安全性动态内容生成,提升用户体验与各种数据库轻松集成Acce...。
技术教程 2024-09-27 18:53:21
jQuery是一个流行的JavaScript库,因为它易于使用和功能强大,它提供了许多有用的函数,可以简化Web开发任务,例如DOM操作、事件处理和AJAX请求,本文将探讨一些高级jQuery技巧和最佳实践,以帮助你进一步提高代码的性能和可维护性,1.使用事件委托事件委托是一种性能优化技术,可减少在DOM上附加事件侦听器的数量,它通过...。
最新资讯 2024-09-26 13:16:39
行距是指相邻文本行之间的间距,合适的行距可以提高可读性,特别是在阅读大段文本时,行距太窄或太宽都会затрудняетпрочтение,影响可读性,以下是对比不同行距效果的表格,行距可读性默认行距良好行距太窄较差行距太宽较差根据表格,我们可以看出默认的行距,通常为1.5倍字母高度,提供了最佳的可读性,太窄的行距会使文本显得拥挤,难...。
互联网资讯 2024-09-23 03:45:24
NaN,NotaNumber,是一个特殊值,表示一个无效的数字,当任何数字与NaN进行算术运算时,结果始终为NaN,NaN的定义NaN不是一个有效数字,因此不能参与普通的算术运算,它是一个特殊值,表示结果无效或未定义,NaN在算术运算中的表现当任何数字与NaN进行算术运算时,结果始终为NaN,这是因为NaN表示一个无效的数字,因此任何...。
技术教程 2024-09-23 02:31:35
onmouseover事件是一种HTML事件,当鼠标指针悬停在某个元素上时触发,这种事件可以用来创建各种交互式效果,例如,显示提示信息更改元素的样式执行JavaScript函数显示提示信息onmouseover事件可以用作显示提示信息的一种方式,例如,我们可以创建一个简单的HTML元素,当鼠标悬停在其上时显示一条消息,<,divo...。
互联网资讯 2024-09-17 07:03:07
XML,可扩展标记语言,是一种流行的数据格式,广泛用于存储和传输结构化数据,在Java中,可以使用正则表达式来解析XML文件,从而简化数据处理流程,正则表达式简介正则表达式,Regex,是一种强大的模式匹配语言,可以用于查找、替换或验证字符串中特定模式,使用Java正则表达式解析XML要使用Java正则表达式解析XML文件,可以遵循以...。
互联网资讯 2024-09-17 03:50:15
在拥挤的在线世界中,让你的网站脱颖而出至关重要,使用专业的网页模板是你实现这一目标的最佳方法之一,访客完成所需的操作,成本效益,与聘请网页设计师相比,使用模板是一种更具成本效益的选择,如何选择合适的模板选择合适的模板对于创建成功的网站至关重要,以下是需要考虑的一些因素,行业,选择适合你业务行业的模板,目标受众,考虑你的目标受众是谁,并...。
本站公告 2024-09-15 22:13:35
引言PHP是一种流行的编程语言,用于创建动态网站和应用程序,随着网络技术的不断发展,对PHP开发人员的需求也在不断增长,本文将深入探讨PHP开发职业的各个方面,包括薪酬结构、就业市场和职业发展路径,薪酬结构PHP开发人员的薪酬结构因经验、技能和地点等因素而异,根据Indeed的数据,在美国,PHP开发人员的平均年薪为80,648美元,...。
本站公告 2024-09-09 12:16:13
什么是JavaScript,JavaScript是一种客户端脚本语言,允许开发人员在网页和移动应用程序中添加交互性和动态功能,它使程序员能够控制网页的各种方面,例如,验证用户输入创建动态内容处理表单提交响应用户事件调用JavaScript代码,逐步指南步骤1,在HTML代码中包含JavaScript文件要调用JavaScript代码,...。
最新资讯 2024-09-06 18:58:46
国内最好用的免费建站平台,1、论坛社区程序,Discuz!Discuz是一款非常强大的社区建站系统,目前大部分的论坛或者社区网站都是基于Discuz搭建的,自2001年6月面世以来,Discuz,已拥有15年以上的应用历史和200多万网站用户案例,是全球成熟度最高、覆盖率最大的论坛软件系统之一,除了一般论坛所具有的功能外,Discuz...。
技术教程 2024-09-02 00:32:25