部署


本页面介绍 Kubernetes Deployment 对象及其在 Google Kubernetes Engine (GKE) 中的使用。

什么是 Deployment?

Deployment 表示不具有唯一标识的一组多个相同 Pod。Deployment 运行应用的多个副本,并自动替换任何失败或无响应的实例。通过这种方式,Deployment 可帮助确保应用的一个或多个实例可用于处理用户请求。Deployment 由 Kubernetes Deployment 控制器管理。

Deployment 使用 Pod 模板,此模板包含适用于其 Pod 的规范。Pod 规范确定每个 Pod 的外观:应在其容器内运行的应用、Pod 应装载的卷及其标签等。

Deployment 的 Pod 模板更改时,系统会自动创建新 Pod,每次创建一个。

使用模式

Deployment 非常适合使用在多个副本上挂载的 ReadOnlyMany 或 ReadWriteMany 卷的无状态应用,但不适合使用 ReadWriteOnce 卷的工作负载。如果是使用 ReadWriteOnce 卷的有状态应用,请使用 StatefulSet。StatefulSet 旨在用于部署有状态应用和将数据保存到永久性存储空间(例如 Compute Engine 永久性磁盘)的聚簇应用。StatefulSet 适合部署 Kafka、MySQL、Redis、ZooKeeper 以及其他需要唯一持久身份和稳定主机名的应用。

创建 Deployment

您可以使用 kubectl applykubectl create 命令创建 Deployment

创建之后,Deployment 即会确保所需数量的 Pod 正在运行并且始终可用。Deployment 会自动更换失败或从其节点中逐出的 Pod。

以下是 YAML 格式的 Deployment 清单文件示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

在此示例中:

  • 创建一个名为 nginx 的 Deployment,由 metadata: name 字段指示。
  • 该 Deployment 会创建三个副本 Pod,由 replicas 字段指示。
  • Pod 模板或 spec: template 字段指示其 Pod 标记为 app: nginx
  • Pod 模板的规范或 template: spec 字段指示 Pod 运行一个容器 nginx,该容器运行1.7.9 版的 nginx Docker Hub 映像。
  • Deployment 打开端口 80 以供 Pod 使用。

如需详细了解 Deployment 规范,请参阅 Kubernetes API 文档

总之,此 Pod 模板就此 Deployment 创建的 Pod 提供了以下说明:

  • 每个 Pod 标记为 app: nginx
  • 创建一个容器,并将其命名为 nginx
  • 运行 1.7.9 版的 nginx 映像。
  • 打开端口 80 以发送和接收流量。

要详细了解如何创建 Deployment,请参阅创建 Deployment

更新 Deployment

您可以通过更改 Deployment 的 Pod 模板规范来更新 Deployment。更改规范字段会自动触发更新发布。您可以使用 kubectl、Kubernetes API 或 Google Cloud 控制台中的“GKE 工作负载”菜单。

默认情况下,当 Deployment 触发更新时,Deployment 会停止 Pod,逐渐将 Pod 数量减少到零,然后排出并终止 Pod。然后,Deployment 使用经过更新的 Pod 模板来产生新的 Pod。

只有正在运行的新 Pod 达到足够数量时,才会删除旧 Pod,同时只有删除的旧 Pod 达到足够数量时,才会创建新 Pod。如需查看 Pod 生成和移除的顺序,您可以运行 kubectl describe deployments

Deployment 可以确保正在运行的副本数量至少比所需数量少一个,同时最多只有一个 Pod 不可用。同样,Deployment 可以确保正在运行的副本数量最多比所需数量多一个,正在运行的 Pod 数量最多比所需数量多一个。

您可以使用 kubectl rollout undo 命令回滚更新。您还可以使用 kubectl rollout pause 暂时停止部署。

管理 Deployment

以下列出的是 Deployment 的常见管理任务:

状态和生命周期

Deployment 在其生命周期中可以处于以下三种状态之一:处理中、已完成或失败。

“处理中”状态表示 Deployment 正在执行其任务,例如生成或扩缩其 Pod。

“已完成”状态表示 Deployment 已成功完成其任务,其所有 Pod 均以最新规范运行且可用,并且没有旧 Pod 仍在运行。

“失败”状态表示 Deployment 遇到一个或多个阻止其完成任务的问题。其中的原因包括配额或权限不足,映像拉取错误,限制范围或运行时错误。要调查导致 Deployment 失败的原因,您可以运行 kubectl get deployment [DEPLOYMENT+NAME] -o yaml 并检查 status: conditions 字段中的消息。

您可以使用 kubectl rollout status 命令监控 Deployment 的进度或检查其状态。

后续步骤