> For the complete documentation index, see [llms.txt](https://renhongcai.gitbook.io/kubernetes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://renhongcai.gitbook.io/kubernetes/di-san-zhang-gong-zuo-fu-zai-guan-li/3.4-deployment/4.2-deployment_quickstart.md).

# 3.4.2 Deployment初体验

本节，我们通过一些简单的例子来演示`Deployment`的创建、查看、更新、删除等操作，以期快速地掌握`Deployment`的用法。

## 创建

首先我们先将以下配置保存到名为`deployment.yaml`的文件中。

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.0
```

该份配置将创建一个名为`nginx-deployment`的`Deployment`资源对象，根据`spec.replicas`中的信息可知，它期望有3个Pod副本。

接下来使用`kubectl create`命令将该配置提交给`kube-apiserver`，如下所示：

```
[root@ecs-d8b6 manifests]# kubectl create -f deployment.yaml 
deployment.apps/nginx-deployment created
```

根据命令行输出内容可知，名为`nginx-deployment`的`Deployment`已创建完成。

## 查看

当创建一个`Deployment`资源对象时，`Deployment`控制器不会直接创建Pod，而是通过创建`ReplicaSet`来间接创建Pod。

### 查看Deployment

查看新创建的`Deployment`资源：

```
[root@ecs-d8b6 manifests]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           90s
```

命令行输出中各字段含义如下：

* NAME：`Deployment`资源名称，同配置中的`metadata.name`；
* READY：<已处于Reday状态的Pod数量>/<期望的Pod数量>；
* UP-TO-DATE：处于最新状态的Pod数量；
* AVAILABLE：可用的Pod数量；
* AGE：应用运行时间，也是资源自创建至今经过的时间。

此处`READY`和`AVAILABLE`有一些细微的区别，当`Pod`中指定的容器全部运行起来后，就可以认定该`Pod`为`READY`，所以`READY`含义更倾向于`Running`，而`AVAILABLE`要求会更严格一些，只有当`Pod`处于`READY`状态且持续一段时间后才可被认定为`AVAILABLE`，其含义更倾向于`可用`的数量。

`UP-TO-DATE`表示运行最新配置的Pod数量，当修改`Deployment`配置中Pod模版时，新版的Pod会被创建且短期内会与旧版的Pod并存，`UP-TO-DATE`正是表示已创建的新版Pod数量。

### 查看ReplicaSet

接着查看ReplicaSet：

```
[root@ecs-d8b6 manifests]# kubectl get replicaset
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-6fd78f555b   3         3         3       104s
```

由`Deployment`创建的`ReplicaSet`名称由`Deployment`的名称和一个随机字符串组成。

### 查看Pod

接着查看最终生成的Pod：

```
[root@ecs-d8b6 manifests]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6fd78f555b-clf9w   1/1     Running   0          110s
nginx-deployment-6fd78f555b-vlvp6   1/1     Running   0          110s
nginx-deployment-6fd78f555b-wjslg   1/1     Running   0          110s
```

这些Pod都是由`ReplicaSet`自动创建出来的，其名称由`ReplicaSet`名称和一个随机字符串组成。

## 更新

由于`Deployment`控制器通过`ReplicaSet`来创建并管理Pod，当修改`Deployment`配置中的`spec.replicas`时，`Deployment`控制器相应地也会修改`Replicaset`中`spec.replicas`值，最终由`Replicaset`控制器来调整Pod的副本数，该部分功能我们已经在介绍`ReplicaSet`时演示过，此处不再演示。

我们在此演示一种`Deployment`相较于`ReplicaSet`更高阶的功能，即应用版本的升降级。当前应用使用的nginx镜像版本为`1.19.0`，我们希望把该版本降为`1.18.0`。

通过以下命令，将`spec.template.spec.containers.image`值由`nginx:1.19.0`改为`nginx:1.18.0`:

```
[root@ecs-d8b6 manifests]# kubectl edit deployments nginx-deployment
```

然后再次查看`Deployment`、`ReplicaSet`和`Pod`：

```
[root@ecs-d8b6 manifests]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           33m
[root@ecs-d8b6 manifests]# kubectl get replicaset 
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-6fd78f555b   0         0         0       33m
nginx-deployment-7df9bc6ff5   3         3         3       32s
[root@ecs-d8b6 manifests]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7df9bc6ff5-4rz8l   1/1     Running   0          40s
nginx-deployment-7df9bc6ff5-tmxwl   1/1     Running   0          44s
nginx-deployment-7df9bc6ff5-vmdzp   1/1     Running   0          42s
```

可以看到，之前的`ReplicaSet`（nginx-deployment-6fd78f555b）副本数已被修改为0，新的`ReplicaSet`（nginx-deployment-7df9bc6ff5）被创建了出来，进而创建了新的Pod。新的Pod中运行的容器镜像版本就是我们修改后的容器镜像版本，读者可以自行验证。

## 删除

当删除`Deployment`资源时，由`Deployment`控制器创建的`ReplicaSet`也会被删除，因此由`ReplicaSet`创建的Pod也会被删除。

```
[root@ecs-d8b6 manifests]# kubectl delete deployment nginx-deployment 
deployment.apps "nginx-deployment" deleted
[root@ecs-d8b6 manifests]# kubectl get replicaset
No resources found in default namespace.
[root@ecs-d8b6 manifests]# kubectl get pods
No resources found in default namespace.
```
