

名词解析
Deployment(ds)为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。简单的说就是升级版的ReplicationController,包含rc的所有功能,并加了很多牛逼的功能。
典型的应用场景包括:
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
简单定义
apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80
命令行创建一个deploy
[root@master-01 ~]# kubectl run ngi --image=nginxdeployment.apps/ngi created
Replica Set的名字总是<Deployment的名字>-<pod template的hash值。
Replica Set将保证总是有N个的pod存在。
[root@master-01 ~]# kubectl get rsNAME DESIRED CURRENT READY AGEngi-76db489f79 1 1 1 34s[root@master-01 ~]# kubectl get deployNAME READY UP-TO-DATE AVAILABLE AGEngi 1/1 1 1 74s
如果创建的时候不指定副本数,默认将为1
更新deploy(滚动更新)
这种模式会等新的pod准备完成,才会删除旧的pod,默认它会确保至少有比期望的Pod数量少一个的Pod是up状态(最多一个不可用)。保障服务不间断更新。
[root@master-01 ~]# kubectl set image deploy ngi ngi=bitnami/nginxdeployment.extensions/ngi image updated
查看更新状态
[root@master-01 ~]# kubectl rollout status deploy ngideployment "ngi" successfully rolled out[root@master-01 ~]# kubectl get deploy ngi -o yaml。。。- image: bitnami/nginx。。。
可以看到镜像被替换了。
查看升级策略
[root@master-01 ~]#kubectl edit deployment ngi...strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%...
弹性伸缩
加上–record参数可以在注解中记录历史命令
[root@master-01 ~]# kubectl scale deploy ngi --replicas=2 --recorddeployment.extensions/ngi scaled
可以看到副本数变为2了
[root@master-01 ~]# kubectl get po|grep ngingi-585d46b946-c546l 1/1 Running 0 17mngi-585d46b946-hrdnl 1/1 Running 0 4m12s
autoscale自动伸缩
如果启用了horizontal pod autoscaling,就可以给Deployment设置一个autoscaler,基于当前Pod的CPU利用率选择最少和最多的Pod数。
[root@master-01 ~]# kubectl autoscale deploy ngi --min=10 --max=15 --cpu-percent=80deployment "ngi" autoscaled
查看记录
[root@master-01 ~]# kubectl rollout history deploy ngideployment.extensions/ngiREVISION CHANGE-CAUSE1 <none> 因为之前run nginx没开启record没有记录命令2 kubectl scale deploy ngi --replicas=2 --record=true查看单个revision详细信息[root@master-01 ~]# kubectl rollout history deploy ngi --revision=2deployment.extensions/ngi with revision #2Pod Template:Labels: pod-template-hash=585d46b946run=ngiAnnotations: kubernetes.io/change-cause: kubectl scale deploy ngi --replicas=2 --record=trueContainers:ngi:Image: bitnami/nginxPort: <none>Host Port: <none>Environment: <none>Mounts: <none>Volumes: <none>
修改资源配额
[root@master-01 ~]# kubectl set resources deploy ngi -c=ngi --limits=cpu=100m,memory=300mdeployment.extensions/ngi resource requirements updated
查看详情
可以看到资源信息已经更改了。
[root@master-01 ~]# kubectl rollout history deploy ngi --revision=3deployment.extensions/ngi with revision #4Pod Template:Labels: pod-template-hash=5d78f7f8c4run=ngiAnnotations: kubernetes.io/change-cause: kubectl scale deploy ngi --replicas=2 --record=trueContainers:ngi:Image: bitnami/nginxPort: <none>Host Port: <none>Limits:cpu: 100mmemory: 200mEnvironment: <none>Mounts: <none>Volumes: <none>
回退版本
不指定 --to-revision就是回退到上一个版本,反之就是回退到指定版本
[root@master-01 ~]# kubectl rollout undo deploy ngi --to-revision=2deployment.extensions/ngi rolled back# 查看状态[root@master-01 ~]# kubectl get poNAME READY STATUS RESTARTS AGEngi-585d46b946-c546l 1/1 Running 0 83m
暂停和恢复Deployment
可以一次或多次更新前暂停一个Deployment,然后再恢复它。这样就能多次暂停和恢复Deployment,在此期间进行一些修复工作,而不会出发不必要的rollout。
例如使用刚刚创建Deployment:
[root@master-01 ~]# kubectl get deployNAME READY UP-TO-DATE AVAILABLE AGEngi 1/1 1 1 103m[root@master-01 ~]# kubectl get rsNAME DESIRED CURRENT READY AGEngi-585d46b946 1 1 1 91m
暂停Deploy
[root@master-01 ~]# kubectl rollout pause deploy ngideployment.extensions/ngi paused
更新镜像地址
[root@master-01 ~]# kubectl set image deploy ngi ngi=nginx:1.13.1deployment.extensions/ngi image updated
扩容实例数
[root@master-01 ~]# kubectl scale deploy ngi --replicas=2deployment.extensions/ngi scaled
更新资源配额
[root@master-01 ~]# kubectl set resources deploy ngi -c=ngi --limits=cpu=200m,memory=512Mideployment.extensions/ngi resource requirements updated
只要这个Deploy是暂停的,就可以进行多次更新,不会影响目前正在运行的Deploy
恢复Deploy
[root@master-01 ~]# kubectl rollout resume deploy ngideployment.extensions/ngi resumed
查看更新后的deploy
[root@master-01 ~]# kubectl describe deploy ngiName: ngiNamespace: defaultCreationTimestamp: Sun, 24 Mar 2019 10:39:05 +0800Labels: run=ngiAnnotations: deployment.kubernetes.io/revision: 9kubernetes.io/change-cause: kubectl scale deploy ngi --replicas=2 --record=trueSelector: run=ngiReplicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailableStrategyType: RollingUpdate 滚动更新MinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surgePod Template:Labels: run=ngiContainers:ngi:Image: nginx:1.13.1 镜像更新了Port: <none>Host Port: <none>Limits:cpu: 200mmemory: 512Mi 资源更新了Environment: <none>Mounts: <none>Volumes: <none>Conditions:Type Status Reason---- ------ ------Available True MinimumReplicasAvailableProgressing True NewReplicaSetAvailableOldReplicaSets: <none>NewReplicaSet: ngi-74544db97c (2/2 replicas created) 实例数更新了Events:Type Reason Age From Message...
查看pod
[root@master-01 ~]# kubectl get rsNAME DESIRED CURRENT READY AGEngi-6b4b797b76 0 0 0 59mngi-74544db97c 2 2 2 10m[root@master-01 ~]# kubectl get poNAME READY STATUS RESTARTS AGEngi-74544db97c-qz5sn 1/1 Running 0 9m49sngi-74544db97c-v9qkz 1/1 Running 0 11m
注意: 在恢复 Deployment 之前您无法回退一个已经暂停的 Deployment。
如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!





