Deployments又称部署控制器,它为Pod和ReplicaSet提供声明性更新,是ReplicaSet的高级使用方式。Deployment控制器会以可控的速率将ReplicaSet的实际状态更新到你所定义的状态。

使用案例

    1. 部署ReplicaSet副本集
    1. 更新Pod的状态
    1. 部署回滚
    1. Pod伸缩(扩容和缩减)
    1. 暂停部署
    1. 清除旧的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 # 指定Deployment类型
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 指定副本数
selector:
matchLabels: # 定义匹配Pod的标签,若有多个标签必须全匹配
app: nginx
template: # Pod部署的模板
metadata:
labels:
app: nginx # Pod的标签
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

  • 更新nginx镜像
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
  • –record:保存更改

或者,你可以直接编辑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...
  • 查看ReplicaSet状态
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
  • 查看Pod状态
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
  • 查看pod标签
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数量可用。

  • 获取Deployment详细信息
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

此时,还未生成新的修订版。

  • 继续Deployment
1
2
[root@node1 ~]# kubectl rollout resume deployment nginx-deployment
deployment.apps/nginx-deployment resumed