部署有状态应用

本页面介绍如何使用 Google Kubernetes Engine 部署有状态应用。

概览

有状态应用将数据保存到永久性磁盘存储空间,以供服务器、客户端和其他应用使用。有状态应用示例是供其他应用在其中保存并检索数据的数据库或键值对存储区。

永久性存储空间可按需动态预配,因此不需要提前手动创建底层卷。在 Kubernetes 中,通过创建 StorageClass 来配置动态预配。在 GKE 中,系统会安装默认的 StorageClass,因此您可以动态预配 Google Compute Engine 永久性磁盘。

Kubernetes 使用 StatefulSet 控制器将有状态应用部署为 StatefulSet 对象。StatefulSet 中的 Pod 不可互换:每个 Pod 具有唯一的标识符,无论安排在哪里,都会保留该标识符。

有状态应用与无状态应用相反,从一个会话切换到另一个会话时,无状态应用不会将客户端数据保存到服务器。

准备工作

请执行以下步骤为此任务做准备:

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Cloud SDK
  • 设置默认项目 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

如果您不熟悉 GKE,则应该完成快速入门以启用 GKE API 并了解产品的工作原理。

在 StatefulSet 中请求永久性存储空间

应用可以通过 PersistentVolumeClaim 对象请求永久性存储空间。

除了 Pod,用户通常还必须创建 PersistentVolumeClaim 对象。但是,StatefulSet 包含一个 volumeClaimTemplates 数组,该数组会自动生成 PersistentVolumeClaim 对象。每个 StatefulSet 副本都会获取自己的 PersistentVolumeClaim 对象。

创建 StatefulSet

您可以使用 kubectl apply 来创建 StatefulSet。

kubectl apply 使用清单文件在集群中创建、更新和删除资源。这是对象配置的声明方法。该方法可保留对活动对象的写入,但不会将更改合并回到对象配置文件中。

以下是由单独创建的 Service 所控制的 StatefulSet 的简单示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: [STATEFULSET_NAME]
spec:
  serviceName: [SERVICE_NAME]
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app=[APP_NAME]
    spec:
      containers:
      - name: [CONTAINER_NAME]
        image: ...
        ports:
        - containerPort: 80
          name: [PORT_NAME]
        volumeMounts:
        - name: [PVC_NAME]
          mountPath: ...
  volumeClaimTemplates:
  - metadata:
      name: [PVC_NAME]
      annotations:
        ...
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

其中:

  • [STATEFULSET_NAME] 是您为 StatefulSet 选择的名称
  • [SERVICE_NAME] 是您为 Service 选择的名称
  • [APP_NAME] 是您为 Pod 中运行的应用选择的名称
  • [CONTAINER_NAME] 是您为 Pod 中的容器选择的名称
  • [PORT_NAME] 是您为 StatefulSet 打开的端口选择的名称
  • [PVC_NAME] 是您为 PersistentVolumeClaim 选择的名称

在该文件中,kind 字段指定 StatefulSet 对象应该使用文件中定义的规范来创建。该示例 StatefulSet 生成三个副本 Pod,并打开端口 80 以向互联网公开 StatefulSet。

要创建 StatefulSet,请运行以下命令:

kubectl apply -f [STATEFULSET_FILE]

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

如需详细了解 kubectl apply,请参阅 kubectl 参考文档

检查 StatefulSet

kubectl

要检查 StatefulSet,请运行以下命令:

kubectl get statefulset [STATEFULSET_NAME] -o yaml

该命令以 YAML 格式显示 StatefulSet 的活动配置。

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

kubectl get pods -l app=[APP_NAME]

在该命令中,-l 标志指示 kubectl 获取为应用 [APP_NAME] 标记的所有 Pod。

输出的结果应类似于以下内容:

NAME                                READY     STATUS    RESTARTS   AGE
[POD_NAME]                                      1/1       Running   0          1m
[POD_NAME]                                      1/1       Running   0          1m

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

kubectl describe statefulset [STATEFULSET_NAME]

其中 [STATEFULSET_NAME] 是 StatefulSet 的名称。

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

kubectl describe pod [POD_NAME]

要列出已创建的 PersistentVolumeClaim,请使用以下命令:

kubectl get pvc

输出的结果应类似于以下内容:

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
[STATEFULSET_NAME]-[PVC_NAME]-0 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
[STATEFULSET_NAME]-[PVC_NAME]-1 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
[STATEFULSET_NAME]-[PVC_NAME]-2 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

要获取有关特定 PersistentVolumeClaim 的信息,请使用以下命令:

kubectl describe pvc [STATEFULSET_NAME]-[PVC_NAME]-0

要获取有关特定 PersistentVolume 的信息,请使用以下命令:

kubectl describe pv [PV_NAME]

Console

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

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

    访问“工作负载”菜单

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

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

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

更新 StatefulSet

您可以通过多种方式更新 StatefulSet。常见的声明方法是 kubectl apply。要直接从 shell 更新 StatefulSet 或者在首选编辑器中更新,您可以使用 kubectl edit。您还可以从 GCP Console 的 GKE“工作负载”菜单中使用 YAML 编辑器。

您可以发布对 StatefulSet 的 Pod 规范(如其映像、资源使用情况/请求或者配置)的更新。

kubectl apply

您可以通过应用新的或更新的清单文件来更新 StatefulSet。如果您要对 StatefulSet 进行各种更改,例如扩缩或者指定新版本的应用,则此操作十分有用。

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

kubectl apply -f [STATEFULSET_FILE]

其中 [STATEFULSET_FILE] 是更新的清单文件。

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

如需详细了解 kubectl apply,请参阅 kubectl 参考文档

Console

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

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

    访问“工作负载”菜单

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

  3. 点击修改

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

  5. 点击保存

检查更新发布

kubectl

要检查 StatefulSet 的发布,请运行以下命令:

kubectl rollout status statefulset [STATEFULSET_NAME]

要查看 StatefulSet 的发布历史记录,请使用以下命令:

kubectl rollout history statefulset [STATEFULSET_NAME]

要撤消发布,请使用以下命令:

kubectl rollout undo statefulset [STATEFULSET_NAME]

Console

要查看 StatefulSet 的修订历史记录,请执行以下步骤:

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

    访问“工作负载”菜单

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

  3. 点击修订历史记录

  4. 选择所需的修订版本。

更新策略

通过 StatefulSet 的 updateStrategy 字段,您可以为 StatefulSet 中 Pod 的容器、标签、资源请求/限制以及注释配置并停用自动滚动更新。

要了解 StatefulSet 更新策略,请参阅 Kubernetes 文档中的更新策略

扩缩 StatefulSet

kubectl

您可以随时使用 kubectl scale 扩缩 StatefulSet。

要手动扩缩 StatefulSet,请运行以下命令:

kubectl scale statefulset [STATEFULSET_NAME] --replicas [NUMBER_OF_REPLICAS]

其中 [NUMBER_OF_REPLICAS] 是所需的副本 Pod 数量。

Console

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

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

    访问“工作负载”菜单

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

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

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

  5. 点击扩缩

删除 StatefulSet

kubectl

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

kubectl delete statefulset [STATEFULSET_NAME]

Console

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

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

    访问“工作负载”菜单

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

  3. 点击删除

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 文档