一、Deployment的定位与优势¶
Deployment一般用于部署公司的无状态服务,因为企业内部都是以微服务为主,而企业内部现在都是以微服务为主,而微服务实现无状态化也是最佳实践,可以利用 Deployment的高级功能做到无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。
Deployment 是一种更高级别的 API 对象,用于更新其底层 ReplicaSet 及其 Pod。 如果你想要这种滚动更新功能,那么推荐使用 Deployment,因为它们是声明式的、服务端的,并且具有其它特性。
注意:Deployment的管理机制为通过 ReplicaSet 管理 Pod 副本
二、创建Deployment¶
2.1 Deployment部署过程¶
下面以创建名为nginx且副本数为3的Deployment文件为例,其部署过程图如下:

1.在master节点上定义一个yaml文件,其中kind为Deployment。使用kubectl创建一个Deployment文件,副本数为3 2.在执行kubectl create命令时,提交给api-server 3.api-server持久化实例 4.假设在Default命名空间创建Deployment文件,先创建RS,其命名规则为nginx-xxx 5.由RS在不同的工作节点上创建pod
2.2 创建一个Deployment¶
1.定义一个新的yaml文件
$ vim nginx-deploy.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: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
ports:
- containerPort: 80
上面参数说明:
- nginx-deployment:Deployment的名称
- replicas: 创建Pod的副本数
- selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应,apiVersion 为apps/v1必须指定该字段
2.创建Deployment
$ k create -f nginx-deploy.yaml
3.查看此 Deployment 的状态
$ k get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 106s
上面参数说明:
- NAME:集群中Deployment的名称;
- READY:Pod就绪个数和总副本数;
- UP-TO-DATE:显示已达到期望状态的被更新的副本数;
- AVAILABLE:显示用户可以使用的应用程序副本数,如果当前为0,说明目前还没有达到期 望的Pod;
- AGE:显示应用程序运行的时间
4.查看整个 Deployment 创建的状态
(1)打开一个窗口创建名为nginx-deployment的Deployment
$ k create -f nginx-deploy.yaml
(2)打开另一个窗口查看整个 Deployment 创建的状态
$ k rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out
注意:需要开两个窗口,一个窗口执行操作命令,另一个窗口执行k rollout status deployment查看整个 Deployment 创建的状态
5.查看每个 Pod 自动生成的标签
$ k get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
cluster-test-79b978867f-4x2lw 1/1 Running 64 (56m ago) 7d10h app=cluster-test,pod-template-hash=79b978867f
etcd 1/1 Running 2 (117m ago) 3d12h <none>
nginx-deployment-df755dd4-2j6m7 1/1 Running 0 6m49s app=nginx,pod-template-hash=df755dd4
nginx-deployment-df755dd4-86bcr 1/1 Running 0 6m49s app=nginx,pod-template-hash=df755dd4
nginx-deployment-df755dd4-kbvp9 1/1 Running 0 6m49s app=nginx,pod-template-hash=df755dd4
三、更新Deployment¶
3.1 Deployment更新过程¶

1.在master节点上定义一个yaml文件,其中kind为Deployment。使用kubectl更新一个Deployment文件 2.在执行kubectl set命令时,提交给api-server 3.api-server持久化实例 4.假设在Default命名空间创建的Deployment文件,会再创建一个新的RS,其命名规则为nginx-xxx2, 5.由新的RS在不同的工作节点上创建pod逐步替代旧RS创建的旧pod
3.2 更新一个Deployment¶
当且仅当 Deployment 的 Pod 模板(即.spec.template)更改时,才会触发 Deployment 更新,例如更改内存、CPU 配置或者容器的 image。其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。
按照以下步骤更新 Deployment:
1.更新 nginx Pod 以使用 nginx:1.16.1 镜像
(1)方法一:使用set命令进行更新
$ k set image deployment nginx-deployment nginx=nginx:1.16.1
deployment.apps/nginx-deployment image updated
(2)方法二:使用edit命令进行更新
$ k edit deployment nginx-deployment

2.使用 kubectl rollout status 查看更新过程,可以看出更新过程为新旧交替更新,首先新建一个 Pod,当 Pod 状态为 Running 时,删除一 个旧的 Pod,同时再创建一个新的 Pod。当触发一个更新后,会有新的 ReplicaSet 产生,旧的 ReplicaSet 会被保存,查看此时 ReplicaSet,可以从 AGE 或 READY 看出来新旧 ReplicaSet:
$ k get rs
NAME DESIRED CURRENT READY AGE
cluster-test-79b978867f 1 1 1 7d10h
nginx-deployment-df755dd4 3 3 3 49m
nginx-deployment-ff6655784 0 0 0 10m
3.通过 describe 查看 Deployment 的详细信息
$ k describe deployment nginx-deployment
