设计工作负载分离

借助 Google Distributed Cloud (GDC) 网闸隔离配置中的工作负载隔离,您可以跨项目和 Kubernetes 集群分离容器和虚拟机 (VM) 应用。规划环境边界有助于您控制访问权限政策、控制维护影响并优化节点容量。您可以调整这些架构模式,以满足每个 GDC 领域的特定要求。

本文档适用于管理组织资源的平台管理员组中的 IT 员工,以及维护服务的应用运维人员组中的开发者。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众群体。

工作负载的部署位置

在 GDC 平台上,部署虚拟机 (VM) 工作负载和容器工作负载的操作有所不同。下图展示了组织的数据平面层中的工作负载分离。

组织数据平面中的工作负载隔离。

基于虚拟机的工作负载在虚拟机内运行。相反,容器工作负载在 Kubernetes 集群中运行。虚拟机和 Kubernetes 集群之间的根本区别在于,它们为虚拟机工作负载和容器工作负载提供了隔离边界。如需了解详情,请参阅资源层次结构。

以下部分介绍了每种工作负载类型及其部署生命周期之间的差异。

基于虚拟机的工作负载

您可以创建虚拟机来托管基于虚拟机的工作负载。您有许多虚拟机形状和大小配置选项,可帮助您最好地满足基于虚拟机的工作负载要求。您必须在项目中创建虚拟机,该项目可以有许多虚拟机工作负载。虚拟机是项目的子资源。如需了解详情,请参阅虚拟机概览。

仅包含基于虚拟机的工作负载的项目不需要 Kubernetes 集群。因此,您无需为基于虚拟机的工作负载预配 Kubernetes 集群。

基于容器的工作负载

您可以将基于容器的工作负载部署到 Kubernetes 集群上的 Pod。Kubernetes 集群由以下节点类型组成:

  • 控制平面节点:运行管理服务,例如调度、etcd 和 API 服务器。

  • 工作器节点:运行 Pod 和容器应用。

Kubernetes 集群架构

Kubernetes 集群有两种配置类型:

  • 共享集群:组织级 Kubernetes 集群,可跨多个项目,不由单个项目管理,而是附加到这些项目。
  • 标准集群:项目范围的 Kubernetes 集群,用于管理项目中的集群资源,不能跨多个项目。

如需了解详情,请参阅 Kubernetes 集群配置。

Kubernetes 集群提供各种资源层次结构选项,因为共享集群属于组织级,而标准集群属于项目级。这是 Kubernetes 集群与虚拟机相比的一个根本区别。虚拟机是项目的子资源,无法配置为在项目外部运行。如需详细了解如何设计 Kubernetes 集群基础架构,请参阅设计 Kubernetes 集群的最佳实践。

对于 Kubernetes 集群内的 Pod 调度,GDC 采用调度、抢占和逐出等通用 Kubernetes 概念。在集群中调度 Pod 的最佳实践因工作负载的要求而异。

如需详细了解 Kubernetes 集群,请参阅 Kubernetes 集群概览。如需详细了解如何在 Kubernetes 集群中管理容器,请参阅 GDC 中的容器工作负载。

设计 Kubernetes 集群的最佳实践

本部分介绍了设计 Kubernetes 集群的最佳实践:

请考虑每种最佳实践,为容器工作负载生命周期设计弹性集群。

为每个软件开发环境创建单独的集群

除了为每个软件开发环境使用单独的项目之外,我们还建议您为每个软件开发环境设计单独的 Kubernetes 集群。软件开发环境是 GDC 领域内的一个区域,用于执行与指定生命周期阶段对应的所有操作。例如,如果您的组织中有三个名为 development、staging 和 production 的软件开发环境,则可以为每个环境创建一组单独的 Kubernetes 集群,并根据需要将项目附加到每个集群。

我们建议在限定于单个项目的测试生命周期中使用标准集群,以便将与测试相关的任何破坏性流程与生产项目隔离开来,而共享集群非常适合可跨多个项目的生产环境。托管跨多个项目的生产工作负载的共享集群提供了一个共享部署区域,其中限定于单个项目的标准集群可以直接将其工作负载提升到生产环境。

为每个软件开发环境定义的标准集群假定软件开发环境中的测试工作负载仅限于该集群。Kubernetes 集群可能会进一步细分为多个节点池,或使用污点进行工作负载隔离。

通过按软件开发环境分离 Kubernetes 集群,您可以隔离生产工作负载和非生产工作负载之间的资源消耗、访问权限政策、维护事件和集群级配置更改。

下图展示了一个示例 Kubernetes 集群设计,该设计适用于跨项目、集群、软件开发环境和不同节点池提供的机器类的多个工作负载。

跨多个软件开发环境的 GDC 集群配置。

此示例架构假定开发、预演和生产软件开发环境中的工作负载可以共享集群。每个环境都有一个单独的标准集群,这些集群会根据不同的机器类别要求进一步细分为多个节点池。共享集群涵盖所有软件开发环境,为所有环境提供一个通用部署区域。

或者,为每个软件开发环境设计多个标准集群对于容器操作非常有用,例如以下场景:

  • 您有一些工作负载固定到特定 Kubernetes 版本,因此您需要维护不同版本的不同集群。
  • 您有一些工作负载需要不同的集群配置(例如备份政策),因此您创建了多个具有不同配置的集群。
  • 您并行运行集群的副本,以促进破坏性版本升级或蓝绿部署策略。
  • 您构建了一个实验性工作负载,该工作负载可能会限制 API 服务器或集群中的其他单点故障,因此您需要将其与现有工作负载隔离开来。

您必须根据容器操作设置的要求调整软件开发环境。

创建更少的集群

为了高效利用资源,我们建议您设计最少数量的 Kubernetes 集群,以满足您对分离软件开发环境和容器操作的要求。每个额外的集群都会产生额外的开销资源消耗,例如需要额外的控制平面节点。因此,与许多小型集群相比,具有许多工作负载的大型集群可以更高效地利用底层计算资源。

当有多个具有类似配置的集群时,监控集群容量和规划跨集群依赖项会产生额外的维护开销。

如果集群容量即将耗尽,我们建议您向集群添加更多节点,而不是创建新集群。

在集群中创建更少的节点池

为了高效利用资源,我们建议在 Kubernetes 集群中设计数量较少、规模较大的节点池。

如果您需要调度的 Pod 需要与其他 Pod 不同的机器类,则配置多个节点池会非常有用。为工作负载所需的每个机器类别创建一个节点池,并将节点容量设置为自动扩缩,以便高效使用计算资源。

后续步骤