升级
第一次部署时使用 httpd:2.2.31,然后更新到 httpd:2.2.32。
httpd.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.31
ports:
- containerPort: 80
启动:
kubectl apply -f httpd.yml
查看:
kubectl get deployments httpd -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 1 3 24m httpd httpd:2.2.31 run=httpd
IMAGES 为 httpd:2.2.31
。
把配置文件中的 httpd:2.2.31
改为 httpd:2.2.32
,再次启动:
kubectl apply -f httpd.yml
查看:
kubectl get deployments httpd -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 1 3 26m httpd httpd:2.2.32 run=httpd
IMAGES 变为 httpd:2.2.32
。
查看 deployment httpd 的详细信息:
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Normal ScalingReplicaSet 3m33s deployment-controller Scaled up replica set httpd-94c4dcb56 to 1
Normal ScalingReplicaSet 2m48s deployment-controller Scaled down replica set httpd-8c6c4bd9b to 2
Normal ScalingReplicaSet 2m48s deployment-controller Scaled up replica set httpd-94c4dcb56 to 2
Normal ScalingReplicaSet 2m43s deployment-controller Scaled down replica set httpd-8c6c4bd9b to 1
Normal ScalingReplicaSet 2m43s deployment-controller Scaled up replica set httpd-94c4dcb56 to 3
Normal ScalingReplicaSet 2m38s deployment-controller Scaled down replica set httpd-8c6c4bd9b to 0
上面的日志信息就描述了滚动升级的过程:
- 启动一个新版 pod
- 把旧版 pod 数量降为 2
- 再启动一个新版,数量变为 2
- 把旧版 pod 数量降为 1
- 再启动一个新版,数量变为 3
- 把旧版 pod 数量降为 0
这就是滚动的意思,始终保持副本数量为3,控制新旧 pod 的交替,实现了无缝升级。
回滚
kubectl apply 每次更新应用时,kubernetes 都会记录下当前的配置,保存为一个 revision,这样就可以回滚到某个特定的版本。
创建3个配置文件,内容中唯一不同的就是镜像的版本号。
httpd.v1.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10 # 指定保留最近的几个revision
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.16
ports:
- containerPort: 80
httpd.v1.yml
...
image: httpd:2.2.17
...
httpd.v1.yml
...
image: httpd:2.2.18
...
部署:
kubectl apply -f /vagrant/httpd.v1.yml --record
kubectl apply -f /vagrant/httpd.v2.yml --record
kubectl apply -f /vagrant/httpd.v3.yml --record
--record
的作用是将当前命令记录到 revision 中,可以知道每个 revision 对应的是哪个配置文件。
查看 deployment:
kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES
httpd 0/3 1 0 4m4s httpd httpd:2.2.18
查看 revision 历史记录:
kubectl rollout history deployment httpd
deployment.extensions/httpd
REVISION CHANGE-CAUSE
1 kubectl apply --filename=httpd.v1.yml --record=true
2 kubectl apply --filename=httpd.v2.yml --record=true
3 kubectl apply --filename=httpd.v3.yml --record=true
CHANGE-CAUSE
就是 --record
的结果。
回滚到 revision 1
:
kubectl rollout undo deployment httpd --to-revision=1
再查看 deployment:
kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES
httpd 0/3 1 0 4m4s httpd httpd:2.2.16
版本已经回退了。
查看 revision 历史记录:
kubectl rollout history deployment httpd
deployment.extensions/httpd
REVISION CHANGE-CAUSE
2 kubectl apply --filename=httpd.v2.yml --record=true
3 kubectl apply --filename=httpd.v3.yml --record=true
4 kubectl apply --filename=httpd.v1.yml --record=true
revision 记录也发生了变化。
网友评论