Files
kuboard-press/learning/k8s-intermediate/workload/wl-deployment/index.md
huanqing.shao 3701766b6c broken link
2019-09-29 14:44:59 +08:00

89 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 33
layout: LearningLayout
description: 本文介绍了 Kubernetes Deployment 的概念、行为及使用方法
---
# 介绍 Deployment
参考文档: Kubernetes 官网 [Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)、 [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)
术语表
| 英文 | 英文简称 | 中文 |
| ---------- | ---------- | ------ |
| Pod | Pod | 容器组 |
| Controller | Controller | 控制器 |
| ReplicaSet | ReplicaSet | 副本集 |
| Deployment | Deployment | 部署 |
## 背景知识
### Pod 容器组
Pod 容器组是 Kubernetes 中最小的调度单元,更多信息请参考 [容器组 - 概述](/learning/k8s-intermediate/workload/pod.html)
### ReplicaSet 副本集
ReplicaSet 副本集的用途是为指定的 Pod 维护一个副本(实例)数量稳定的集合。下面是一个定义 ReplicaSet 副本集的 yaml 文件:
``` yaml {8,9,12}
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
```
ReplicaSet 副本集的主要几个字段有:
* selector 确定哪些 Pod 属于该副本集
* replicas 副本集应该维护几个 Pod 副本(实例)
* template Pod 的定义
副本集将通过创建、删除 Pod 容器组来确保符合 selector 选择器的 Pod 数量等于 replicas 指定的数量。当符合 selector 选择器的 Pod 数量不够时,副本集通过使用 template 中的定义来创建 Pod。
在 Kubernetes 中,并不建议您直接使用 ReplicaSet推荐使用 Deployment由 Deployment 创建和管理 ReplicaSet。 关于副本集的更多信息,请参考 Kubernetes 官网文档 [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)
## Deployment 概述
Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod容器组和 ReplicaSet副本集
::: tip
声明的方式是相对于非声明方式而言的。例如,以滚动更新为例,假设有 3 个容器组,现需要将他们的容器镜像更新为新的版本。
* 非声明的方式,您需要手动逐步执行以下过程:
* 使用 kubectl 创建一个新版本镜像的容器组
* 使用 kubectl 观察新建容器组的状态
* 新建容器组的状态就绪以后,使用 kubectl 删除一个旧的容器组
* 重复执行上述过程,直到所有容器组都已经替换为新版本镜像的容器组
* 声明的方式,您只需要执行:
* 使用 kubectl 更新 Deployment 定义中 spec.template.spec.containers[].image 字段
> Deployment 实际执行滚动更新时的行为,本文后面有详细描述
:::
以“声明”的方式管理 Pod 和 ReplicaSet其本质是将一些特定场景的一系列运维步骤固化下来以便快速准确无误的执行。Deployment 为我们确定了如下几种运维场景:
* [创建Deployment](./create.html) 创建 Deployment 后Deployment 控制器将立刻创建一个 ReplicaSet 副本集,并由 ReplicaSet 创建所需要的 Pod。
* [更新Deployment](./update.html) 更新 Deployment 中 Pod 的定义(例如,发布新版本的容器镜像)。此时 Deployment 控制器将为该 Deployment 创建一个新的 ReplicaSet 副本集,并且逐步在新的副本集中创建 Pod在旧的副本集中删除 Pod以达到滚动更新的效果。
* [回滚Deployment](./rollback.html) 回滚到一个早期 Deployment 版本。
* [伸缩Deployment](./scale.html) 水平扩展 Deployment以便支持更大的负载或者水平收缩 Deployment以便节省服务器资源。
* [暂停和继续Deployment](./pause.html)
* [查看Deployment状态](./status.html)
* [清理策略](./cleanup.html)
* [金丝雀发布](./canary.html)