×

更新APP-执行滚动更新

96
趁你还年轻233
2018.03.12 19:46 字数 781

目标:

  • 使用kubectl做一次滚动更新

更新一个应用

用户期望应用一直是可用的,而开发者期望一天部署多次新版本。
在k8s里,这是通过滚动更新来实现的。
Rolling updates允许增量更新新的Pods实例,部署的更新以零宕机时间进行。新的Pod将在具有可用资源的节点上进行调度。、
在之前的单元里,我们伸缩app以达到运行多个实例的目的。这是一种不影响应用可用的执行更新的需求。默认情况下,Pod实例的最大个数在更新期间是不可用的,而且可以新创建的新Pod也只能是一个。无论Pod的个数和百分比都是可以配置的。在k8s中,更新都是由版本的,而且无论什么时候的部署更新都能被回退到之前的(稳定)版本。

总结:

  • 更新应用

滚动更新允许部署的更新以零宕机时间的增量更新Pod实例来完成。

滚动更新概览

image
image

image
image

image
image

image
image

与伸缩应用类似,如果部署被公开暴露了,服务将对流量做负载均衡到可用的Pod。一个可用的Pod是一个用户可用的应用实例。
滚动更新包括以下几个步骤:

  • 通过image更新,将应用从一个环境推广到另外一个环境
  • 回滚到之前的版本
  • 零宕机时间的持续集成和持续应用分发

如果一个部署被公开暴露了出来,更新期间服务将会把流量负载均衡到可用的Pod。

  • 通过kubectl set image更新一个已部署的应用
  • 使用kubectl rollout undo回滚到之前的版本

更新app的版本

主要看image字段
kubectl describe pods
都是Image: gcr.io/google-samples/kubernetes-bootcamp:v1

升级应用image到version 2
命令:set image + 部署名 + 新的image版本

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

deployment "kubernetes-bootcamp" image updated

验证更新

检查正在运行的App。我们可以用describe service找出外露IP和端口。
kubectl describe services/kubernetes-bootcamp

设置NODE_PORT变量

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT

NODE_PORT=32427

验证更新
curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7689dc585d-7b2gk | v=2

确认更新
kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out

查看image版本
kubectl describe pods
Image: jocatalin/kubernetes-bootcamp:v2

回滚更新

升级deployments/kubernetes-bootcamp到v10
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 5 2 3 17m

kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5569c6b8d6-86248 0/1 ImagePullBackOff 0 4m
kubernetes-bootcamp-5569c6b8d6-8cn6l 0/1 ImagePullBackOff 0 4m
kubernetes-bootcamp-7689dc585d-847df 1/1 Running 0 13m
kubernetes-bootcamp-7689dc585d-vk68v 1/1 Running 0 13m
kubernetes-bootcamp-7689dc585d-x7q9j 1/1 Running 0 13m

回滚到上一个版本(更新错误时使用,比如我们的repo中没有v10但却set了image)
kubectl rollout undo deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp"

此时再查看部署
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 4 4m

kubernetes
Web note ad 1