二是先创建新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,则执行下面命令可升级:
运行此命令后:
立刻创建一个名为test-v2的ReplicationController,他的Pod模板镜像正是test:v2,并添加一个标签deployment=xxxx。
test-v1以及app=order选中的Pod都会被加上一个标签:deployment=yyyy。如此做法是防止Pod的管理混乱。
先将test-v2的Pod扩展为1,使用更新后的模板创建新Pod;再将test-v1缩小1,如此循环。
因为在滚动过程中Service的标签选择器一直是app=order,所以新老版本都会接收到流量。
过时的原因是:伸缩的请求时由kubectl发起的,如果因为任何原因丢失了网络连接,升级将处于中间状态。另一个原因是:期望只修改Pod定义中的镜像tag,就能时Kubernetes运行升级工作
使用Deployment声明式的升级Deployment是一种更高阶的资源,用于部署程序并以声明的方式升级应用,而不是通过ReplicationController或ReplicaSet进行部署。
在使用Deployment时,Pod是由Deployment的ReplicaSet创建的。
准备镜像将之前的文章(Kubernetes学习笔记(四):服务)里的拿过来做一下微小的改动,生成两个镜像。改动内容就是在输出内容加上版本号。
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 创建DeploymentDeployment与ReplicaSet的配置相似,都含有标签选择器、副本数量和Pod模板。此外Deployment还会包含一个部署策略。
定义Service定义了一个NodePort类型的Service
# goweb-svc.yaml apiVersion: v1 kind: Service metadata: name: goweb spec: type: NodePort selector: app: goweb ports: - port: 80 targetPort: 8000 nodePort: 31234 定义Deployment # 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 运行查看可以看到名为goweb-fdfcfdcc6的RS,有个label是pod-template-hash=fdfcfdcc6,顾名思义,fdfcfdcc6就是pod模板的hash值。
创建Deployment时指定 --record 记录历史版本号,非常有用
-> [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 升级Deployment只要修改Deployment的Pod模板定义,Kubernetes会自动的将实际状态收敛为修改后的状态。对于升级,只需要修改Pod中镜像的tag。
升级策略由deployment.spec.strategy.type定义,值是Recreate或RollingUpdate,默认RollingUpdate。
kubectl patch及minReadySeconds使用kubectl patch定义deployment.spec.minReadySeconds来减慢滚动升级时间,以便观察升级过程
-> [root@kube0.vm] [~] k patch deployment goweb -p '{"spec":{"minReadySeconds":5}}' deployment.apps/goweb patched 循环请求服务