工作负载部署概览


如需在 Google Kubernetes Engine (GKE) 集群上部署和管理容器化应用和其他工作负载,您可以使用 Kubernetes 系统创建 Kubernetes 控制器对象。这些控制器对象代表集群上运行的应用、守护程序和批量作业。

您可以使用 Kubernetes API 或使用 kubectl(通过 gcloud 安装的 Kubernetes 命令行界面)创建这些控制器对象。一般将所需 Kubernetes 控制器对象的表示法构建为 YAML 配置文件,然后将该文件用于 Kubernetes API 或 kubectl 命令行界面。

工作负载类型

Kubernetes 提供了不同类型的控制器对象,它们对应您可以运行的不同类型的工作负载。某些控制器对象更适合表示特定类型的工作负载。以下部分说明了一些常见类型的工作负载以及您可以创建用于在集群上运行这些工作负载的 Kubernetes 控制器对象,包括以下各项:

  • 无状态应用
  • 有状态应用
  • 批处理作业
  • 守护程序

无状态应用

无状态应用不会保留其状态并且不会将数据保存到永久性存储空间,所有用户和会话数据都保留在客户端。

无状态应用的部分示例包括 Web 前端(例如 Nginx)、Web 服务器(例如 Apache Tomcat)及其他 Web 应用。

您可以创建 Kubernetes Deployment,以在集群上部署无状态应用。Deployment 创建的 pod 并不是唯一的,也不会保留它们的状态,因此可以简化无状态应用的扩缩和更新过程。

有状态应用

有状态应用要求保存或永久保存其状态。有状态应用使用永久性存储空间(例如永久性卷)保存数据,以供服务器或其他用户使用。

有状态应用的示例包括数据库(例如 MongoDB)和消息队列(例如 Apache ZooKeeper)。

您可以创建 Kubernetes StatefulSet,以部署有状态应用。StatefulSet 创建的 Pod 具有唯一标识符,可以安全有序地进行更新。

批处理作业

批处理作业代表有限、独立且通常并行的任务,这些任务将一直运行到终结。批处理作业的部分示例包括自动或计划的任务,例如发送电子邮件、渲染视频以及执行昂贵的计算。

您可以创建 Kubernetes Job,以在集群上执行和管理批处理任务。您可以指定在 Job 完成之前应完成任务的 Pod 数,以及应并行运行的最大 Pod 数。

守护程序

守护程序在分配的节点中持续执行后台任务,而无需用户干预。守护进程示例包括像 Fluentd 之类的日志收集器和监控服务。

您可以创建 Kubernetes DaemonSet,以在集群上部署守护进程。DaemonSet 在每个节点创建一个 Pod,您可以选择 DaemonSet 应部署的一个特定节点。

GKE Autopilot 上的 DaemonSet

GKE 会管理您使用 Autopilot 操作模式创建的集群中的节点。您无法手动添加、移除或修改节点或底层 Compute Engine 虚拟机 (VM)。但是,Kubernetes 节点对象仍然可见,并且 Autopilot 支持 DaemonSet 作为您的工作负载。

GKE Autopilot 限制了一些影响所有工作负载 Pod(包括由 DaemonSet 管理的 Pod)的管理功能。除非 GKE 明确允许,否则使用提升权限(例如 privileged 安全上下文)在节点上执行管理功能的 DaemonSet 将无法在 Autopilot 集群上运行。

如需详细了解 Autopilot 强制执行的限制,请参阅工作负载局限和限制。您可以使用工作负载符合 Autopilot 设定的限制的 DaemonSet 以及来自某些 Google Cloud 合作伙伴的 DaemonSet。

针对 Autopilot 上的 DaemonSet 的最佳做法

GKE 使用已部署的工作负载的总大小来确定 Autopilot 为集群预配的节点大小。如果您在 Autopilot 预配节点后添加 DaemonSet 或调整其大小,GKE 不会调整现有节点的大小来适应新的总工作负载大小。考虑系统 Pod 后,资源请求大于现有节点可分配的容量的 DaemonSet 也不会被调度到这些节点上。

从 GKE 版本 1.27.6-gke.1248000 开始,Autopilot 模式下的集群会检测不适合所有 DaemonSet 的节点,并逐渐将工作负载迁移到适合所有 DaemonSet 的较大节点。此过程需要一些时间,尤其是节点运行系统 Pod 时,此情况需要额外的时间来正常终止,以避免中断核心集群功能。

在 GKE 1.27.5-gke.200 或更早版本中,我们建议封锁排空无法容纳 DaemonSet Pod 的节点。

对于所有 GKE 版本,在 Autopilot 上部署 DaemonSet 时,我们推荐以下最佳实践:

  • 在部署任何其他工作负载之前部署 DaemonSet。
  • 在 DaemonSet 上设置比常规 Pod 更高的 PriorityClass。更高的 PriorityClass 允许 GKE 逐出更低优先级的 pod 来容纳 DaemonSet pod,前提是节点可容纳这些 pod。这有助于确保每个节点上都存在 DaemonSet,而不会触发节点重新创建。

管理工作负载对象

您可以使用命令式和声明式方法创建、管理和删除对象。以下各部分介绍了这些方法以及可用于运用这些方法的如下工具:

命令式命令

利用命令式命令,您可以使用 kubectl 快速创建、查看、更新和删除对象。这些命令可用于执行一次性任务或更改集群中的活跃对象。命令式命令通常用于处理集群上已部署的活动对象。

kubectl 具有几个动词驱动型命令,可用于创建和修改 Kubernetes 对象。例如:

  • run:在集群中生成一个新对象。除非另外指定,否则 run 仅创建 Deployment 对象。
  • expose:创建一个新的 Service 对象,用于在一组添加了标签的 Pod 之间实现流量负载均衡。
  • autoscale:创建一个新的 Autoscaler 对象,用于自动横向扩缩控制器对象(例如 Deployment)。

命令式命令不需要您深入理解对象架构,也不需要配置文件。

命令式对象配置

命令式对象配置使用包含完全定义的对象定义的配置文件创建、更新和删除对象。您可以将对象配置文件存储在源控制系统中,比起使用命令式命令,审核更改会更轻松。

您可以使用配置文件或包含配置文件的目录运行 kubectl applydeletereplace 操作。

声明式对象配置

声明式对象配置会处理本地存储的配置文件,但不要求明确定义要执行的操作,而是通过 kubectl 自动检测每个对象的操作。如果使用的是具有多个不同操作的配置文件目录,则它将非常有用。声明式对象管理需要您深入了解对象架构和配置文件。

您可以运行 kubectl apply,以声明方式创建和更新对象。apply 可读取整个活动对象、计算差异,然后通过向 API 服务器发送修补请求来合并这些差异,以更新对象。

公共 Docker Hub 映像

从 Docker Hub 部署公共容器映像时,GKE 会自动检查缓存代理 mirror.gcr.io 中是否存在该容器映像的缓存副本。如果缓存副本不可用,GKE 会从 Docker Hub 拉取您请求的映像,缓存代理可能会缓存该映像以供将来使用。如需了解详情,请参阅拉取缓存的映像

控制台

使用 kubectl 或 API 部署工作负载后,您可以使用 Google Cloud 控制台中的 GKE 工作负载菜单检查、管理和修改集群上运行的工作负载。

该菜单具有以下功能:

  • 您可以使用基于 YAML 的文本编辑器从网页浏览器修改活动对象
  • 您可以查看有关对象的详细信息,包括修订历史记录、最近的事件和活动,以及它代管的 Pod
  • 您可以轻松扩缩 Deployment、Job 和 StatefulSet
  • 您可以自动调节、触发滚动更新,并从操作菜单中手动调节 Deployment。
  • 您可以使用 Cloud Shell 检查、修改并删除任何对象。

API

您可以使用 GKE REST APIKubernetes API 以及 Google Cloud 客户端库以程序化方式创建和管理工作负载。

配置文件

使用前面描述的任何方法部署工作负载时,GKE 都会向您的集群添加一个表示该对象的配置文件。

对象的活动配置可能与其本地文件有所差异YAML 最常用于创建和表示 Kubernetes 对象。此外,您也可以使用 JSON

如需详细了解 Kubernetes 对象规范、状态和 Kubernetes API,请参阅了解 Kubernetes 对象Kubernetes API 参考文档

检查活动配置

控制台

如需检查已部署对象的活动配置,请执行以下步骤:

  1. 转到 Google Cloud 控制台中的工作负载页面。

    转到“工作负载”

  2. 选择所需的工作负载。

  3. 点击 YAML

gcloud

如需检查已部署对象的活动配置,请运行以下命令:

kubectl get [OBJECT_TYPE] [OBJECT_NAME] -o yaml

[OBJECT_TYPE] 可能是 deploymentstatefulsetjob 或其他对象类型。例如:

kubectl get deployment my-stateless-app -o yaml

使用配额管理资源用量

如果许多用户或团队共享集群中的资源,可能会出现部分用户或团队的用量超出其应有份额的问题。您可以使用 Kubernetes ResourceQuota 对象来限制特定命名空间内的资源消耗量。

GKE 还会向具有 100 个或更少节点的集群上的命名空间应用默认的不可变 gke-resource-quotas 对象,以避免不稳定性。

使用 GitLab 部署到 GKE

如果您使用 GitLab 进行持续集成,则可以使用 GitLab GKE 组件将工作负载部署到 GKE 集群。

您还可以尝试端到端教程,了解如何将 GitLab 与 Google Cloud 搭配使用。

如需了解详情,请参阅 GitLab on Google Cloud 概览

后续步骤