Deployments又称部署控制器,它为Pod和ReplicaSet提供声明性更新,是ReplicaSet的高级使用方式。Deployment控制器会以可控的速率将ReplicaSet的实际状态更新到你所定义的状态。
使用案例
部署ReplicaSet副本集
更新Pod的状态
部署回滚
Pod伸缩(扩容和缩减)
暂停部署
清除旧的ReplicaSet副本集
创建Deployment
nginx.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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.7.9 ports: - containerPort: 80
1 [root@node1 ~]# kubectl apply -f nginx.yaml
1 2 3 [root@node1 ~]# kubectl get deployments #deployments可简写为deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 3 0 0 0 1s
NAME:部署名称。
DESIRED:显示应用程序所需的副本数。
CURRENT:显示当前正在运行的副本数。
UP-TO-DATE:显示已更新以实现所需状态的副本数。
AVAILABLE:显示用户可以使用的应用程序副本数量。
AGE:显示应用程序已运行的时间。
由上可知,当DESIRED、CURRENT、UP-TO-DATE、AVAILABLE这四个参数均相同时,Deployment部署状态才完全正常。
更新Deployment
1 2 [root@node1 ~]# kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 deployment.apps/nginx-deployment image updated
或者,你可以直接编辑Deployment生效(类似vim操作方式)
1 2 [root@node1 ~]# kubectl edit deployment nginx-deployment deployment.apps/nginx-deployment edited
1 2 [root@node1 ~]# kubectl rollout status deployment nginx-deployment Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
1 2 3 4 [root@node1 ~]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1564180365 3 3 3 6s nginx-deployment-2035384211 0 0 0 36s
1 2 3 4 5 [root@node1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-1564180365-khku8 1/1 Running 0 14s nginx-deployment-1564180365-nacti 1/1 Running 0 14s nginx-deployment-1564180365-z9gth 1/1 Running 0 14s
1 2 3 4 5 [root@node1 ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-75675f5897-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 nginx-deployment-75675f5897-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453 nginx-deployment-75675f5897-qqcnn 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453
当更新Deployment时,Deployment默认总是会保持最少25%的Pod数量可用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [root@node1 ~]# kubectl describe deployments Name: nginx-deployment Namespace: default CreationTimestamp: Thu, 30 Nov 2017 10:56:25 +0000 Labels: app=nginx Annotations: deployment.kubernetes.io/revision=2 Selector: app=nginx Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set nginx-deployment-2035384211 to 3 Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 1 Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 2 Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 2 Normal ScalingReplicaSet 19s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 1 Normal ScalingReplicaSet 19s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 3 Normal ScalingReplicaSet 14s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 0
通常的,Events显示的内容对我们在排查问题时很有用处。
注:不推荐更新Deployment中的标签selector,建议事先规划好selector;如果必须要更新,需要按按指定流程 谨慎操作。
回滚Deployment
某些情况下你可能想要回滚部署; 例如,当部署不稳定或崩溃时。 默认情况下,所有Deployment的部署历史记录(即修订历史)都保留在系统中,以便随时回滚(可以通过修改修订历史记录限制来更改,默认保留10条)。
注意:触发Deployment的部署时会创建Deployment的修订版。 这意味着当且仅当部署的Pod模板(.spec.template)发生更改时才会创建新修订,例如更新模板的标签或容器图像。 其他更新(例如扩展部署)不会创建部署版本,因此可以方便地同时进行手动或自动扩展。 这意味着当你回滚到早期版本时,仅回滚Deployment的Pod模板部分,不会变更你的副本数。
1 2 3 4 5 6 [root@node1 ~]# kubectl rollout history deployment nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml --record=true 2 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true 3 kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
查看指定版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@node1 ~]# kubectl rollout history deployment nginx-deployment --revision=2 deployments "nginx-deployment" revision 2 Labels: app=nginx pod-template-hash=1159050644 Annotations: kubernetes.io/change-cause=kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record=true Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP QoS Tier: cpu: BestEffort memory: BestEffort Environment Variables: <none> No volumes.
CHANGE-CAUSE是你的历史版本的备注信息,你可以使用如下命令来修改它
1 [root@node1 ~]# kubectl annotate deployment nginx-deployment change-cause="image updated to 1.9.1"
回滚到上一版本
1 2 [root@node1 ~]# kubectl rollout undo deployment nginx-deployment deployment.apps/nginx-deployment
回滚到指定版本
1 2 [root@node1 ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2 deployment.apps/nginx-deployment
伸缩Deployment
1 2 [root@node1 ~]# kubectl scale deployment nginx-deployment --replicas=10 deployment.apps/nginx-deployment scaled
最小10个,最大15个副本,根据CPU使用率(80%上限)来自动判断。关于自动伸缩,参见 。
1 2 [root@node1 ~]# kubectl autoscale deployment ginx-deployment --min=10 --max=15 --cpu-percent=80 deployment.apps/nginx-deployment scaled
暂停和继续Deployment
当你部署实施还未完成时,如果想要中途更新配置,你可以使用Deployment暂停和继续的操作。
暂停部署(假设nginx-deployment部署正在进行中,还未完成)
1 2 [root@node1 ~]# kubectl rollout pause deployment nginx-deployment deployment.apps/nginx-deployment paused
1 2 3 4 [root@node1 ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 deployment.apps/nginx-deployment image updated [root@node1 ~]# kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi deployment.apps/nginx-deployment resource requirements updated
此时,还未生成新的修订版。
1 2 [root@node1 ~]# kubectl rollout resume deployment nginx-deployment deployment.apps/nginx-deployment resumed