部署无状态 Linux 应用

本页面介绍如何使用 Google Kubernetes Engine (GKE) 部署无状态 Linux 应用。您还可以了解如何部署无状态 Windows 应用

概览

无状态应用是不将数据或应用状态存储到集群或永久性存储空间的应用。相反,该应用将数据和应用状态保留在客户端,从而使无状态应用更具可伸缩性。例如,前端应用是无状态应用:您可以部署多个副本以提高其可用性,在需求较低时可以减少副本,并且副本无需具有唯一标识。

Kubernetes 使用 Deployment 控制器将无状态应用部署为统一且非唯一的 Pod。Deployment 管理应用的所需状态:应运行应用的 Pod 数、应运行的容器映像版本、Pod 应标记的内容等等。通过更新 Deployment 的 Pod 规范可以动态地更改所需状态。

无状态应用与有状态应用相反,有状态应用使用永久性存储空间保存数据,并使用 StatefulSets 部署具有唯一标识的 Pod。

准备工作

在开始之前,请确保您已执行以下任务:

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Cloud SDK
  • 使用以下方法之一为您的项目设置默认 gcloud 命令行工具设置:
    • 使用 gcloud init(如果您想要在系统引导下完成项目默认设置)。
    • 使用 gcloud config(如果您想要单独设置项目 ID、可用区和区域。

    gcloud init

    1. 运行 gcloud init 并按照说明操作:

      gcloud init

      如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

      gcloud init --console-only
    2. 按照说明授权 gcloud 工具使用您的 Google Cloud 帐号。
    3. 创建新配置或选择现有配置。
    4. 选择 Google Cloud 项目。
    5. 选择默认的 Compute Engine 可用区
    6. 选择默认的 Compute Engine 区域

    gcloud config

    1. 设置默认项目 ID
      gcloud config set project PROJECT_ID
    2. 设置默认的 Compute Engine 区域(例如 us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. 设置默认的 Compute Engine 可用区(例如 us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud 更新到最新版本:
      gcloud components update

    通过设置默认位置,您可以避免 gcloud 工具中出现以下错误:One of [--zone, --region] must be supplied: Please specify location

  • 确保容器化应用存储在映像注册表(如 Container Registry)。

  • 如果您刚接触 GKE,则应完成快速入门教程,在其中启用 GKE API 并了解产品的工作原理。

剖析 Deployment

以下是简单的 Deployment 清单文件的示例。此 Deployment 会创建三个副本 Pod,它们被标记为 app=my-app 并且运行 Container Registry 中存储的 hello-app 映像:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-app
  template:
    metadata:
      labels:
        run: my-app
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

在此示例中:

  • .spec.replicas 是 Deployment 管理的副本 Pod 数。
  • .spec.template.metadata.labels 是为每个 Pod 提供的标签,Deployment 用它来管理 Pod。
  • .spec.template.specPod 规范,它定义了每个 Pod 的运行方式。spec.containers 包括要在每个 Pod 中运行的容器的名称以及应该运行的容器映像。

要想详细了解 Deployment 规范,请参阅 Deployment API 参考

创建 Deployment

您可以使用以下任一方法创建 Deployment:

  • 您可以使用 Google Cloud Console 的工作负载菜单中的“部署”功能,根据 Container Registry 中存储的容器映像创建简单的 Deployment
  • 您可以编写 Deployment 清单并运行 kubectl apply 以创建资源

kubectl apply

您可以使用 kubectl apply 以声明方式根据清单文件创建和更新 Deployment。此方法还可保留对活动资源所做的更新,但不会将更改合并回清单文件。

要根据 Deployment 清单文件创建 Deployment,请运行以下命令:

kubectl apply -f DEPLOYMENT_FILE

DEPLOYMENT_FILE 替换为清单文件,例如 config.yaml

您还可以使用 kubectl apply -f DIRECTORY/ 创建在目录中存储的清单文件中定义的所有对象(现有对象除外)。

控制台

要创建 Deployment,请执行以下步骤:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 点击 部署

  3. 修改容器下,选择以下选项之一:

    • 现有容器映像,以选择 Container Registry 中提供的容器映像。在映像路径中,输入容器映像和版本的路径。

    • 新建容器映像,以使用通过 Cloud Source RepositoriesCloud Build 创建的映像。

  4. 或者,使用以下内容配置 Deployment:

    • 要传递到容器中的环境变量
    • 用于在运行时自定义容器的入口点的初始命令
  5. 点击完成,然后点击继续

  6. 配置部分中,为您的 Deployment 提供一个应用名称,并指定要在其中部署该应用的 Kubernetes 命名空间

  7. (可选)在标签下,您可以将 Kubernetes 标签添加到 Deployment 中。

  8. 如需保存创建此 Deployment 的 YAML 以便稍后对其进行更新,请点击查看 YAML。将 YAML 复制并粘贴到文件中,然后保存该文件并点击 YAML 输出对话框中的关闭

  9. Kubernetes 集群下拉菜单中,选择所需集群。

  10. 点击部署

检查 Deployment

创建 Deployment 后,可以使用以下任一方法进行检查:

kubectl

要获取有关 Deployment 的详细信息,请运行以下命令:

kubectl describe deployment DEPLOYMENT_NAME

DEPLOYMENT_NAME 替换为该 Deployment 的名称。

要列出 Deployment 创建的 Pod,请运行以下命令:

kubectl get pods -l KEY=VALUE

在此命令中,-l 标志指示 kubectl 获取具有键值对标签的所有 Pod。例如,如果您为 Deployment 添加了 app: my-app 标签,则需要运行 kubectl get pods -l app=my-app 来查看带有此标签的 Pod。

要获取有关特定 Pod 的信息,请运行以下命令:

kubectl describe pod POD_NAME

要查看 Deployment 的清单,请运行以下命令:

kubectl get deployments DEPLOYMENT_NAME -o yaml

此命令以 YAML 格式显示 Deployment 的活动配置。

控制台

要检查 Deployment,请执行以下步骤:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 在工作负载列表中,点击您要检查的 Deployment 的名称。

  3. Deployment 详情页面上,执行以下任一操作:

    • 点击修订历史记录标签页以查看 Deployment 的修订历史记录。
    • 点击事件标签页,以查看与 Deployment 相关的所有事件。
    • 点击日志标签页以查看 Deployment 中的容器活动日志。
    • 点击 YAML 标签页以查看、复制和下载 Deployment 的 YAML 清单。

更新 Deployment

您可以将更新发布到 Deployment 的 Pod 规范,例如映像、资源使用情况/请求或配置。

您可以使用以下方法更新 Deployment:

  • 您可以使用 Cloud Console 工作负载菜单中的滚动更新菜单和 YAML 编辑器。
  • 您可以更改清单文件,并通过 kubectl apply 应用这些文件。
  • 您可以使用 kubectl set 更新 Pod 规范的 imageresourcesselector 字段。
  • 您可以使用 kubectl edit 直接从 shell 或首选编辑器更新 Deployment。

kubectl apply

您可以通过应用新的或更新的清单文件来更新 Deployment。 如果您要对 Deployment 进行多项更改,例如调节或指定应用的新版本,则此操作十分有用。

要更新 Deployment,请运行以下命令:

kubectl apply -f DEPLOYMENT_FILE

DEPLOYMENT_FILE 替换为更新后的清单文件。

kubectl apply 命令可将清单文件应用于资源。如果指定的资源不存在,则命令将创建该资源。

kubectl set

您可以使用 kubectl set 更改 Deployment 的映像、资源(请求或限制)或选择器字段。

要更改 Deployment 的映像,请运行以下命令:

kubectl set image deployment DEPLOYMENT_NAME IMAGE IMAGE:TAG

例如,如需将 Deployment 从 nginx 版本 1.7.9 更新为 1.9.1,请运行以下命令:

kubectl set image deployment nginx nginx=nginx:1.9.1

控制台

如需访问 Deployment 的滚动更新菜单,请执行以下操作:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 在工作负载列表中,点击您要修改的 Deployment 的名称。

  3. 点击 操作 > 滚动更新

  4. 为更新策略配置以下可选参数:

    • 最短就绪秒数:指定新创建的 Pod 准备就绪,被视为可用时所需的秒数下限。
    • 超额配置数量上限:指定可创建的超过所需 Pod 的 Pod 数量上限。值可以是绝对数或百分比。
    • 不可用数量上限:指定更新过程中可能不可用的 Pod 数量上限。值可以是绝对数或百分比。
  5. 容器映像下,输入更新后的容器映像的映像路径和版本。

  6. 点击更新

回滚更新

您可以使用 kubectl rollout undo 回滚更新。

您可以将正在进行或已完成的更新回滚到先前版本:

kubectl rollout undo deployment my-deployment

您还可以回滚到特定版本:

kubectl rollout undo deployment my-deployment --to-revision=3

扩缩 Deployment

您可以使用 Cloud Console 或 kubectl scale 手动扩缩 Deployment。

您可以详细了解如何自动扩缩 Deployment

kubectl

kubectl scale 可随时用于调节 Deployment。

要手动调节 Deployment,请运行以下命令:

kubectl scale deployment DEPLOYMENT_NAME --replicas NUMBER_OF_REPLICAS

NUMBER_OF_REPLICAS 替换为所需的副本 Pod 数。

控制台

要扩缩 Deployment,请执行以下步骤:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 在工作负载列表中,点击您要修改的 Deployment 的名称。

  3. 点击 操作 > 扩缩

  4. 输入 Deployment 的新副本数量。

  5. 点击调节

删除 Deployment

您可以使用 Cloud Console 或 kubectl delete 删除 Deployment。

kubectl

要删除 Deployment,请运行以下命令:

kubectl delete deployment DEPLOYMENT_NAME

控制台

要删除 Deployment,请执行以下步骤:

  1. 转到 Cloud Console 中的工作负载页面。

    转到“工作负载”

  2. 在工作负载列表中,选择一个或多个要删除的 Deployment。

  3. 点击 删除

  4. 当系统提示您确认时,点击删除

后续步骤