Kubernetes第六篇:k8s的四种部署策略

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes第六篇:k8s的四种部署策略相关的知识,希望对你有一定的参考价值。

文章目录

一、前言

四种部署方案

滚动更新:切换过程中,存在pod新老版本共存 默认是滚动更新 缺省是滚动更新

重新创建:v1版本都干掉之后,然后再上v2版本,缺点:可能存在服务某段时间服务不可用,这个无法避免。
效果:四个都Terminating 四个都Pending 四个ContainerCreating 四个Running。

蓝绿部署:不是特定类型,而是对滚动更新蓝绿控制,通过selector一键切换

金丝雀:又称为灰度部署或者AB测试,通过selector配置各个版本比例

vi xxx.yaml + kubectl apply -f xxx.yaml == kubectl edit deployment xxx -n ns-name

部署策略和第一次部署本质区别是什么?
第一次部署:之前没有
部署策略:之前有

部署策略不是调度策略,两回事
部署策略是版本切换方式,在yaml中手动指定,调度策略是哪个pod分配到哪个node上,scheduler 组件默认指定
默认的调度策略是不分配主节点
默认的部署策略是yaml文件中不指定,默认是第一种滚动更新。

二、滚动更新

本质:对一个普通的pod (deployment有4个pod的副本)上,增加了一个滚动更新的策略。

2.1 滚动更新

网盘/课堂源码/rollingupdate.yaml

 kubectl apply -f rollingupdate.yaml 
 kubectl get pods 
 kubectl get svc 
 curl cluster-ip/dockerfile 

maxSurge :滚动升级时先启动的pod数量
maxUnavailable :滚动升级时允许的最大unavailable的pod数量

修改rollingupdate.yaml文件,将镜像修改成v2.0

# 在w1上,不断地访问观察输出 
while sleep 0.2;do curl cluster-ip/dockerfile;echo "";done 
# 在w2上,监控pod 
kubectl get pods -w 
# 使得更改生效 
kubectl apply -f rollingupdate.yaml 
kubectl get pods 

服务不会停止,但是整个pod会有新旧并存的情况。先停止旧的pod,然后再创建新的pod,这个过程服务是会间断的。 无需停机,风险较小 01-部署v1的应用(一开始的状态) 所有外部请求的流量都打到这个版本上. 02-部署版本2的应用 版本2的代码与版本1不同(新功能、Bug修复等). 03-将流量从版本1切换到版本2。 04-如版本2测试正常,就删除版本1正在使用的资源(例如实例),从此正式用版本2。

conclusion :发现新旧pod是会共存的,并且可以访问测试看一下

kubectl get pods -w 
kubectl get svc 

可以发现,新老版本的确会共存

2.2 实践

2.2.1 新建两个springboot项目,生成两个镜像

docker run -d --name dockerfile1 springboot-demo-dockerfile1:v1.0


同理可以完成 springboot-demo-dockerfile1:v2.0

然后将 rollingupdate.yaml 文件中的 image 设置为 springboot-demo-dockerfile1:v1.0

2.2.2 kubectl apply启动

2.2.3 将版本修改为v2.0 ,kubectl apply重新部署

将版本修改为v2.0

# 更新操作
vi rollingupdate.yaml
kubectl apply -f rollingupdate.yaml 

三、重新创建

停掉 v1 的四个副本,然后再启动 v2 的四个副本。

3.1 重新创建

网盘/课堂源码/recreate.yaml

kubectl apply -f recreate.yaml 
kubectl get pods 

修改recreate.yaml文件

kubectl apply -f recreate.yaml 
kubectl get pods 

conclusion :发现pod是先停止,然后再创建新的

NAME READY STATUS RESTARTS AGE 
recreate-655d4868d8-5dqcz 0/1 Terminating 0 2m31s 
recreate-655d4868d8-sb688 0/1 Terminating 0 2m31s 
NAME READY STATUS RESTARTS AGE 
recreate-6f74f4686d-4xkgl 1/1 Running 0 13s 
recreate-6f74f4686d-blrt7 1/1 Running 0 13s 

Have a try

kubectl rollout pause deploy rollingupdate 
kubectl rollout resume deploy rollingupdate 
kubectl rollout undo deploy rollingupdate # 回到上一个版本 

3.2 实践

3.2.1 kubectl apply启动

apiVersion: apps/v1
kind: Deployment
metadata:
  name: recreate
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: recreate
  replicas: 4
  template:
    metadata:
      labels:
        app: recreate
    spec:
      containers:
      - name: recreate
        image: springboot-demo-dockerfile1:v1.0
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 8080


部署方式使用重新创建,唯一的配置是 spec 下一级的 strategy ,如下:

  strategy:
    type: Recreate

3.2.2 将版本修改为v2.0 ,kubectl apply重新部署

将 image: springboot-demo-dockerfile1:v1.0 修改为 image: springboot-demo-dockerfile1:v2.0

apiVersion: apps/v1
kind: Deployment
metadata:
  name: recreate
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: recreate
  replicas: 4
  template:
    metadata:
      labels:
        app: recreate
    spec:
      containers:
      - name: recreate
        image: springboot-demo-dockerfile1:v2.0
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 8080

四、蓝绿部署(一键切换)

蓝绿部署:蓝绿部署,service-selector选择器,一键切换

核心:先将v1 v2 都启动起来,然后一键切换,不要 Terminating 原来的(保证deployment name不同即可做到)

滚动更新 的缺点是:切换过程中,可能会出现访问到 v1 的情况
重新创建 的缺点是:切换过程中,可能出现服务端无响应的情况
蓝绿部署就是滚动更新提供的另一种方案,就是v2都启动之后,然后一键切过去,不存在切换过程中访问到v1的情况,可以无缝升级,可以无缝回退。

蓝绿部署 = 无缝切换 + 不会无响应

4.1 蓝绿部署

4.1.1 编写 bluegreen.yaml

resources/deploy-strategy/bluegreen-service.yaml

kubectl apply -f bluegreen.yaml 
kubectl get pods 
kubectl apply -f bluegreen-service.yaml 
kubectl get svc 
# 在w1上不断访问观察 
while sleep 0.3;do curl cluster-ip/dockerfile;echo "";done 

4.1.2 修改bluegreen.yaml

01-deployment-name:blue ---> green 
02-image:v1.0---> v2.0 
03-version:v1.0 ---> v2.0 
kubectl apply -f bluegreen.yaml 
kubectl get pods 
# 同时观察刚才访问的地址有没有变化
可以发现,两个版本就共存了,并且之前访问的地址没有变化 

4.1.3 修改bluegreen-service.yaml

# 也就是把流量切到2.0的版本中 
selector: 
   app: bluegreen 
   version: v2.0 
kubectl apply -f bluegreen-service.yaml 
kubectl get svc 
# 同时观察刚才访问的地址有没有变化 
发现流量已经完全切到了v2.0的版本上

4.2 实践

4.2.1 部署blue.yaml和green.yaml

蓝绿部署deployment这里需要修改三个地方:

name: green 表示不要覆盖掉原来的四个pod
version 表示service和deployment绑定
image 表示程序

将deployment的名称修改为了保存原有的pod不会被删除 (kubectl apply -f xxx.yaml 不会删除之前的blue),不修改deployment name之前的会被删除的

4.2.2 部署bluegreenservice.yaml

4.2.3 修改service-selector即可完成一键切换

修改service-selector变成 2.0 即可完成一键切换,不需要停止原来的服务

五、金丝雀

金丝雀灰度部署:接上面蓝绿,就是 v1 和 v2 都启动着,service 变动 selector ,分配两种pod 的流量占比

金丝雀

查看 describe 后面八个pod

应用场景: AB 测试 50% v1 50% v2
80% v1 20% v2

5.1 金丝雀灰度部署

修改 bluegreen-service.yaml

selector: 
   app: bluegreen 
   version: v2.0 # 把version删除掉,只是根据bluegreen进行选择
kubectl apply -f bluegreen-service.yaml 
# 同时观察刚才访问的地址有没有变化,istio中就更方便咯 
此时新旧版本能够同时被访问到,AB测试,新功能部署少一些的实例

5.2 实践


六、尾声

k8s的四种部署策略,完成了。

天天打码,天天进步!!

以上是关于Kubernetes第六篇:k8s的四种部署策略的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes第六篇:k8s持久化存储(亲测可用)

Kubernetes第六篇:k8s持久化存储(亲测可用)

第六篇 模块基础

这一篇 K8S(Kubernetes)集群部署 我觉得还可以!!!

这一篇 K8S(Kubernetes)集群部署 我觉得还可以

这一篇 K8S(Kubernetes)集群部署 我觉得还可以