采用混合云的主要原因包括灵活性、可扩展性和安全性。
混合云允许组织将敏感数据保存在私有云中,同时仍能利用公共云的成本节约和可扩展性,从而提高了安全性。
彩色屏幕截图:https://packt.link/pgupD
云计算类型 | 描述 |
---|---|
公共云 | 由第三方提供商通过互联网提供,任何付费者都可以访问 |
私有云 | 专用于单个组织且不与任何其他组织共享 |
混合云 | 公共和私有云服务的组合,作为一个系统协同工作 |
多云 | 使用多个云提供商来满足不同的云计算需求 |
服务交付模型 | 描述 |
---|---|
IaaS | 作为服务提供给客户的云计算基础设施(如服务器、存储和网络) |
SaaS | 作为服务提供给客户并通过互联网访问的基于云的应用程序 |
PaaS | 提供一个平台,使开发人员能够创建、评估和启动应用程序,而无需管理复杂的基础设施 |
云计算类型
服务交付模型
图1.1:云计算模型和服务交付模型
公共云模式和SaaS模式无疑分别是最受欢迎和广泛采用的云计算和服务交付模式。以下是公有云和SaaS服务模式的优势:
一些组织可能在公共云提供商(如AWS、GCP或Azure)上运行某些工作负载,同时在其私人数据中心运行其他工作负载。虽然这些工作负载同时在公共和私有云环境中运行,但这种托管设置并不是真正的混合云。相反,这些环境是孤立的竖井。 真正的混合云是指在多个环境中创建一个一致的平台。
根据Gartner Glossary的说法,“混合云计算是指跨内部和外部云服务的混合,基于策略和协调的服务提供、使用和管理。”
混合云是一个计算能力、存储和服务池,可从多个环境中获得,包括以下环境:
混合云类型 | 描述 | 技术堆栈示例 |
---|---|---|
同质混合云 | 公共云和私有云中运行相同的技术堆栈 | 单个软件供应商提供的操作系统、系统管理程序和管理层,如Red Hat或VMware |
异构混合云 | 运行来自不同供应商的不同组件并将其集成 | 公共云提供商如AWS和Azure与私有云技术如Red Hat、VMware在不同级别集成 |
许多企业希望将本地虚拟机移植到公共云。下图取自AWS,是反映AWS上VMware Cloud的高级组件体系结构:
不仅如此,公共云提供商还构建了扩展,将云解决方案推送到组织的私人数据中心。例如,AWS Outposts通过在完全管理的产品中将AWS基础设施、服务和API扩展到本地,提供混合体验。谷歌安卓、Azure Stack也是云提供商提供的类似产品:
企业采用不同的云,因为没有一个适合所有人的云:
行业 | 应用场景 |
---|---|
政府机构 | 敏感数据存储在私有云,非敏感数据在公共云进行经济高效的存储和处理 |
科技公司 | 私有云上存储和管理专有软件,公共云用于开发和测试 |
金融服务 | 私有云上管理交易平台,公有云用于运行模拟和回测算法 |
零售 | 私有云存储关键销售和客户信息,公有云进行实时数据分析以获得竞争优势 |
电信 | 私有云存储敏感客户信息,公有云进行实时数据处理和分析以提高服务质量 |
关键事项 | 描述 |
---|---|
操作系统 | 跨云的一致操作系统是基础,以便在任何地方托管、管理和监视应用程序 |
应用程序分类 | 建立应用程序清单并分类,决定如何处理这些应用程序 |
自动化 | 测试环境的自动化创建、持续集成和持续交付是必要的 |
数据驱动的方法 | 计算需要在数据所在的位置,以提供实时见解和体验 |
管理 | 统一管理是执行策略并减少运营开销的关键 |
技术合作伙伴 | 与经验丰富的软件供应商合作,以填补技能差距并从最佳实践中受益 |
策略 | 描述 |
---|---|
退役Retire | 停用不再需要或无法产生足够ROI的应用程序 |
保留Retain | 保持当前状态,对于无法迁移到云或没有明显好处的应用程序适用 |
重新安置 | 简单迁移应用程序到新平台,如将本地VM迁移到云上的VMware或Kubernetes |
Replatform | 对应用程序进行额外的优化和调整,以利用云的特性如弹性和自我修复 |
重构Refactor | 广泛重设计应用程序架构,以提高性能、可用性和可靠性,并利用云原生功能 |
回购Repurchase | 从现有技术转向新供应商,如从内部CRM系统转向基于云的SaaS解决方案 |
标准的框架和迁移工厂有助于加速实现混合云
6-R框架是确定云迁移初始步骤的一种非常有效的方法
前两个R用于Retire和Retain。这两种策略适用于对组织的未来可能没有那么战略性的应用程序
这是关于现在或不久的将来不需要的退役或退役应用程序。这可以被视为一个很好的机会来识别和关闭某些不能为业务带来足够投资回报(ROI)的应用程序。通过停用此类应用程序,您可以专注于更需要并产生价值的服务。
这是关于保持当前的封装外形。这可能是因为您无法摆脱它,但也看不到将此类应用程序迁移到云的任何巨大好处。由于安全性、投资回报率或技术堆栈使用的原因,您投资组合的某一部分将属于这一类别。
组织中最常用的策略是重新安置。即使在使用云之前,由于成本或技术差距,应用程序所有者和IT团队在使用当前平台时也会遇到某些障碍,因此最终会重新托管。这可以被认为是一个简单的迁移,可以带来显著的好处。它也被称为提升和移位。顾名思义,您可以从当前平台提升/导出应用程序,并将其部署到新平台上,立即产生影响,并获得ROI。
举几个例子,可以将您的本地虚拟机迁移到云上的VMware或KubeVirtualt(KubeVirtualT使您可以在Kubernetes托管的容器平台中运行虚拟机)。
重新托管可能不会像重新规划/重构那样使您的应用程序云原生,也不会带来好处,但如果阻力和摩擦更小,成本更低,回报也会很快实现。
此外,重新定位(也称为系统管理程序级别的提升和转移)是指将基础设施移动到云的过程,而无需购买新硬件、重写应用程序或修改现有操作。此术语通常用于VMware Cloud on AWS产品的上下文中。
这可以看作是重新托管的进一步附加组件。对于某些应用程序,重要的是进行额外的优化并执行一些调整和编码,以从云功能中获得好处,如弹性、规模、自我修复等。
当某些应用程序需要大量改进以提供性能、可用性和可靠性时,此策略更适合。应用程序团队必须进行广泛的设计思考,并提出一个符合新的非功能需求的体系结构。这可能是一项耗时的任务,但也是最有益的策略,需要技能和专业知识才能利用云原生功能。
最后一种策略是从现有供应商或技术转向采用新供应商。这意味着出于成本、安全或技术原因终止您现有的订阅和许可证,例如,放弃您的内部客户关系经理(CRM)系统,采用Salesforce或Workday的基于云的SaaS。另一个例子是移动或减少专有数据库的使用,并采用基于云的数据库。
租户的期望是能够请求云资源、管理用户权限和自动控制。租户可以在不同的层请求不同的资源,如图所示:
图1.7 一切皆服务
关键要素 | 描述 |
---|---|
通用平台和操作环境 | 创建统一体验的操作环境,简化在任何云中的应用程序连接和管理 |
自动化 | 使用与云无关的自动化工具(如Puppet、Chef、Ansible)简化基础设施和应用程序的管理 |
全面安全实施 | 使用工具如OpenSCAP,跨多个云实现集中和细粒度的安全和补丁管理 |
统一管理 | 通过单一控制平面跨多个集群管理资源,领导者包括Microsoft、Red Hat和VMware |
政策和治理 | 建立一套灵活的策略和治理框架,以管理多云环境中的安全性、合规性和资源 |
应用程序现代化 | 使用工具如Konveyor帮助迁移和现代化应用程序,专注于Kubernetes平台 |
通用平台和操作环境:需要一个通用的操作环境,这样当用户转向任何云时,他们在平台和操作级别都有统一的体验。这将允许用户以简化的方式连接和管理应用程序。
OpenSCAP是一项全面的开源计划,它提供了一套强大的工具,用于无缝实施和实施由NIST精心维护的安全内容自动化协议(SCAP)标准。
OpenSCAP执行漏洞扫描并验证安全合规性内容以生成报告。这是一个快速且可重复的安全性的绝佳解决方案。
例如,Red Hat Advanced Cluster Management将为您的大型混合环境提供所需的功能。要从单个控制台控制集群和应用程序,Red Hat Advanced Cluster Management发挥了重要作用。
该解决方案为您的集群和应用程序生命周期提供了全面的管理、可见性和控制,并增强了跨多个数据中心和公共云的整个Kubernetes域的安全性。它还提供了对行业法规的遵守。
因为这些是互补和集成的技术,所以它们有助于自助服务并解放您的IT部门。
它是事实上的标准,本质上是声明性的,也是混合云的理想基础。它将您的工作负载从底层硬件中抽象出来。因此,您可以使用k8s在任何地方提供相同的环境,并在任何位置运行容器化的应用程序,而无需任何修改。
跨任何云操作的灵活性和云的弹性(因为您可以根据工作负载需求动态地向上或向下扩展Kubernetes集群)是它在组织中流行的原因。
特征 | 类型1管理程序 | 类型2管理程序 | KVM |
---|---|---|---|
定义 | 直接在物理硬件上运行的监控程序 | 在宿主操作系统之上运行的监控程序 | 集成在Linux内核的虚拟化模块 |
性能 | 最高 | 较低,因为存在宿主操作系统的额外层 | 高,由于直接集成在Linux内核 |
安全性 | 高,没有中间操作系统层 | 中等,受宿主操作系统影响 | 高,但依赖于Linux的安全性 |
硬件直接访问 | 直接访问,不需要宿主操作系统 | 通过宿主操作系统访问硬件 | 直接访问,作为Linux内核的一部分 |
示例 | VMware ESXi, Microsoft Hyper-V | Oracle VirtualBox, VMware Workstation | 使用Linux内核的任何Linux系统 |
图2.1–1型和2型管理程序
两种管理程序差异
此外,由于没有中间操作系统层,因此消除了与操作系统相关的漏洞。1型管理程序因其安全性而得到广泛认可。他们依靠配备了加速技术的专业硬件来高效处理诸如内存管理、存储、网络资源和CPU操作等要求苛刻的任务。
类型1管理程序的示例有VMware ESXi和Microsoft Hyper-V。
此外,由于操作系统层的原因,诸如管理内存、存储、网络资源和CPU调用之类的操作被委托给操作系统,因此类型2管理程序可以在各种硬件上运行。
类型2管理程序的示例有Oracle Virtual Box、Microsoft Virtual PC、VMware Workstation和VMware Fusion。
参数 | 类型1 | 类型2 |
---|---|---|
性能 | 高的 | 中等的 |
扩展 | 在硬件上运行 | 在操作系统上运行 |
安全 | 高的 | 中等的 |
用途 | 生产环境 | 大部分处于非生产状态 |
除了类型1和类型2管理程序之外,我们还混合了类型1和2管理程序,称为基于内核的虚拟机(KVM)。
KVM是一个集成到Linux内核中的虚拟化模块,使内核能够起到管理程序的作用。KVM是在Linux内核2.6.20版本中引入的,由于它与操作系统直接集成,因此被认为是一种类型1的系统管理程序。但是,由于它使用Linux操作系统,因此也被归类为2类系统管理程序。这项独特的技术结合了类型1和类型2管理程序的优点,使其成为基于Linux环境中虚拟化的一个有趣的选择。
KVM将Linux转换为Type 1裸机管理程序,并且只使用一个内核(Linux内核),如下图所示:
类型1、类型2和KVM管理程序的示意图
容器组件 | 描述 |
---|---|
命名空间 | 限制进程可见内容,提供进程隔离 |
Cgroups | 为每个容器分配资源(如CPU时间、网络带宽、系统内存)以避免资源抢占 |
Seccomp | 限制应用程序的系统调用,增强安全性 |
SELinux | 应用访问控制策略和标签,保护容器资源并实现隔离 |
容器化类似于应用程序级别的虚拟化,为应用程序提供了一个功能齐全的可移植环境。容器技术与虚拟化的不同之处在于,容器与相同的底层主机操作系统共享资源,而虚拟机中封装了自己的操作系统。
容器已经存在了10多年。从根本上讲,容器是Linux的一部分,或者说是Linux的特性,它们是在Linux上运行的进程。但是这些进程与同一主机操作系统上的其他进程是隔离的。
容器是由于某些组件而被隔离的,例如名称空间、cgroups和SELinux。这些组件使容器具有安全性和企业级。下图显示了容器的组件:
规范 | 描述 |
---|---|
OCI | 容器镜像格式和运行时的行业标准,确保容器的互操作性和可移植性 |
Docker | OCI标准的专有实现,提供开发、打包和部署容器化应用程序的工具和服务 |
OCI规范 | 描述 |
---|---|
容器镜像格式 | 描述容器镜像的布局和内容,包括构建、分层和分发方法 |
容器运行时规范 | 定义执行容器镜像的方法以及容器与主机操作系统和其他容器的交互方式 |
OCI是容器镜像格式和运行时规范的行业标准,旨在确保容器在不同平台和工具之间的互操作性和可移植性。OCI由包括Docker股份有限公司在内的一批行业领导者于2015年成立,旨在促进集装箱化的通用、开放标准。
另一方面,Docker是OCI标准的专有实现,为开发、打包和部署容器化应用程序提供了一套工具和服务。Docker一直是集装箱化生态系统中的关键参与者,帮助普及集装箱的使用,并为OCI标准的发展做出贡献。
OCI规范定义了两个关键组成部分:
Buildah是一个命令行工具,用于构建容器镜像,而不需要Docker守护进程或Dockerfile。以下是使用Buildah的一些基本命令:
创建新容器:
buildah from <base-image>
在容器中运行命令
buildah run <container> <command>
容器编排任务 | 描述 |
---|---|
部署和资源调配 | 自动化容器的部署和资源分配 |
资源分配 | 分配必要的资源给每个容器以保证其正常运行 |
交通路线 | 管理容器间的网络流量和访问 |
可用性和容错性 | 确保容器服务的高可用性和故障转移能力 |
监测集装箱的健康状况 | 监控容器的运行状态并响应健康检查 |
集装箱通信/网络 | 管理容器间的通信和网络隔离 |
缩放比例 | 根据负载自动扩展或缩减容器实例的数量 |
当您的组织正在扩展并拥有数百个容器时,您需要工具来自动化容器的部署、管理和扩展。
容器编排涉及以下任务:
容器的寿命不会很长;因此,重要的是要考虑以下内容:
容器生命周期考虑因素 | 描述 |
---|---|
高可用性 | 确保服务不中断,即使部分组件失败 |
可扩展性 | 容器和服务能够根据需求增长 |
安全 | 保护容器免受未授权访问和攻击 |
网络 | 管理容器网络和通信 |
IP分配 | 为容器和服务分配和管理IP地址 |
发现 | 服务和容器能够发现并连接到彼此 |
Kubernetes组件
为了在Kubernetes中运行容器,使用了一个称为容器运行时接口(CRI)的接口,该接口基于gRPC。实现CRI的容器运行时可以在kubelet控制的节点上使用。
OpenShift是Red Hat(现已被IBM收购)的旗舰产品,它建立在Kubernetes之上。除了Kubernetes提供的功能外,OpenShift还添加了各种企业级功能,以扩展和保护Kubernete。
OpenShift是100%开源的。它是为开放混合云策略而设计的,为部署在数据中心、云中或边缘的应用程序提供一致性。
VMware TKG是一个强健且可扩展的Kubernetes解决方案,专为企业设计。TKG使组织能够轻松地在不同的云环境中部署、操作和管理Kubernetes集群,如本地数据中心、公共云和边缘位置。有了TKG,企业可以跨多个基础设施无缝管理其Kubernetes部署,无论底层云环境如何,都能实现一致和统一的体验。
使用TKG,用户可以在多个环境中使用标准化、一致的体系结构快速轻松地部署可用于生产的Kubernetes集群。这使团队能够专注于开发和部署容器化应用程序,而不是管理底层基础设施。
HashiCorp有一个支持容器的产品,在某些方面,它的工作方式与Kubernetes的工作方式和管理应用程序的方式类似。但除了容器,它还支持非容器工作负载。
通过与其他HashiCorp产品(如Consul、Vault和Terraform)的强大集成,应用程序管理和编排变得简单起来。
开始使用Nomad非常简单,您可以按照https://www.nomadproject.io/上的教程进行操作。
GKE是谷歌云提供的一种可扩展的容器服务,是一种托管服务。它使用Kubernetes和其他功能,您可以在GKE上使用所有Kubernete功能。
容器堆栈由不同的层组成,这些层在不影响其他团队原则的情况下,为开发人员和IT运营所需的控制级别之间提供了清晰的边界。
运维和开发职责边界
在云和DevOps的世界里,两个最流行的缩写词是CI和CD。CI表示持续集成,CD表示持续交付。
概念 | 持续交付 | 持续部署 |
---|---|---|
定义 | 将代码更改自动部署到生产环境之前的阶段,可按需自动或手动触发 | 将代码更改自动且连续地部署到生产环境,无需人为干预 |
主要特点 | 保证代码随时准备部署到生产环境 | 自动将代码更改部署到生产环境,加速发布周期 |
人为干预 | 可能需要手动批准最终的生产部署 | 无需人为干预,自动化处理所有部署步骤 |
部署环境 | 通常在生产之前的一个或多个预生产环境中进行 | 直接在生产环境中进行 |
适用场景 | 当需要在生产部署前进行额外的手动审核或测试时 | 适用于需要快速迭代和发布的高自动化环境 |
持续交付(continuous delivery)与持续部署(continuous deployment)的区别,然后我们可以跨容器进行连续交付:
传统CI/CD和云原生CI/CD的区别:
云原生CI/CD | 传统CI/CD |
---|---|
专为容器应用而设计 | 专为虚拟和传统应用程序设计 |
Kubernetes本地 | 与Kubernetes资源不可互操作 |
更少的开销 | 需要更多的维护资源 |
Docker镜像可以以完全相同的方式部署在目标环境上,无论它是物理、虚拟、私有还是公共云基础设施。
对于混合云,CI/CD起着重要作用。使用相同的方法和流程,开发团队可以在内部部署和公共云上运行的复杂和异构环境中部署和促进软件和更改。
组织还希望使用云原生技术来构建应用程序,从而在不同的云上提供一致性的开发。
云原生技术特征 | 描述 |
---|---|
容器 | 为应用程序提供轻量级、可移植的封装环境 |
服务网格 | 管理服务间的通信,提供服务发现、负载均衡、故障恢复等功能 |
微服务 | 将应用拆分为小的、独立的服务,便于开发、部署和扩展 |
不可变基础设施 | 基础设施一旦创建,不再更改,任何变更都通过新版本来实现 |
声明式API | 通过声明目标状态来管理资源,系统负责实现这一状态 |
云原生优势 | 描述 |
---|---|
容错性 | 构建容错性好的系统,提高应用稳定性 |
易于管理 | 通过松耦合和自动化实现易于管理的系统 |
便于观察 | 提供系统状态的可视化,便于监控和问题定位 |
自动化 | 使工程师能够轻松进行系统变更,提高开发和部署效率 |
厂商中立 | CNCF推动开源生态系统,避免厂商锁定 |
CNCF对云原生v1的官方定义 https://github.com/cncf/toc/blob/main/DEFINITION.md#%E4%B8%AD%E6%96%87%E7%89%88%E6%9C%AC
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。 这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。 云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。
容器通过以下方式帮助实现云原生:
供应基础设施的典型过程包括开发人员(用户)创建一个票证以请求基础设施(运行其应用程序的web服务器),该票证需要得到其经理的批准,然后发送给运营团队。然后,操作团队将此票证记录在他们的请求系统数据库中。最终,这个票证被分配给一个系统管理员,该管理员使用管理控制台来设置具有所请求特性的资源(一个具有适当计算/内存、网络、存储、操作系统、运行库等的服务器)。一旦请求得到满足,就会通知开发人员。 如下图所示,该过程在每个阶段都需要相当繁重的手动干预,这增加了时间和成本。
虚拟化普及了将物理硬件(计算、网络和存储)抽象为软件或SDI的概念。这使企业能够提高资源利用率和灵活性,同时减少资源调配时间和成本。通过将硬件与操作系统解耦,虚拟化可以通过虚拟机提供对抽象资源的访问。
OpenStack汇集了大量资源来提供基础设施即服务(IaaS)。这些资源可以是裸机、虚拟机或容器。图3.3显示了OpenStack,一个部署为IaaS的开源云计算平台。
尽管SDI提高了硬件的资源利用率,但供应过程仍然需要开发人员(用户)创建一个票证来请求基础设施,然后由运营团队进行供应。这一过程仍然需要手动步骤,增加了时间和成本。
IaC通过使用代码而不是手动流程或交互式配置工具来管理IT基础设施,将SDI方法提升到了一个新的水平。使用IaC,您可以将混合云基础设施作为代码进行设计、构建、部署和管理。所需的基础设施规范在配置文件中定义,该配置文件存储在版本控制系统中。然后由协调器来实现该规范,协调器提供所需的资源。IaC使运营团队能够自动化基础设施的供应和管理
IaC的一些好处:
Pulumi:这是一个允许用多种编程语言定义配置的工具,允许IT团队使用现有的IDE和CI/CD来提供基础设施。它是一个声明性工具,使用命令式语言来定义基础设施的最终状态。
为了避免由于配置错误而导致的安全漏洞,可以使用checkov等安全扫描工具。这些扫描工具可以扫描系统、网络和应用程序中可能存在的安全漏洞。
分析公司Gartner的数据:“DevOps代表着IT文化的变革,通过在面向系统的方法中采用敏捷、精益的实践,专注于快速提供IT服务。DevOps强调人(和文化),并寻求改善运营和开发团队之间的协作。DevOps的实现利用了技术,尤其是自动化工具,这些工具可以从生命周期的角度利用日益可编程和动态的基础设施。” 来源https://www.gartner.com/en/information-technology/glossary/devops
与传统的软件发布实践不同,DevOps需要少量但频繁的更新。一些组织通过采用基于微服务的架构进一步实现了这一点,在这种架构中,一个大型单片应用程序被分解为许多独立的组件(微服务),为单个功能提供服务。这些微服务可以独立于其他微服务进行放大或缩小。由于每个微服务都由一个小团队所有,组织的灵活性和敏捷性显著提高。
以下是典型的DevOps流程:
应在整个软件开发生命周期中进行漏洞扫描,以识别和修复漏洞。安全内容自动化协议(SCAP)提供了一套用于自动化漏洞评估、漏洞管理和策略遵从性的标准。本规范由美国国家标准与技术研究所(NIST)负责维护。OpenSCAP是针对Linux系统的SCAP的免费实现:https://www.open-scap.org/features/standards/。
图3.8–CD的工作流程
一些流行的CI工具包括Jenkins、OpenShift Pipelines、GitLab CI/CD、GitHub Actions、Circle CI、AWS CodePipeline和Azure Pipelines。
通过自动化构建和单元测试不断测试代码,以便尽早发现缺陷。QA团队与开发人员密切合作,并可以访问最新的代码库,以确保每个阶段的软件质量。运营部还与QA团队合作,以确保测试环境的配置与生产环境类似,从而使应用程序在测试和生产过程中的行为相同。
通过连续测试,整个测试过程实现自动化,以减少软件交付时间。一些常见的连续测试工具是Selenium、RationalFunctionalTester和Cucumber。
连续运营旨在通过减少任何计划内停机时间(如计划内维护)实现全天候IT服务可用性。如果发现任何异常,基础设施将迅速恢复到所需状态。所有这些都是通过自动化的基础设施供应和监控来实现的。
尽管不断进行测试,但DevOps中的大量发布意味着生产中总是有可能出现问题。这意味着需要持续监控和观察系统行为,以识别和修复基础设施、应用程序或服务中的任何异常。需要有一个自动通知流程来处理任何影响正常运行时间、速度或功能的问题,以便在不影响服务的情况下解决这些问题。
用于监视和可观察性的一些常见工具是Prometheus、Nagios、Splunk和DataDog。
简单地说,GitOps是一种实现应用程序和基础设施生命周期管理自动化的方法。它将DevOps的最佳实践带到了基础设施运营中。GitOps通常用于云原生环境,是Kubernetes等各种基础设施和应用程序部署平台的不错选择。一个很好的例子是Kubernetes控制器,它负责确保集群的当前状态与清单文件中定义的所需状态相匹配。
GitOps工作流步骤 | 描述 |
---|---|
1. 定义状态 | 在配置文件中定义所需的基础设施状态 |
2. 存储配置 | 将配置文件存储在Git仓库中,作为各团队的共享真相来源 |
3. 提交更改 | 完成并提交对配置文件的更改 |
4. 部署测试 | 通过CI/CD管道启动配置的部署(推送或拉式部署)进行测试 |
5. 生产部署 | 测试成功后,触发部署到生产环境 |
6. 持续监控 | 持续监控部署(目标环境)和配置文件(真相来源),检测任何更改 |
部署类型 | 描述 | 工具示例 |
---|---|---|
推式部署 | Git仓库更新时触发CI/CD管道,自动将更新推送到目标环境 | Jenkins, GitLab CI/CD, Tekton |
拉式部署 | 部署环境中的代理持续监控Git仓库,发现更新后自动拉取并应用到部署环境 | FluxCD, ArgoCD |
推送部署:任何时候Git存储库有更新,它都会触发CI/CD管道将更新推送到目标基础设施。此工作流是大多数CI/CD管道的工作方式,例如Jenkins、GitLab CI/CD和Tekton。
拉式部署:部署环境中的软件代理根据部署的实际状态持续监控Git存储库中的所需状态。当在Git存储库中检测到更改(例如,新提交)时,会从Git存储库中提取更新并将其应用于部署的环境。此工作流程用于FluxCD和ArgoCD。
ArgoCD特性 | 描述 |
---|---|
自动化部署 | 根据Git存储库中声明的所需状态,自动化应用程序部署和生命周期管理 |
状态监控 | 持续监控应用程序的实时状态,确保其与Git中的所需状态一致 |
多集群管理 | 使用中央Git存储库管理多个Kubernetes集群及其应用程序配置 |
灾难恢复 | 通过Git存储库的配置备份和恢复机制,帮助进行灾难恢复 |
可视化概述 | 提供部署、服务、Pod、容器和ReplicaSets的配置状态可视化概述 |
https://argo-cd.readthedocs.io/en/stable/
ArgoCD是Kubernetes的CD工具,它使集群和应用程序能够维护配置文件中声明的所需状态。集群和应用程序配置文件在Git存储库中进行版本控制。有了ArgoCD,应用程序部署的整个过程及其生命周期管理都可以实现自动化。ArgoCD充当Kubernetes的扩展,并帮助维护Git存储库中指定的声明状态。
ArgoCD可以跟踪Git存储库(或特定分支、标签和版本)的更改,并将其与目标环境中的部署同步。ArgoCD作为Kubernetes控制器实现,根据Git repo中的期望状态持续监控应用程序的实时状态。如果应用程序的活动状态偏离了所需的状态,它就会变得不同步,并被可视化为这样。然后,ArgoCD会自动将部署同步到所需状态。
ArgoCD可以使用具有多个Kubernetes集群及其应用程序配置的中央Git存储库来大规模管理集群和应用程序,并帮助进行灾难恢复。
ArgoCD提供了部署、服务、pod、容器和ReplicaSets方面的最终配置的可视化概述。以下是一个名为datacenter gitops的应用程序的可视化表示:
GitOps最佳实践 | 描述 |
---|---|
单独的存储库 | 为应用程序配置和系统配置使用独立的Git存储库,与应用程序源代码分离 |
避免临时更改 | 避免直接在Kubernetes集群上进行更改,应通过Git存储库管理所有更改 |
避免分支 | 避免为每个环境使用单独的分支,而是使用核心清单和特定于环境的覆盖配置 |
安全性 | 利用Git的安全功能和RBAC管理对存储库的访问和权限,确保只有授权用户可以进行更改 |
有四种不同的方法可供多个接口使用:
Kubernetes通信类型 | 描述 |
---|---|
容器到容器(C2C) | Pod内的容器共享相同的网络命名空间,可通过localhost进行通信 |
Pod到Pod(P2P) | Pod可使用直接IP地址进行通信,但推荐使用服务进行间接通信 |
Pod到服务(P2S) | 服务为Pod提供稳定的虚拟IP地址,使得Pod间通信更稳定和可靠 |
外部到服务(E2S) | Kubernetes允许通过入口和出口功能将内部服务公开给外部网络 |
Kubernetes概念 | 描述 |
---|---|
Pod | Kubernetes中的最小部署单元,可以包含一个或多个容器 |
命名空间 | 在物理Kubernetes集群中创建虚拟集群的方式,用于资源隔离和访问控制 |
节点 | 运行容器化应用的物理或虚拟机,为集群提供计算资源 |
服务 | 为一组Pod提供稳定的IP地址和DNS名称的抽象层,允许内外部访问 |
多容器Pod设计模式 | 描述 |
---|---|
Sidecar | 与主应用容器并行运行的辅助容器,增强或扩展主应用的功能 |
Adapter | 将主应用容器的输出适配或转换成标准格式的容器 |
Ambassador | 代理连接,管理与外部世界的通信或连接的容器 |
Kubernetes节点、命名空间、pod和服务
容器、Pod、Kubernetes
一个pod可以有一个或多个容器
将容器捆绑在一起可以减轻业务应用程序开发人员的操作负担。
有三种多容器pod网络设计模式,涉及两个紧密相关的容器。在下图中,您可以看到主要的应用程序容器,每个容器都有一个标记为sidecar、adapter和ambassador的第二个容器:
sidecar模式是Kubernetes中使用的一种设计模式,它涉及在同一个pod中运行一个容器和一个主容器。在这种情况下,主容器通常是需要运行的应用程序,而sidecar容器提供了补充主容器的附加功能。sidecar模式是使用sidecar容器实现的。
sidecar容器在与主应用程序容器一起运行时共享资源,如网络接口和pod存储。一个巨大的好处是低延迟,因为它们使用localhost或netns IP地址在同一网络上通信。它们提供的功能是非业务逻辑的,这意味着在不更改应用程序代码的情况下,它们可以提供跟踪、安全等功能。sidecar不必使用与主应用程序容器相同的编程语言进行编码。当您查看行业中的服务网格解决方案时,您会发现它们利用了sidecar模式。
Sidecar Kubernetes清单文件
apiVersion: v1kind: Podmetadata: name: myapp-podspec: containers: - name: myapp image: myapp-image ports: - containerPort: 8080 - name: sidecar image: sidecar-image ports: - containerPort: 9090
Kubernetes中的sidecar模式可以用于为pod中的主容器提供额外的功能。在本例中,我们使用sidecar模式通过运行sidecar容器为myapp容器提供日志记录和监控功能,该容器收集日志和度量并将其转发到日志记录或监控系统。
适配器模式与sidecar模式相同,因为两个容器都在同一个pod中运行。
对于外部可插拔的可观测性解决方案,适配器模式用于提供简单的集成点。为了标准化主应用程序容器和外部可观察性服务(如日志或调用没有语言绑定的库)之间的接口,适配器模式可能会有很大帮助。
在Kubernetes(K8s)清单文件的上下文中,适配器模式的一个示例可以是使用ConfigMaps来调整应用程序的配置,使其与Kubernetesneneneba API兼容。
假设我们有一个现有的应用程序,它从磁盘上的文件中读取其配置。然而,我们希望在Kubernetes上部署此应用程序,并使用ConfigMaps来存储其配置。在这种情况下,我们可以使用适配器模式,通过创建包含应用程序配置的ConfigMap,使应用程序的接口适应Kubernetes API。
my-app-config的ConfigMap
apiVersion: v1kind: ConfigMapmetadata name: my-app-configdata: app-config.yaml: | key1: value1 key2: value2
这个YAML文件创建一个部署,将应用程序部署在容器中。它还创建一个卷,将ConfigMap作为文件装载到容器的文件系统中。configMap部分中的items字段指定要装载configMap中的哪个密钥以及将其装载到容器的文件系统中的何处。
apiVersion: v1kind: Deploymentmetadata: name: my-appspec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app-image volumeMounts: - name: config-volume mountPath: /app/config volumes: - name: config-volume configMap: name: my-app-config items: - key: app-config.yaml path: app-config.yaml
通过以这种方式使用适配器模式,我们能够使应用程序的接口适应Kubernetes API,并使用ConfigMaps将其部署在Kubernete上以存储其配置。
最终,适配器将异构容器转换为外部服务的一致统一接口。
大使容器允许外部服务访问,而无需实现服务。这有助于将主容器与外部世界连接起来,例如将localhost连接代理到网络结构的外部世界。对于分布式外部系统的系统集成,大使模式可以提供一种直接的方法。
apiVersion: getambassador.io/v2kind: Ambassadormetadata: name: my-ambassadorspec: config: | --- apiVersion: ambassador/v0 kind: Mapping name: service-a-mapping prefix: /service-a/ service: service-a --apiVersion: ambassador/v0 kind: Mapping name: service-b-mapping prefix: /service-b/ service: service-b
这个YAML文件创建了一个名为my ambassador的大使资源,并定义了两个映射,将传入的请求映射到适当的Kubernetes服务。第一个映射将前缀为/service-a/的请求映射到service-aKubernetes服务。第二个映射将前缀为/service-b/的请求映射到service-b Kubernetes服务。
现在,当大使资源接收到传入请求时,它会检查请求路径,并根据映射规则将其转发到适当的服务。例如,如果传入请求的路径为/service-a/foo,那么它将被转发到service-aKubernetes服务。
这种模式在我们需要在单个IP地址和端口上公开多个服务的情况下很有用,例如当我们有一个微服务架构,其中有许多小服务需要向外界公开时。通过使用大使模式,我们可以简化这些服务的配置和管理,还可以提供与外部世界一致的接口。
理解这三种模式之间差异的最快方法如下图所示
设计模式 | 用法 | 说明 |
---|---|---|
Sidecar | 共享资源并执行其他功能。 | Sidecar容器通过提供日志记录、监控、代理、身份验证或加密等附加功能来增强应用程序,这些功能与同一Pod中的主协作器一起部署。 |
适配器 | 检查其他容器的状态。 | 适配器模式提供了一个统一的接口来与第三方可观测性解决方案交互,可以被多个应用程序利用。 |
大使 | 与外部服务联网/集成。 | 大使模式简化了应用程序的外部访问,而无需修改核心容器。它支持代理、反向代理、请求限制和路由,增强了灵活性和安全性。 |
pod可以有多个容器,并且一个pod有其网络名称空间(netns)。
网络命名空间使您能够拥有独立于主机环境(即K8s工作节点)的网络接口和IP表。
pod中的容器共享相同的网络名称空间。由于共享的网络命名空间,容器可以通过相同的IP表路由逻辑访问相同的网络资源,例如IP地址和端口。
pod中的每个容器都可以通过localhost进行通信,就好像它们是同一网络的一部分一样。
虽然pod可以使用直接IP地址进行通信,但这不是推荐的通信方式。播客是短暂的,应该被取代,而不是直接管理。
在Kubernetes中,pod可以通过几种不同的方式相互通信:
总之,在Kubernetes中,pod之间最常见的通信方式是使用服务。服务提供了一种稳定的方式来访问一组pod,并且可以使用DNS名称或环境变量来访问它们。
Kubernetes提供了一个称为容器网络接口(CNI)的网络模型。换句话说,Kubernetes利用CNI来建立网络,通过使用网络插件,可以实现它。
许多CNI插件都可用(Flannel、Calico、Weave Net等),您可以根据用例的需要进行选择。CNI通常在初始集群设置期间进行配置,并被称为主集群网络运营商(CNO)——通常是Pod中的eth0接口。
CNI是配置容器网络接口的标准,而CNO是管理Kubernetes集群中与网络相关的资源和配置的Kubernete运营商。
为了实现pod之间的通信,网络流量需要在pod的网络命名空间和节点/主机(也称为工作者)的网络命名空间之间传输,并在整个集群中保持在租户的命名空间内。
为了实现这一点,使用虚拟以太网(veth)设备或veth对来连接Pod命名空间和主机网络。然后,这些虚拟Pod接口通过虚拟网桥进行链接,这有助于通过项目/租户名称空间使用地址解析协议(ARP)在它们之间交换流量。下图描述了Kubernetes的网络。
要利用容器(位于同一个pod中)的多个网络,首先,您需要在K8s集群中规划、设计并实现您的网络结构。然后,您可以参考K8s网络定义中的网络参数:
当使用Kubernetes本地网络结构时,有几个选项/解决方案可用于管理Multus附加CNI接口(即NetworkAttachments)上的IP地址。这些解决方案包括以下内容:
Kubernetes中的Pod是临时的,可以根据流量需求创建、终止和放大或缩小。这意味着pod的IP地址可能会频繁更改,使客户端很难连接到它们。
Kubernetes网络通过利用其服务功能来解决这个问题,该功能为前端分配一个稳定的虚拟IP地址,用于与链接到服务的后端pod建立连接。此外,该服务以负载平衡的方式将指向该虚拟IP的流量分配给相关吊舱组。
Pod通过服务通信
服务跟踪pod的IP地址,因此即使pod的IP IP地址发生变化,客户端仍然可以毫无问题地连接到它,因为它们只与服务的静态虚拟IP地址通信。这使得客户端可以连接到应用程序,而无需知道pod的特定IP地址,从而减少了pod更改时所需的重新配置量。
除了在集群内路由流量外,Kubernetes还允许您将应用程序公开到外部网络。主要有两种方法:
入口和出口
Kubernetes使用Services来访问一组共享公共标签选择器的pod。这允许集群内的应用程序之间进行通信,并使在集群中运行的应用程序可以公开给外部实体,如下图所示:
Kubernetes提供了不同的服务类型,允许您指定如何公开服务。以下是三种主要类型:
ClusterIP是P2P通信的最佳选择,它避免了将服务与外部世界隔离,而且从成本角度来看也是如此。另外两个选项将带来一些额外的成本——NodePort的扩展成本和LoadBalancer的SaaS成本。
Kubernetes通信解决方案 | 描述 |
---|---|
Submariner | 使用第3层网络连接不同集群中的Pod和服务,创建VPN连接以安全地通信 |
Skupper | 使用第7层通用应用程序网络连接不同环境中的服务,基于服务网格架构 |
服务网格 | 在Kubernetes中实现为代理集合,处理服务间通信的细节,如Istio和环境网格 |
Submariner组件 | 描述 |
---|---|
灯塔 | 在每个集群中运行的Pod,负责发现和维护其他集群中灯塔Pod的状态 |
网关 | 在每个集群上运行,负责路由集群间流量 |
潜艇代理 | 在每个集群上运行,配置网络规则以允许集群间通信 |
Skupper和环境网格特点 | 描述 |
---|---|
Skupper | 利用虚拟应用网络(VAN)提供跨多个云环境的无缝连接,易于管理和自动化 |
环境网格 | 提供分层方法,从无网格到安全覆盖的平滑过渡,以及完整的L7处理能力 |
Submariner是一个软件组件,可以实现不同集群中运行的吊舱和服务的无缝连接。它允许运行在不同集群上的pod和服务像在同一网络上一样相互通信。
潜艇由几个不同的组件组成,这些组件协同工作以提供这种连接。此处列出了这些组件:
这些潜艇组件协同工作以路由流量并管理吊舱之间的连接。
潜艇结构
它的工作原理是Submariner在每个集群之间创建一个VPN连接,允许集群通过互联网安全地相互通信。控制平面在现有网络基础设施之上创建虚拟网络覆盖,并且数据平面使用该覆盖在集群之间转发业务。通过将服务名称解析为适当的IP地址,可以从另一个集群访问在一个集群中运行的服务。Submariner还允许应用程序/命名空间跨越多个集群,从而提供高可用性和灾难恢复等额外优势。
组件:
Skupper是一种允许您连接和公开在不同Kubernetes集群或不同环境中运行的服务的软件。它使用服务网格体系结构来提供服务之间安全可靠的通信,无论它们在哪里运行。Skupper构建在Kubernetes API之上,可以使用Kubernetes命令行工具(kubectl)进行安装和管理。
Skupper使用虚拟应用网络(VAN)处理多集群通信。让我们也试着去了解VAN。VAN可以提供跨多个云环境的无缝连接,因为它们在网络堆栈(应用层)的最高级别发挥作用。这些网络使用称为第7层应用程序路由器的专用路由器,在不同基础设施上运行的不同应用程序之间进行通信。这些路由器充当VAN的主干,类似于传统网络路由器是虚拟专用网络(VPN)的主干。然而,与在网络端点之间路由数据包的VPN不同,VAN使用这些路由器在特定的应用程序端点(称为第7层应用程序地址)之间引导消息。
Skupper架构
Skupper的主要组件是Skupper控制平面和Skupper边缘路由器。控制平面负责管理服务到服务的连接,边缘路由器负责管理进出服务的流量。边缘路由器使用一组暴露在外部世界的虚拟IP地址和端口,然后将这些地址和端口转换为集群或环境中的适当服务端点。
Skupper的工作原理是创建一个连接不同集群或环境的虚拟覆盖网络。这与Submariner类似,但它不需要相同级别的网络知识,并且使用了一种更简单的方法。Skupper可以作为Kubernetes插件进行部署,这使得它易于管理和自动化。它还允许您创建跨不同环境的服务网格,这有助于服务发现、负载平衡和安全通信。
局限性和缺点 Skupper的缺点之一是它只支持Kubernetes,因此不能用于将不同的编排系统连接在一起。此外,与其他服务网格解决方案(如Istio)相比,Skupper可能被认为不太成熟,功能也不丰富。此外,在集群上运行Skupper的开销可能会占用资源,这可能会影响系统的整体性能。
服务网格是为微服务应用程序设计的可适应性基础设施层,它提高了服务实例之间通信的速度、可靠性和灵活性。
在Kubernetes中,服务网格被实现为与应用程序代码一起部署并由编排平台管理的代理的集合。这些代理(或“sidecars”)处理服务到服务通信的细节,如流量管理、监控和安全性。
服务网格的主要组件是控制平面和数据平面。控制平面负责管理和配置代理,而数据平面是拦截和处理流量的实际代理集。代理使用控制平面提供的配置来做出路由决策并应用策略。请注意下图中的服务网格通用体系结构,它描述了代理、控制平面和各种重要组件。
图4.21–Istio服务网格架构
在这个体系结构图中,您将注意到Istio的不同组件和sidecar正在启用pod连接。
尽管sidecar提供了优于应用程序重构的优势,但它们并不能确保应用程序和Istio数据平面之间的完全分离。因此,这导致了某些限制:
环境网格处于早期阶段,旨在将传统网格功能分离为两层。底层为流量路由和零信任安全提供了一个安全的覆盖层。顶层提供了对Istio所有功能的访问,可以在必要时启用。
尽管第7层处理模式比安全覆盖更耗费资源,但它仍然作为基础设施的环境组件运行,不需要对应用程序吊舱进行任何更改。
图4.22——切片的新网格
环境网格为Istio的采用提供了一种分层的方法,允许从无网格到安全覆盖的平滑过渡,并根据用户的需求在每个命名空间的基础上进行完整的L7处理。不同模式或侧车的工作负载可以轻松地进行互操作,并且可以根据不断发展的需求根据需要混合和匹配功能。
环境网格依赖于安装在每个Kubernetes集群节点上的共享代理,该代理充当负责安全连接和验证网格元素的零信任隧道(或ztunnel)。该节点的网络堆栈通过ztunnel代理路由来自相关工作负载的所有流量,确保Istio的数据平面和应用程序问题完全分离。ztunnel代理不对工作负载流量执行任何L7处理,这导致了一种比使用sidecars更高效、更具成本效益的方法。这种简化的方法能够提供共享基础设施。
环境覆盖
ztunnels构成了服务网格的基本框架,提供了一个零信任环境。一旦为命名空间激活了环境网格,它就会生成一个安全覆盖,使工作负载能够使用诸如mTLS、身份验证、授权和遥测等功能,而无需检查L7流量。当需要L7功能时,可以允许命名空间使用它们,并使用路点代理来处理该命名空间中应用程序的L7处理。
服务网格控制平面负责在集群内设置称为ztunnels的通信路径,以处理所有需要高级处理的网络流量。这些路径被称为路点代理,本质上是常规的pod,可以像Kubernetes中的任何其他部署一样自动缩放。这种设计允许更好的资源利用率,因为航路点代理可以根据其服务的名称空间的实际流量需求进行缩放,而不必预测和提供最大或最坏情况下的流量负载。以下是一个ztunnel的描述:
环境连接
环境网格使用HTTP CONNECT over mTLS来建立安全隧道,并利用基于HTTP的覆盖网络环境(HBONE)模式沿路径实现航路点代理。与TLS相比,这种方法确保了更精简的流量封装,同时还实现了与负载均衡器基础设施的无缝互操作性。
将sidecar和环境网格组合在单个网格中不会对集群造成任何限制或安全问题。Istio控制平面确保策略的实现是一致的,无论选择何种部署模型。环境网格提供了用于管理应用程序流量需求的附加选项,具有增强的可配置性和更有效的方法。
服务网格联合是在多个服务网格之间连接和共享服务和工作负载的一种方式,每个服务网格都由自己的管理员管理和控制。默认情况下,网格之间不允许通信和信息共享,只允许在明确的选择加入基础上进行。这与云时代的最低特权原则是一致的。
要启用联合,必须在每个网格上配置服务网格控制平面,以便为联合创建特定的入口和出口点,并标记整个网格的信任边界。联合还需要其他对象,如ServiceMeshPeer、ExportedServiceSet和ImportedServiceSet:
用于通信的服务网格控制平台
服务网格框架是专门的基础设施层,可以简化基于微服务的应用程序的配置和管理。这些框架通常利用sidecar容器作为代理,提供基于双向TLS的安全性、断路和金丝雀部署等功能。
大多数流行的服务网格解决方案也支持多集群部署,允许通过代理在集群之间路由流量。它们还可以提供跨集群的双向TLS连接,并公开具有跨集群流量路由等功能的服务。然而,使用这样的解决方案
通常需要多个步骤和新的特定API。下图描述了跨集群通信的服务网格:
图4.26——通过出口和进口进行通信的服务
服务网格联邦允许跨不同集群管理多个服务网格,从而实现服务之间的无缝通信和控制。这种方法可以简化复杂分布式系统的管理,同时实现高效的扩展和恢复能力。
图5.1–5G核心解决方案
这包括云服务提供商和内部数据中心提供的服务和资源。其中包括核心资源,如计算、网络、存储和服务,如NTP源、防火墙、负载均衡器以及身份管理和自动化工具。基础架构包括裸机服务器实例、虚拟机或基础架构即服务(IaaS)产品。以下是基础设施提供的服务和资源示例:
该应用平台为5G应用程序和NFs独立于底层基础设施运行提供了基础。基于容器的应用程序平台包括容器执行、编排平台以及用于度量和仪表板(如Prometheus)的相关工具。Kubernetes是最受欢迎的平台,用于在混合云中部署应用程序,保持它们的运行,并确保它们可以根据不同的用户需求进行扩展。以下是基于Kubernetes的应用程序平台提供的服务和工具的示例:
图5.3–应用程序平台堆栈
5G应用程序提供核心5G功能,可分为以下几类:
部署在混合云上的解决方案堆栈需要得到管理工具(混合云管理器)、安全和策略管理工具(RBAC)、运营商和服务网格的支持。以下是部署基础设施、应用程序平台、5G应用程序和生命周期管理(第二天操作)所需组件的示例:
这些组件通过跟踪各种集群的资源利用率、可用性和响应时间等关键指标来监控混合云的性能。他们还负责多集群管理、GitOps和安全性。
电信公司可以通过采用分离控制平面和用户平面功能的CUPS架构来构建灵活高效的5G核心。这些功能可以部署为云原生应用程序或可以通过标准接口进行通信的NFs。每个NF可以根据服务需求和资源可用性动态地且独立于其他NF进行扩展。
这使得电信公司能够支持广泛的5G用例,而无需额外的操作复杂性和成本。通过利用应用程序平台管理工具,电信公司可以轻松地协调、操作和监控网络的每一层。
RAN负责将移动设备连接到服务提供商的网络。移动设备连接到无线电塔顶部的天线,这些天线向基站发送信号,在基站中信号被数字化并路由到核心网络。这些移动设备,也称为用户设备(UE),可以包括汽车、无人机、农业机械,甚至是非移动设备,如监控摄像头或工业设备(见图5.8)。
图5.8–移动网络概述
图5.9——网络技术发展
核心安全原则——信任。安全不应该事后才考虑,而应该从头开始。内置安全模型的一种非常常见的方法是零信任方法。
图6.3-混合云基础设施中的安全组件
图6.4-单一混合云架构
上图显示了一个在Kubernetes集群内运行的简单web应用程序,用户可以从台式机、笔记本电脑和移动设备访问该应用程序。该应用程序将其数据存储在通过数据管道填充的云原生数据库中。它从运行Kubernetes的边缘集群接收数据,该集群处理来自物联网设备的数据预处理,也从运行在批量发送数据的预处理数据中心中的遗留数据源接收数据。我们将在本节中使用此示例来解释安全性如何与这些组件中的每一个相关。
图6.5——责任界限
将最新的安全补丁应用于正在使用的数据库版本非常重要。
随着时间的推移,保持平台安全的最佳实践之一是不断更新和修补您的Kubernetes版本。
Kubernetes上游社区每年发布三个主要版本,然后还有较小的安全更新和补丁,通常在全年作为次要版本发布。在进行主要升级的同时,跟上安全性和修补次要版本的发布是非常重要的。同样,作为最佳实践,遵循主要版本的升级节奏也很重要,因为落后太多意味着从安全修复的角度来看,新版本将不再受支持。同样,这将使升级周期的管理更加复杂,因为它们需要较小的增量升级。
就安全最佳实践而言,这是应用标准化和强制执行最困难的一层。造成这种情况的主要原因是存在不同类型的应用程序。
应用程序安全性的一个非常重要的方面包括保护应用程序在下面访问的数据。
应用程序安全包括整个软件交付生命周期的安全最佳实践
(SDLC)管道。这个管道通常被称为DevOps管道。
当DevOps管道与安全实践集成时,它被称为DevSecOps CI/CD管道。一些可能需要额外工具的集成实践包括以下内容:
身份和访问管理(IAM)要素 | 描述 |
---|---|
身份认证(AuthN) | 确定实体的身份,可以是最终用户、服务账户、API密钥凭证或SSL/TLS证书 |
授权(AuthZ) | 决定实体可以进行的操作,通常通过角色、组、访问控制列表等定义访问级别 |
身份涵盖了安全性的所有组成部分。我们之前提到过零信任的概念以及跨多个系统的信任边界扩展。因此,所有组件始终呈现一个标识是很重要的。身份会影响混合云世界中的许多角色(用户角色,如开发人员、系统管理员等),在提供访问、服务和数据的同时,在所有实体中一致、适当地应用安全原则非常重要。在遵守业务合规性和监管要求的同时坚持这些原则是构建安全混合云解决方案的关键。
身份是安全各个方面的切入点。在混合云的世界中有多个人物角色,在本节中,我们将从安全的角度来考虑所有这些角色。每个角色都可以被视为一组用户,每个组通常都有一组访问控制和权限。向实体授予权限以允许它们访问、读取或写入系统中的数据和更改的过程称为身份和访问管理(IAM)。这些权限被绑定到定义访问级别的角色中,并且可以根据所需访问权限的粒度进行预定义或定制。身份本身由两部分组成:身份验证(AuthN)和授权(AuthZ),本质上分别意味着谁可以做什么:
AuthN决定你是谁,并且来自一个身份平台:
AuthZ决定您可以做什么,并受以下内容控制:
IAM的一些最佳实践:
IAM最佳实践 | 描述 |
---|---|
单一登录和联合身份 | 通过单一身份平台实现统一的登录过程,简化用户访问控制 |
集中AuthZ管理 | 使用单一存储库集中管理授权策略,确保一致性和可管理性 |
安全管理超级管理员账户 | 遵守超级管理员账户的安全操作和管理最佳实践 |
自动化用户管理 | 自动化用户账户和生命周期管理,提高效率和安全性 |
最小权限原则 | 分配最低限度的权限以完成任务,减少潜在的安全风险 |
监控和审计 | 定期监控和审计权限使用情况,确保适当的访问控制 |
密钥管理和轮换 | 定期轮换服务账户的密钥,确保密钥的安全性 |
短期凭证 | 使用短期凭证减少长期密钥的风险,提高安全性 |
保护API访问 | 使用凭证保护所有API访问,防止未授权访问 |
密码策略和双因素认证 | 为用户账户制定强密码策略,并启用双因素认证增加安全层次 |
Kubernetes平台内的层
Kubernetes作为一个平台,在抽象基础设施的同时,很好地提供了分布式计算。以下是保持该层安全的一些最佳实践建议:
•使用仅适用于运行容器的优化操作系统来限制攻击面
•限制平台对底层操作系统的访问(即限制系统调用和文件路径访问)
•在节点引导期间(即,将新节点加入集群时)集成云提供商提供的加密验证功能
确保集群安全的最佳方法是确保您运行的是最新版本的Kubernetes。
Kubernetes集群的一个关键安全控制是强大的基于角色的访问控制(RBAC),以确保集群用户和在集群上运行的工作负载都具有执行其角色所需的适当访问级别。对Kubernetes数据存储(etcd)的访问尤其应仅限于控制平面,并且etcd应仅通过TLS访问。在静止时对所有存储进行加密是一种很好的做法;etcd也不例外,因为它是你集群的大脑。
图6.9-请求到容器的安全路径
所有集群都必须设置身份验证机制,并且在API服务器处理任何请求之前,所有API客户端都必须经过正确的身份验证。较低级别的测试环境,如dev,有时只有一个用户,可以使用静态承载令牌方法,而更高、更大、更安全的环境集群可以与现有的OIDC或LDAP服务器集成,这允许基于组的更细粒度的访问控制。
一旦通过身份验证,所有API调用都将通过授权检查。Kubernetes提供了一个全面的RBAC堆栈,有助于将传入请求的用户或组与绑定为角色的一组权限或操作相匹配。这些权限是get、create或delete等动词与Kubernetes资源(如pod、服务或节点)的组合,这些资源的作用域要么将它们限制在命名空间中,要么在集群范围内实现权限。
当谈到实现零信任战略时,可审计性和自动化是两个关键原则。推荐的工作负载安全性最佳实践也围绕着这些关键原则。
Kubernetes提供了准入控制器,这些控制器有助于在对Kubernete对象存储的更改持久化之前对进入API服务器的请求执行验证(本质上是对配置文件的更改,因为Kubernets是一个声明性系统)。这有助于我们积极主动地进行与安全相关的预检查。这个用例的一个很好的例子是,在允许在集群中部署这些图像之前,检查图像的签名或显式元数据的存在。准入控制器的另一个例子是pod安全准入,它有助于执行pod安全标准。
应用程序容器镜像实际上也被视为基础结构。这些镜像存在安全漏洞,因此有效管理其库存非常重要。
图6.10——漏洞管理的生命周期
漏洞威胁分析不能仅限于扫描注册表中的容器镜像。漏洞扫描必须扩展到生产中运行的容器,这一过程也称为动态威胁分析。从这次扫描中发现的漏洞可以分为不同的关键级别。镜像是否符合要求取决于企业自己定义的对这些关键级别的响应。在您的软件交付生命周期内,可以自动检查镜像签名和扫描漏洞。
代码的一些最佳实践建议:
无论是公共云、私有云还是边缘,网络总是有两个组成部分。一个是物理网络,而另一个是软件定义的网络,即物理网络之上的覆盖网络。在混合云的前置和边缘部分,安全责任由企业承担,而公共云提供商保证基本的网络安全水平,并提供网络服务和将安全集成到设计中的能力。下图显示了创建网络体系结构时通常实现的网络边界:
上图说明了在设计网络时需要牢记的两个重要注意事项。两者在混合云架构中都至关重要:
这些可以通过使用网络防火墙规则来创建完全限制互联网访问的气隙网络,并创建DMZ(或非军事区)来实现,DMZ是一种外围网络,为所有不受信任的流量在内部网络周围添加一层安全层。
在更深入地探讨这些考虑因素之前,确定应用程序的入口点是很重要的。换句话说,提供对我们的应用程序的访问的公共端点位于哪里?网络设计的细分取决于此位置。该端点可以在公共云的公共地址空间中,也可以在企业的数据中心或私有云中。为了保持一致性,我们将回到混合云中安全性的不同组件部分中使用的相同示例。基于示例中的架构,我们将假设我们的公共端点位于其中一个公共云提供商中。
假设端点位于公共云提供程序中,它通常会由安全负载均衡器公开。云提供商有自己的web应用程序防火墙,可保护此端点免受分布式拒绝服务(DDoS)攻击。企业还可以灵活选择与云无关的WAF解决方案,以根据其战略,在其预处理系统和多个云环境中保持设计和可用性的一致性。负载均衡器可以位于第7层或第4层,具体取决于应用程序的要求。
确保流量安全以实现安全和法规遵从性目标非常重要。最佳做法建议使用安全套接字层(SSL)或传输层安全性(TLS)协议来保护通过网络传输的数据。此外,暴露的端点将具有与其关联的DNS名称。另一个最佳实践建议是使用域名安全扩展(DNSSEC)来保护您的DNS数据。DNSSEC从源提供数据真实性的加密验证,并为DNS协议提供完整性保护(保证在传输过程中不受数据修改)。
现在,我们进入虚拟私有云(如果云是GCP或AWS)和托管应用程序和数据管道的虚拟网络(如果云为Azure)。这就是我们有另外两个与核心VPC集成的网络的地方——我们有托管Kubernetes集群的边缘网络,我们的企业数据中心有我们的遗留数据库。这就是网络周边控制变得非常重要的地方。防火墙规则在控制整个网络的进出流量方面发挥着非常重要的作用。除了防火墙规则之外,我们还可以对网络进行划分,将由此产生的子网络分为可公开访问的子网络和完全私有的子网络。我们在网络中也有路由的概念,它定义了网络数据包从源地址到目的地址的路径。使用网络周边控制和网络分割的组合,当我们的应用程序中有多层时,我们能够提供网络隔离。以下是网络分段和隔离的几个常见示例:
混合云挑战 | 描述 |
---|---|
不同系统之间的连接 | 管理不同云和数据中心之间的网络连接和兼容性问题 |
集成 | 将多个云服务和传统IT环境集成为一个协同工作的系统 |
应用程序可移植性 | 在云和数据中心之间平滑移动应用程序,避免依赖特定平台的特性 |
资源利用和消耗优化 | 确保资源在多个环境中得到高效利用,优化成本和性能 |
基础架构和应用生命周期协调 | 管理跨云和数据中心的基础设施和应用程序的部署、更新和维护 |
存储 | 解决数据存储、访问和同步问题,特别是跨多个云环境 |
架构考虑因素 | 描述 |
---|---|
可移植性和可管理性 | 设计灵活、云厂商中立的解决方案,避免陷入单一云提供商的依赖 |
数据驻留和监管要求 | 遵守地理和行业特定的数据保护和隐私法规,管理数据的存储和处理位置 |
区域和全球冗余的应用程序要求 | 保证应用程序的高可用性和灾难恢复能力,跨不同地区和全球部署 |
高效软件交付供应链流程 | 在整个基础架构中实现高效的开发、测试和部署流程,缩短上市时间 |
在讨论混合云的架构考虑因素之前,首先要了解我们试图使用混合云实现解决的问题或挑战。
Kubernetes混合云的价值主张
混合云需要关心的事
类别 | 注意事项 |
---|---|
计算设计 | - 裸机服务器- 虚拟机管理程序/虚拟机- 云区域的识别- 强化和认证虚拟机映像- OS认证和强化 |
网络设计与信任扩展 | - 网络周长和防火墙规则(入口/出口)- 下一代防火墙设备(如果适用)- 专有网络定义与云网络安全- 专用和公用子网- 内部网络上的非军事区- 抵御分布式拒绝服务(DDoS)的Web应用程序防火墙(WAF)- 与内部系统的互联网连接受限- 域控制器和DNS: - 使用云DNS - 使用本地DNS- 云负载平衡器与基于设备的负载平衡器- IP地址管理 |
混合连接 | - VPN连接(如果适用,带有边缘位置)- 与数据中心的私人连接 |
存储设计 | - 网络文件系统- 容器存储基础架构- 云存储: - 基于成本和性能的适当级别 - 块存储与对象存储 |
数据库层 | - 本地遗留问题- 云数据库服务- 在容器中运行的云原生数据库 |
公共云访问和计费配置 | - 帐单帐户- 服务帐户- IAM权限 |
Kubernetes架构和集群配置 | - 节点配置: - 节点类型操作系统(Linux/Windows) - 节点容量(CPU/GUP/TPU) - 所需节点数 - 自动缩放阈值定义 - 网络配置- 软件定义网络(SDN)的选择- API服务器配置/kubelet配置- 群集自动缩放属性 |
应用程序安全 | - 与身份平台(IDP)集成- AuthN和AuthZ- CI/CD |
体系结构维护和支持 | - 基础设施即服务(IaaS)代码- 配置为代码- 作为代码的策略- DevOps- 备份和灾难恢复(DR)体系结构- 容错和HA体系结构注意事项 |
在整个列表中,让我们特别关注关键项目(基础设施即代码、配置即代码、策略即代码和DevOps),因为它们在该架构的部署中发挥着非常重要的作用。
对整个混合云架构进行建模并将其转换为代码有助于实现与可重复过程的一致性。它还有助于快速创建和销毁按需环境。可以从生产环境代码中准确地创建相同的灾难恢复克隆。其他优点包括:
Kubernetes为维护和扩展混合云环境提供了最大的灵活性、灵活性和控制能力。我们还知道Kubernetes是一个完全基于配置的声明性分布式系统。在适用的情况下,所有在容器内运行的云原生和现代应用程序都将转向Kubernetes,这是容器编排的行业标准。配置YAML文件是定义平台的整个配置的资产。就像基础设施一样,我们现在能够将我们的平台(如果是Kubernetes)配置表示为代码。下图显示了Git版本控制存储库在持续集成和持续部署中发挥着重要作用
图7.7 Kubernetes的GitOps工作流程
配置不需要仅限于平台,也可以扩展到应用程序。所有基于Kubernetes的应用程序代码都是一组表示应用程序状态的YAML文件。因此,它已经以“配置即代码”的形式存在。当涉及到应用程序时,除了核心应用程序配置,它们还有环境配置。如果采用“按代码配置”方法,将应用程序代码和环境配置分离到单独的存储库中也是一种很好的做法。
为了进一步简化代码的使用和扩展,有一些开源工具,如Kustoize、ArgoCD和Helm等,它们引入了一种使用模板管理应用程序配置的方法。尽管参数化解决方案很容易实现,但它们通常仅在小范围内有效。随着时间的推移,参数化模板变得复杂且难以维护。使用这些工具集的组合有助于有效地实现GitOps和Kubernetes基础设施和应用程序的持续交付。
自动化在帮助我们控制和管理混合云架构的安全态势方面的重要性。策略即代码是指使用代码来管理安全管理的规则和条件。在确定适当保护混合云架构后,然后使用Python或Rego等编程语言编写策略,这取决于用于实施策略的工具。一旦我们有了作为代码表示的资产,我们就能够使用软件编程的最佳实践,如版本控制和模块化设计,并轻松地将其扩展到云资源的治理中。受监管行业的企业认为,违规行为处理起来非常昂贵和耗时。因此,这些方法是积极主动的,将为他们节省数百万美元用于补救这些违规行为并对其品牌产生不利影响。将策略用作代码的一些优点如下:
图7.8–策略控制器的工作流程
图7.9——混合多云的DevOps——一次一点
DevOps的许多方面包括以下方面:
DevOps方面 | 描述 |
---|---|
软件配置管理 | 管理软件的配置以支持多环境的一致性和可追踪性 |
变更管理 | 控制对软件环境的更改,确保更改的稳定性和可预测性 |
需求管理 | 确保软件开发满足用户需求和业务目标 |
软件交付管道 | 自动化的过程,用于构建、测试和部署软件 |
环境管理 | 管理软件开发、测试和生产环境,确保一致性和隔离 |
持续集成 | 自动化地将代码更改合并到共享仓库,频繁地进行以便早期发现问题 |
持续测试 | 在软件开发生命周期中自动且持续地进行测试,确保质量 |
持续部署 | 自动化地将软件部署到生产环境,以实现快速交付 |
安全检查 | 在交付过程中整合安全措施,确保软件的安全 |
持续监控 | 实时监控应用和基础设施的性能,及时响应问题 |
运营和现场可靠性工程(SRE) | 使用工程方法管理和改进系统的可靠性和运营效率 |
图7.10——DevOps自动化的最大优势
我们必须考虑投资回报率(ROI)和总拥有成本(TCO)。
经济性指标 | 资本支出(CapEx) | 运营支出(OpEx) |
---|---|---|
定义 | 一次性资产收购的长期投资,受益多年 | 日常经营业务所产生的持续成本 |
示例 | 服务器、建筑物、数据中心设备 | 电力、域名注册、根据使用量支付的云服务费用 |
归类 | 长期资产,如物理服务器和数据中心建设 | 消耗品和服务,如云服务的按需计费 |
与混合云的关系 | 私有云组件中的物理基础设施投资 | 公共云资源的使用费用,根据消耗计费 |
资本支出的定义是通过一次资产收购来经营企业,并使企业受益数年。这些可以指收购的房地产、空调和发电机,专门用于运行IT;用于建造数据中心的所有服务器和设备都将归CapEx所有。所有签署的有助于延长这些资产使用寿命的维护合同也属于资本支出类别。
OpEx是日常经营业务所产生的成本。这可能包括打印机的纸张、建筑的电力或商业网站的域名注册。他们是根据使用情况使用或支付费用的消耗品。这些是业务的必需品,但不是组织的资产。在混合云中,OpEx将对应于公共云,在公共云中,业务根据其资源消耗产生费用。
下图显示了CapEx和OpEx之间的简单比较:
了解CapEx和OpEx对于清楚地理解混合云的经济性非常重要。这将帮助我们确定ROI和TCO。
经济效益指标 | 投资回报率(ROI) | 总拥有成本(TCO) |
---|---|---|
定义 | 投资对业务影响的衡量,回报需大于投资成本 | 建立基础设施相关的总投资成本,包括购买、运营和维护 |
挑战 | 准确估计ROI困难,尤其是考虑到混合云的有形和无形效益 | 估计TCO挑战性大,尤其是因为云服务的动态性 |
混合云考虑因素 | 需要考虑内部部署和云上的有形和无形效益 | 必须考虑云基础设施、迁移管理以及公共和私有云的运营成本 |
ROI是指投资对整个业务的影响。回报大于TCO。准确估计ROI非常困难,尤其是在混合云的情况下,因为有形(效率和收入)和无形(复杂的DevOps流程和多个工具)是如何在内部部署和云上部署的。
TCO是指与建立基础设施相关的总投资成本。它包括资产在其使用寿命内的购买、运营和维护。同样,这对混合云来说真的很有挑战性,因为云是一个动态的生态系统,估计TCO是云基础设施、云迁移或管理以及运营成本的组合。这些必须针对公共云和私有云分别进行。
图7.12-与云管理相关的任务
实现混合云的步骤:
设计网络连接时的关键要素:
下图显示了不同网络汇聚在一起的简单示意图,并显示了混合云架构中公共和私有网络边界的分离:
所有网络安全方面,连接可以通过几种不同的方式进行:
从企业的角度来看,应该制定适当的治理流程:
混合云架构中的数据流经许多系统。需要在数据的整个生命周期中维护合规性和法规要求。它需要在运输、存储等过程中得到保护。数据存储在许多分段存储系统中,因此必须格外小心地保护这些数据存储位置。常见的可能性是中间人类型的攻击,因为它流经不同的云和本地环境。应该巧妙地使用加密来向未经授权的用户隐藏数据。
图7.15-工作负载安全组件
通过自动化和代码进行管理成为实现最佳实践推荐的安全态势的唯一途径。
由于复杂的混合云架构及其相关的最佳实践的所有实现,成本本身就很高。
以下是所有混合云成本考虑因素的列表:
最后,归根结底是企业是否能够负担得起混合云的成本。当收益大于成本时,会选择混合云架构。OpEx和CapEx都有组合,我们详细讨论了混合云的经济性,这意味着有足够的效率可以根据工作负载和业务的要求来实现。