ReplicaSet如果要实现滚动更新和蓝绿部署需要手工进行实现,所以这种类型的控制器并非是我们生产中所需要的,而更加高级的控制器称之为Deployment。

Deployment的工作过程和使用ReplicaSet手动实现蓝绿部署和滚动部署相似,Deployment会间接的使用1到多个ReplicaSet来管理Pod。

Deployment工作流程

Deployment在更新Pod时会创建一个新的RS,由新的RS以新的pod模板创建出pod,然后逐渐将Pod切换到新版本上去。Deployment每一次更新都会创建出一个新的RS,其更新历史中默认允许保存10个RS。如果Deployment需要回滚时可以向前回滚9个版本。

需要注意的是虽然Deployment会保留历史RS,但是在历史中RS的pod为0,只有最新的RS其下的pod数为用户所定义的值。当回滚时才会将其pod副本的数量定义为用户所指定的值。

Deployment资源定义规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: apps/v1  # API群组及版本
kind: Deployment # 资源类型特有标识
metadata:
name <string> # 资源名称,在作用域中要唯一
namespace <string> # 名称空间;Deployment隶属名称空间级别
spec:
minReadySeconds <integer> # Pod就绪后多少秒内任一容器无crash方可视为“就绪”
replicas <integer> # 期望的Pod副本数,默认为1
selector <object> # 标签选择器,必须匹配template字段中Pod模板中的标签
template <object> # Pod模板对象
revisionHistoryLimit <integer> # 滚动更新历史记录数量,默认为10
strategy <Object> # 滚动更新策略
type <string> # 滚动更新类型,可用值有Recreate和RollingUpdate;
rollingUpdate <Object> # 滚动更新参数,专用于RollingUpdate类型
maxSurge <string> # 更新期间可比期望的Pod数量多出的数量或比例;
maxUnavailable <string> # 更新期间可比期望的Pod数量缺少的数量或比例,10,
progressDeadlineSeconds <integer> # 滚动更新故障超时时长,默认为600秒
paused <boolean> # 是否暂停部署过程

Deployment示例

1.编写资源配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@k8s-master01:~/yaml/chapter08# vim deployment-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo
spec:
replicas: 4
selector:
matchLabels:
app: demoapp
release: stable
template:
metadata:
labels:
app: demoapp
release: stable
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:${VERSION}
ports:
- containerPort: 80
name: http

2.应用配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@k8s-master01:~/yaml/chapter08# VERSION=v1.0 envsubst < deployment-demo.yaml | kubectl apply -f -
deployment.apps/deployment created

# 查看deployment信息
root@k8s-master01:~/yaml/chapter08# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-demo 4/4 4 4 12s

# 查看pod信息
root@k8s-master01:~/yaml/chapter08# kubectl get pods -l 'app=demoapp,release=stable'
NAME READY STATUS RESTARTS AGE
deployment-demo-fb544c5d8-2687q 1/1 Running 0 2m16s
deployment-demo-fb544c5d8-2t6q4 1/1 Running 0 2m16s
deployment-demo-fb544c5d8-pkgzn 1/1 Running 0 2m16s
deployment-demo-fb544c5d8-w52qp 1/1 Running 0 2m16s
# 可以看到第一段为deployment名字,最后一段为随机值,中间的fb544c5d8为replicaset中Pod模板的哈希值,也就是template字段的哈希值

# 查看replicaset信息
root@k8s-master01:~/yaml/chapter08# kubectl get replicasets.apps
NAME DESIRED CURRENT READY AGE
deployment-demo-fb544c5d8 4 4 4 4m5s

# 一旦pod模板发生变更,会导致ReplicaSet的哈希值发生变化,然后出发deployment更新的

3.查看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
root@k8s-master01:~/yaml/chapter08# kubectl describe deployments.apps deployment-demo
Name: deployment-demo
Namespace: default
CreationTimestamp: Wed, 21 Jul 2021 13:23:13 +0000
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=demoapp,release=stable
Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType: RollingUpdate # 一旦模板发生变化将触发滚动跟新
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge # 滚动更新逻辑
Pod Template:
Labels: app=demoapp
release=stable
Containers:
demoapp:
Image: ikubernetes/demoapp:v1.0
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: deployment-demo-fb544c5d8 (4/4 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set deployment-demo-fb544c5d8 to 4

更新

1.对deployment实行滚动更新

1
2
root@k8s-master01:~/yaml/chapter08# VERSION=v1.1 envsubst < deployment-demo.yaml | kubectl apply -f -
deployment.apps/deployment-demo configured

2.使用rollout查看滚动更新的状态

1
2
root@k8s-master01:~# kubectl rollout status deployment deployment-demo
deployment "deployment-demo" successfully rolled out

3.查看pod是否更新为v1.1版本

1
2
3
4
5
6
7
8
9
10
root@k8s-master01:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-demo-867c7d9d55-4r5hw 1/1 Running 0 11m 10.244.2.30 k8s-node02 <none> <none>
deployment-demo-867c7d9d55-b4trp 1/1 Running 0 11m 10.244.3.33 k8s-node03 <none> <none>
deployment-demo-867c7d9d55-qrh8c 1/1 Running 0 11m 10.244.2.31 k8s-node02 <none> <none>
deployment-demo-867c7d9d55-qxjnq 1/1 Running 0 11m 10.244.3.34 k8s-node03 <none> <none>

# 对pod进行访问
root@k8s-master01:~# curl 10.244.3.33
iKubernetes demoapp v1.1 !! ClientIP: 10.244.0.0, ServerName: deployment-demo-867c7d9d55-b4trp, ServerIP: 10.244.3.33!

回滚

1.查看deployment的更新历史信息

1
2
3
4
5
root@k8s-master01:~# kubectl rollout history deployment deployment-demo
deployment.apps/deployment-demo
REVISION CHANGE-CAUSE
1 <none>
2 <none> # 此为当前版本信息

2.将其回滚到上一个版本

1
2
root@k8s-master01:~# kubectl rollout undo deployment deployment-demo
deployment.apps/deployment-demo rolled back

3.查看replicaset信息

1
2
3
4
5
root@k8s-master01:~# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-demo-867c7d9d55 0 0 0 24m
deployment-demo-fb544c5d8 4 4 4 48m
# 原本的deployment-demo-867c7d9d55已经变为0

4.再次查看更新历史

1
2
3
4
5
6
root@k8s-master01:~# kubectl rollout history deployment deployment-demo
deployment.apps/deployment-demo
REVISION CHANGE-CAUSE
2 <none>
3 <none>
# 可以看到原本的1没有了新增了3,3表示当前的

金丝雀发布

1.再次对版本进行更新

1
2
3
4
# 更新完毕后立即暂停
root@k8s-master01:~/yaml/chapter08# VERSION=v1.2 envsubst < deployment-demo.yaml | kubectl apply -f - && kubectl rollout pause deployment deployment-demo
deployment.apps/deployment-demo configured
deployment.apps/deployment-demo paused

2.查看更新状态

1
2
3
4
5
6
7
8
9
root@k8s-master01:~/yaml/chapter08# kubectl rollout status deployment deployment-demo
Waiting for deployment "deployment-demo" rollout to finish: 2 out of 4 new replicas have been updated...

# 现在可以看到总数有5个pod,有2个pod已经被更新。
root@k8s-master01:~/yaml/chapter08# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-demo-77d46c4794 2 2 2 118s
deployment-demo-867c7d9d55 0 0 0 12h
deployment-demo-fb544c5d8 3 3 3 12h

3.当经过一段时间没有问题时,再将其更新继续

1
root@k8s-master01:~# kubectl rollout resume deployment deployment-demo

Deployment自定义更新策略示例

Deployment默认跟新策略为一批更新25%,在pod量较大的情况下不适用,所以需要自定义。

1.编写资源配置清单

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
root@k8s-master01:~/yaml/chapter08# vim deployment-demo-with-strategy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo-with-strategy
spec:
replicas: 4
selector:
matchLabels:
app: demoapp
release: stable
strategy: "true"
template:
metadata:
labels:
app: demoapp
release: stable
strategy: "true"
spec:
containers:
- name: demoapp
image: ikubernetes/demoapp:${VERSION}
ports:
- containerPort: 80
name: http
strategy:
type: Rollingupdate
rollingUpdate:
maxSurge: 0 # 做多能多出0个pod
maxUnavailable: 1 # 做多能有1个pod不可调度

# 用来实现先减,再创建pod

2.应用配置清单

1
2
root@k8s-master01:~/yaml/chapter08# VERSION=v1.0 envsubst < deployment-demo-with-strategy.yaml | kubectl apply -f -
deployment.apps/deployment-demo-with-strategy created

3.对版本进行更新,并查看跟新过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@k8s-master01:~/yaml/chapter08# VERSION=v1.1 envsubst < deployment-demo-with-strategy.yaml | kubectl apply -f - && kubectl rollout status deployment deployment-demo-with-strategy
deployment.apps/deployment-demo-with-strategy configured
Waiting for deployment spec update to be observed...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 0 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 0 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 1 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 2 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 3 out of 4 new replicas have been updated...
Waiting for deployment "deployment-demo-with-strategy" rollout to finish: 3 of 4 updated replicas are available...
deployment "deployment-demo-with-strategy" successfully rolled out