本节,我们通过一些简单的例子来演示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.