本页面介绍 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 apply
或 kubectl 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 的进度或检查其状态。