Deployment
学习了Replication Controller和Replica Set两种资源对象,RC和RS的功能基本上是差不多的,唯一的区别就是RS支持集合的selector。我们也学习到了用RC/RS来控制Pod副本的数量,也实现了滚动升级Pod的功能。现在看上去似乎一切都比较完美的运行着,但是我们上节课最后也提到了现在我们推荐使用Deployment这种控制器了,而不是我们之前的RC或者RS,这是为什么呢?
没有对比就没有伤害对吧,我们来对比下二者之间的功能吧,首先RC是Kubernetes的一个核心概念,当我们把应用部署到集群之后,需要保证应用能够持续稳定的运行,RC就是这个保证的关键,主要功能如下:
- 确保
Pod数量:它会确保Kubernetes中有指定数量的Pod在运行,如果少于指定数量的Pod,RC就会创建新的,反之这会删除多余的,保证Pod的副本数量不变。 - 确保
Pod健康:当Pod不健康,比如运行出错了,总之无法提供正常服务时,RC也会杀死不健康的Pod,重新创建新的。 - 弹性伸缩:在业务高峰或者低峰的时候,可以用过
RC来动态的调整Pod数量来提供资源的利用率,当然我们也提到过如果使用HPA这种资源对象的话可以做到自动伸缩。 - 滚动升级:滚动升级是一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定性。
Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC一样的都是保证Pod的数量和健康,二者大部分功能都是完全一致的,我们可以看成是一个升级版的RC控制器,那Deployment又具备那些新特性呢?
RC的全部功能:Deployment具备上面描述的RC的全部功能- 事件和状态查看:可以查看
Deployment的升级详细进度和状态 - 回滚:当升级
Pod的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本 - 版本记录:每一次对
Deployment的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础 - 暂停和启动:对于每一次升级都能够随时暂停和启动
环境
192.168.48.101 master01
192.168.48.201 node01
192.168.48.202 node0
创建deployment
编写myapp-deploy.yaml
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
labels:
app: myapp
type: deploy
spec:
replicas: 2
selector:
matchLabels:
app: myapp
type: deploy
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: deploy
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
创建myapp-deploy.yaml
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml
deployment.apps/myapp-deploy created
查看deployment
[root@master01 deploy_yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-deploy-8675c97685-vhncn 1/1 Running 1 9d
demo-deploy-8675c97685-w7md2 1/1 Running 2 9d
demo-rc-l9c8r 1/1 Running 1 22h
demo-rc-qvdd7 1/1 Running 2 22h
myapp-deploy-8675c97685-hrwgq 1/1 Running 0 9s
myapp-deploy-8675c97685-qd2s7 1/1 Running 0 9s
myapp-rc3-6fqkj 1/1 Running 1 21h
myapp-rc3-qtk2d 1/1 Running 1 21h
myapp-rc3-wpxlj 1/1 Running 1 21h
myapp-replicaset-9gm94 1/1 Running 1 21h
myapp-replicaset-h4g92 1/1 Running 1 21h
myapp-replicaset-l24ff 1/1 Running 3 21h
[root@master01 deploy_yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-deploy-8675c97685 2 2 2 9d
myapp-deploy-8675c97685 2 2 2 14s
myapp-replicaset 3 3 3 21h
[root@master01 deploy_yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
demo-deploy 2/2 2 2 9d
myapp-deploy 2/2 2 2 18s
增加扩展
直接编写yaml文件
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
labels:
app: myapp
type: deploy
spec:
replicas: 5
selector:
matchLabels:
app: myapp
type: deploy
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: deploy
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
demo-deploy 2/2 2 2 9d
myapp-deploy 5/5 5 5 3m40s
[root@master01 deploy_yaml]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
demo-deploy 2/2 2 2 9d myapp ikubernetes/myapp:v1 app=myapp,type=deploy
myapp-deploy 5/5 5 5 3m51s myapp ikubernetes/myapp:v1 app=myapp,type=deploy
打补丁方式
[root@master01 deploy_yaml]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":3}}'
deployment.extensions/myapp-deploy patched
[root@master01 deploy_yaml]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
demo-deploy 2/2 2 2 9d
myapp-deploy 3/3 3 3 14m
滚动升级镜像
直接编写yaml文件,v1-v2
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
labels:
app: myapp
type: deploy
spec:
replicas: 3
selector:
matchLabels:
app: myapp
type: deploy
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: deploy
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-deploy-8675c97685 2 2 2 9d
myapp-deploy-846955c66b 3 3 3 6s
myapp-deploy-8675c97685 0 0 0 19m
myapp-replicaset 3 3 3 22h
[root@master01 deploy_yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
demo-deploy 2/2 2 2 9d
myapp-deploy 3/3 3 3 19m
[root@master01 deploy_yaml]#
添加滚动升级策略 v2-v3
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
labels:
app: myapp
type: deploy
spec:
replicas: 3
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
selector:
matchLabels:
app: myapp
type: deploy
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: deploy
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v3
ports:
- name: http
containerPort: 80
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-deploy-8675c97685 2 2 2 9d
myapp-deploy-5f94c88667 3 3 3 10s
myapp-deploy-846955c66b 0 0 0 3m40s
myapp-deploy-8675c97685 0 0 0 22m
myapp-replicaset 3 3 3 22h
[root@master01 deploy_yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
demo-deploy 2/2 2 2 9d
myapp-deploy 3/3 3 3 22m
- minReadySeconds:
- Kubernetes在等待设置的时间后才进行升级
- 如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
- 如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行
- maxSurge:
- 升级过程中最多可以比原先设置多出的POD数量
- 例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。
- maxUnavaible:
- 升级过程中最多有多少个POD处于无法提供服务的状态
- 当
maxSurge不为0时,该值也不能为0 - 例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态。
rollout升级
查看状态
[root@master01 deploy_yaml]# kubectl rollout status deployment myapp-deploy
deployment "myapp-deploy" successfully rolled out
暂停升级,打开2个终端,一台设置升级,升级后一台立即暂停升级,v3-v1
[root@master01 deploy_yaml]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v1
deployment.extensions/myapp-deploy image updated
[root@master01 ~]# kubectl rollout pause deployment myapp-deploy
deployment.extensions/myapp-deploy paused
继续升级,打开2个终端,一台看rollout status 一台继续升级 ,v3-v1
[root@master01 deploy_yaml]# kubectl rollout status deployment myapp-deploy
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
[root@master01 ~]# kubectl rollout resume deployment myapp-deploy
deployment.extensions/myapp-deploy resumed
[root@master01 deploy_yaml]# kubectl rollout status deployment myapp-deploy
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 2 of 3 updated replicas are available...
Waiting for deployment "myapp-deploy" rollout to finish: 2 of 3 updated replicas are available...
deployment "myapp-deploy" successfully rolled out
升级结束后,继续查看rs的状态
[root@master01 deploy_yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-deploy-8675c97685 2 2 2 9d
myapp-deploy-5f94c88667 0 0 0 13m
myapp-deploy-846955c66b 0 0 0 16m
myapp-deploy-8675c97685 3 3 3 35m
myapp-replicaset 3 3 3 22h
查看Deployment的升级历史 v1-v2-v3-v1
[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
直接回退到当前版本的前一个版本 v1-v3
[root@master01 deploy_yaml]# kubectl rollout undo deployment myapp-deploy
deployment.extensions/myapp-deploy rolled back
[root@master01 deploy_yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-deploy-8675c97685 2 2 2 9d
myapp-deploy-5f94c88667 3 3 3 17m
myapp-deploy-846955c66b 0 0 0 21m
myapp-deploy-8675c97685 0 0 0 40m
myapp-replicaset 3 3 3 22h
[root@master01 deploy_yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
demo-deploy 2/2 2 2 9d
myapp-deploy 3/3 3 2 40m
[root@master01 deploy_yaml]# kubectl describe deployment myapp-deploy
Name: myapp-deploy
Namespace: default
CreationTimestamp: Tue, 09 Apr 2019 19:48:31 +0800
Labels: app=myapp
type=deploy
Annotations: deployment.kubernetes.io/revision: 5
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"myapp","type":"deploy"},"name":"myapp-deploy","n...
Selector: app=myapp,type=deploy
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 5
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: app=myapp
type=deploy
Containers:
myapp:
Image: ikubernetes/myapp:v3
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: myapp-deploy-5f94c88667 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 41m deployment-controller Scaled up replica set myapp-deploy-8675c97685 to 2
Normal ScalingReplicaSet 37m deployment-controller Scaled up replica set myapp-deploy-8675c97685 to 5
Normal ScalingReplicaSet 26m deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 3
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set myapp-deploy-846955c66b to 1
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set myapp-deploy-846955c66b to 2
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 1
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set myapp-deploy-846955c66b to 3
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 0
Normal ScalingReplicaSet 18m deployment-controller Scaled down replica set myapp-deploy-846955c66b to 2
Normal ScalingReplicaSet 18m deployment-controller Scaled up replica set myapp-deploy-5f94c88667 to 1
Normal ScalingReplicaSet 70s (x2 over 22m) deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 2
Normal ScalingReplicaSet 63s (x13 over 18m) deployment-controller (combined from similar events): Scaled up replica set myapp-deploy-5f94c88667 to 3
可以用revision回退到指定的版本 v3-v2
[root@master01 deploy_yaml]# kubectl rollout undo deployment myapp-deploy --to-revision=2
deployment.extensions/myapp-deploy rolled back
[root@master01 deploy_yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-deploy-8675c97685 2 2 2 9d
myapp-deploy-5f94c88667 0 0 0 21m
myapp-deploy-846955c66b 3 3 3 24m
myapp-deploy-8675c97685 0 0 0 43m
myapp-replicaset 3 3 3 22h
[root@master01 deploy_yaml]# kubectl describe deployment myapp-deploy
Name: myapp-deploy
Namespace: default
CreationTimestamp: Tue, 09 Apr 2019 19:48:31 +0800
Labels: app=myapp
type=deploy
Annotations: deployment.kubernetes.io/revision: 6
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"myapp","type":"deploy"},"name":"myapp-deploy","n...
Selector: app=myapp,type=deploy
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 5
RollingUpdateStrategy: 1 max unavailable, 1 max surge
Pod Template:
Labels: app=myapp
type=deploy
Containers:
myapp:
Image: ikubernetes/myapp:v2
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: myapp-deploy-846955c66b (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 43m deployment-controller Scaled up replica set myapp-deploy-8675c97685 to 2
Normal ScalingReplicaSet 40m deployment-controller Scaled up replica set myapp-deploy-8675c97685 to 5
Normal ScalingReplicaSet 29m deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 3
Normal ScalingReplicaSet 24m deployment-controller Scaled up replica set myapp-deploy-846955c66b to 1
Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 1
Normal ScalingReplicaSet 24m deployment-controller Scaled up replica set myapp-deploy-846955c66b to 3
Normal ScalingReplicaSet 24m deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 0
Normal ScalingReplicaSet 21m deployment-controller Scaled up replica set myapp-deploy-5f94c88667 to 1
Normal ScalingReplicaSet 21m deployment-controller Scaled down replica set myapp-deploy-846955c66b to 2
Normal ScalingReplicaSet 3m42s (x2 over 24m) deployment-controller Scaled down replica set myapp-deploy-8675c97685 to 2
Normal ScalingReplicaSet 39s (x2 over 24m) deployment-controller Scaled up replica set myapp-deploy-846955c66b to 2
Normal ScalingReplicaSet 39s deployment-controller Scaled down replica set myapp-deploy-5f94c88667 to 2
Normal ScalingReplicaSet 32s (x16 over 21m) deployment-controller (combined from similar events): Scaled up replica set myapp-deploy-846955c66b to 3
Normal ScalingReplicaSet 30s deployment-controller Scaled down replica set myapp-deploy-5f94c88667 to 0
在执行Deployment升级的时候最好带上record参数,便于我们查看历史版本信息 v2-v1
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
labels:
app: myapp
type: deploy
spec:
replicas: 2
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
selector:
matchLabels:
app: myapp
type: deploy
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: deploy
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
[root@master01 deploy_yaml]# kubectl apply -f myapp-deploy.yaml --record=true
deployment.apps/myapp-deploy configured
[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
5 <none>
6 <none>
7 kubectl apply --filename=myapp-deploy.yaml --record=true
默认情况下,所有通过kubectl xxxx --record都会被kubernetes记录到etcd进行持久化,这无疑会占用资源,最重要的是,时间久了,当你kubectl get rs时,会有成百上千的垃圾RS返回给你,那时你可能就眼花缭乱了。
上生产时,我们最好通过设置Deployment的.spec.revisionHistoryLimit来限制最大保留的revision number,比如15个版本,回滚的时候一般只会回滚到最近的几个版本就足够了。其实rollout history中记录的revision都和ReplicaSets一一对应。如果手动delete某个ReplicaSet,对应的rollout history就会被删除,也就是还说你无法回滚到这个revison了。
roolout history和ReplicaSet的对应关系,可以在kubectl describe rs $RSNAME返回的revision字段中得到,这里的revision就对应着roolout history返回的revison。
使用下面的命令查看单个revison的信息
[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
5 <none>
6 <none>
7 kubectl apply --filename=myapp-deploy.yaml --record=true
[root@master01 deploy_yaml]# kubectl rollout history deployment myapp-deploy --revision=7
deployment.extensions/myapp-deploy with revision #7
Pod Template:
Labels: app=myapp
pod-template-hash=8675c97685
type=deploy
Annotations: kubernetes.io/change-cause: kubectl apply --filename=myapp-deploy.yaml --record=true
Containers:
myapp:
Image: ikubernetes/myapp:v1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
511

被折叠的 条评论
为什么被折叠?



