部署无状态应用

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

概览

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

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

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

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

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

    gcloud init

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

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

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project project-id
  • 如果您使用的是区域级集群,请设置默认计算区域
    gcloud config set compute/zone compute-zone
  • 如果您使用的是地区级集群,请设置默认计算地区
    gcloud config set compute/region compute-region
  • gcloud 更新到最新版本:
    gcloud components update
  • 确保容器化应用存储在映像注册表(如 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: gcr.io/google-samples/hello-app:1.0

其中:

  • spec: replicas: 是 Deployment 管理的副本 Pod 数。
  • spec: template: metadata: labels: 是为每个 Pod 提供的标签,Deployment 用它来管理 Pod。
  • spec: template: spec:Pod 规范,它定义了每个 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 中的 Google Kubernetes Engine“工作负载”菜单。

    访问“工作负载”菜单

  2. 点击部署

  3. 修改容器下,选择:

    • 现有容器映像,以选择 Container Registry 中提供的 Docker 映像。使用您要使用的容器映像及其版本填充容器映像

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

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

    • 要传递到容器中的环境变量
    • 用于在运行时自定义容器的入口点的初始命令
  5. 点击继续。您将看到出现配置屏幕。

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

  7. 如果您要向 Deployment 应用 Kubernetes 标签,请在标签下添加

  8. 如果您想要保存创建此 Deployment 的 YAML 以便稍后对其进行更新,请点击查看 YAML。将 YAML 复制并粘贴到文件中,然后保存该文件。

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

  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 中的 Google Kubernetes Engine“工作负载”菜单。

    访问“工作负载”菜单

  2. 要获取有关工作负载的详细信息,请从该菜单中选择所需的工作负载。

“工作负载”菜单提供多个菜单:

  • 要查看 Deployment 的活动配置,请点击 YAML
  • 要查看与 Deployment 相关的所有事件,请点击事件
  • 要查看 Deployment 的修订历史记录,请点击修订历史记录

更新 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 中的 Google Kubernetes Engine“工作负载”菜单。

    访问“工作负载”菜单

  2. 从该菜单中选择所需的工作负载。

  3. 点击操作,然后点击滚动更新

您可以对 Deployment 的更新策略进行以下更改:

  • 最短就绪秒数:指定新创建的 Pod 准备就绪,被视为可用时所需的秒数下限。
  • 超额配置数量上限:可选字段,指定可创建的超过所需 Pod 的 Pod 数量上限。值可以是绝对数或百分比。
  • 不可用数量上限:可选字段,指定更新过程中可能无法使用的 Pod 数量上限。值可以是绝对数或百分比。

    要修改现有容器,请执行以下操作:

    1. 滚动更新菜单中,选择容器以展开其菜单。
    2. 要更改容器名称,请修改容器名称字段。
    3. 要更改容器映像或版本,请修改映像名称字段。
    4. 点击完成以保存更改。
    5. 要删除容器,请点击回收站图标

    要添加新容器,请执行以下操作:

    1. 滚动更新菜单中,点击添加容器
    2. 映像名称字段中填充映像和版本,填充时采用以下格式 [IMAGE_NAME]:[IMAGE_VERSION]。例如 nginx:1.7.9
    3. (可选)在容器名称字段填充容器名称。
    4. 点击完成
  • 点击更新

要修改 Deployment 的活动配置,请执行以下步骤:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine“工作负载”菜单。

    访问“工作负载”菜单

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

  3. 点击修改

  4. 使用编辑器对该对象进行所需的更改。

  5. 点击保存

回滚更新

您可以使用 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 中的 Google Kubernetes Engine“工作负载”菜单。

    访问“工作负载”菜单

  2. 从菜单中选择所需的工作负载。

  3. 点击操作,然后点击调节

  4. 副本字段中,输入所需的副本数。

  5. 点击调节

删除 Deployment

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

kubectl

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

kubectl delete deployment [DEPLOYMENT_NAME]

控制台

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

  1. 访问 Cloud Console 中的 Google Kubernetes Engine“工作负载”菜单。

    访问“工作负载”菜单

  2. 从该菜单中选择所需的工作负载。

  3. 点击删除

  4. 从确认对话框菜单中,点击删除

后续步骤