概述
本文核心问题是: 如何升级应用.
对于 Pod 的更新有两种策略:
一是删除全部旧 Pod 之后再创建新 Pod. 好处是, 同一时间只会有一个版本的应用存在; 缺点是, 应用有一段时间不可用.
二是先创建新 Pod, 再删除旧 Pod. 可以一次性创建全部, 再删除全部, 也可以逐渐创建删除. 好处是应用一直可用, 缺点是要同时支持两个版本.
蓝绿部署
对于应用的版本 v1 和版本 v2:
在运行 v1 前, 流量一直都在 v2 上
部署 v1, 然后测试通过后, 将流量切换到 v2,v2 就成为了新的生产环境
一旦 v2 出现问题, 可以在切回 v1
金丝雀部署(也称灰度部署)
金丝雀部署一种增量发布, 先是在小范围内发布, 然后观察测试, 如无问题逐渐发布全部.
kubectl rolling-update
因为 kubectl rolling-update 的方式已经过时, 所以只是做一下简介.
假设现在有一个名为 test-v1,Pod 选择器为 App=order 的 ReplicationController 要升级为 test-v2, 则执行下面命令可升级:
k rolling-update test-v1 test-v2 --image=test:v2
运行此命令后:
立刻创建一个名为 test-v2 的 ReplicationController, 他的 Pod 模板镜像正是 test:v2, 并添加一个标签 deployment=xxxx.
- fmt.Fprintf(w,"this is v1, hostname: %v\n",hostname)
- docker push registry.cn-hangzhou.aliyuncs.com/orzi/goweb:v1
- fmt.Fprintf(w,"this is v2, hostname: %v\n",hostname)
- docker push registry.cn-hangzhou.aliyuncs.com/orzi/goweb:v2
- # goweb-svc.YAML
- apiVersion: v1
- kind: Service
- metadata:
- name: goweb
- spec:
- type: NodePort
- selector:
- App: goweb
- ports:
- - port: 80
- targetPort: 8000
- nodePort: 31234
- # goweb-deployment.YAML
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: goweb
- spec:
- replicas: 3
- selector:
- matchLabels:
- App: goweb
- template:
- metadata:
- labels:
- App: goweb
- spec:
- containers:
- - name: goweb
- image: registry.cn-hangzhou.aliyuncs.com/orzi/goweb:v1
- -> [root@kube0.vm] [~] k create -f goweb-svc.YAML
- service/goweb created
- -> [root@kube0.vm] [~] k create -f goweb-deployment.YAML --record
- deployment.apps/goweb created
- -> [root@kube0.vm] [~] k get all -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod/goweb-fdfcfdcc6-4wklw 1/1 Running 0 9s 10.244.2.37 kube2.vm <none> <none>
- pod/goweb-fdfcfdcc6-bw8c4 1/1 Running 0 9s 10.244.2.36 kube2.vm <none> <none>
- pod/goweb-fdfcfdcc6-xjcwf 1/1 Running 0 9s 10.244.1.33 kube1.vm <none> <none>
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
- service/goweb NodePort 10.100.193.94 <none> 80:31234/TCP 28s App=goweb
- service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 54s <none>
- NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
- deployment.apps/goweb 3/3 3 3 9s goweb registry.cn-hangzhou.aliyuncs.com/orzi/goweb:v1 App=goweb
- NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
- replicaset.apps/goweb-fdfcfdcc6 3 3 3 9s goweb registry.cn-hangzhou.aliyuncs.com/orzi/goweb:v1 App=goweb,pod-template-hash=fdfcfdcc6
- -> [root@kube0.vm] [~] k patch deployment goweb -p '{"spec":{"minReadySeconds":5}}'
- deployment.apps/goweb patched
- -> [root@kube0.vm] [~] while true; do curl http://192.168.199.231:31234/ ; sleep 1; done
- this is v1, hostname: goweb-fdfcfdcc6-pw7b4
- this is v1, hostname: goweb-fdfcfdcc6-pw7b4
- this is v1, hostname: goweb-fdfcfdcc6-x8n7h
- this is v1, hostname: goweb-fdfcfdcc6-pw7b4
- this is v1, hostname: goweb-fdfcfdcc6-x8n7h
- this is v1, hostname: goweb-fdfcfdcc6-j4mz8
- this is v1, hostname: goweb-fdfcfdcc6-j4mz8
- # 以上是升级之前的输出, 以下是开始升级后的
- this is v1, hostname: goweb-fdfcfdcc6-x8n7h
- this is v1, hostname: goweb-fdfcfdcc6-pw7b4
- this is v1, hostname: goweb-fdfcfdcc6-pw7b4
- this is v1, hostname: goweb-fdfcfdcc6-j4mz8
- this is v2, hostname: goweb-65cc575865-25988
- this is v2, hostname: goweb-65cc575865-25988
- this is v1, hostname: goweb-fdfcfdcc6-x8n7h
- this is v1, hostname: goweb-fdfcfdcc6-j4mz8
- this is v2, hostname: goweb-65cc575865-bfd98
- this is v2, hostname: goweb-65cc575865-bfd98
- this is v2, hostname: goweb-65cc575865-25988
- this is v2, hostname: goweb-65cc575865-25988
- this is v2, hostname: goweb-65cc575865-25988
- # 这之后就是升级完成了
- kubectl set
- -> [root@kube0.vm] [~] k set image deployment goweb goweb=registry.cn-hangzhou.aliyuncs.com/orzi/goweb:v2
- deployment.apps/goweb image updated
- kubectl rollout
- -> [root@kube0.vm] [~] k rollout status deployment goweb
- Waiting for deployment "goweb" rollout to finish: 1 out of 3 new replicas have been updated...
- Waiting for deployment "goweb" rollout to finish: 1 out of 3 new replicas have been updated...
- Waiting for deployment "goweb" rollout to finish: 1 out of 3 new replicas have been updated...
- Waiting for deployment "goweb" rollout to finish: 2 out of 3 new replicas have been updated...
- Waiting for deployment "goweb" rollout to finish: 2 out of 3 new replicas have been updated...
- Waiting for deployment "goweb" rollout to finish: 2 out of 3 new replicas have been updated...
- Waiting for deployment "goweb" rollout to finish: 1 old replicas are pending termination...
- Waiting for deployment "goweb" rollout to finish: 1 old replicas are pending termination...
- Waiting for deployment "goweb" rollout to finish: 1 old replicas are pending termination...
- deployment "goweb" successfully rolled out
- -> [root@kube0.vm] [~] k rollout undo deployment goweb
- deployment.apps/goweb rolled back
- -> [root@kube0.vm] [~] k rollout history deployment goweb
- deployment.apps/goweb
- REVISION CHANGE-CAUSE
- 6 kubectl create --filename=goweb-deployment.YAML --record=true
- 7 kubectl create --filename=goweb-deployment.YAML --record=true
- -> [root@kube0.vm] [~] k rollout undo deployment goweb --to-revision=5
- error: unable to find specified revision 5 in history
- -> [root@kube0.vm] [~] k rollout undo deployment goweb --to-revision=7
- deployment.apps/goweb skipped rollback (current template already matches revision 7)
- -> [root@kube0.vm] [~] k rollout undo deployment goweb --to-revision=6
- deployment.apps/goweb rolled back
来源: https://www.cnblogs.com/flhs/p/12964768.html