• 【kubernetes篇】如何精确控制滚动更新


    引言

    在传统的应用升级时,通常采用的方式是先停止服务,然后升级部署,最后将新应用启动。这个过程面临一个问题,就是在某段时间内,服务是不可用的,对于用户来说是非常不友好的。而kubernetes滚动更新,将避免这种情况的发生。

    对于Kubernetes集群来说,一个service可能有多个pod,滚动升级(RollingUpdate)就是指每次更新部分Pod,直至所有的Pod更新完成,达到平滑升级的效果,而不是在同一时刻将该Service下面的所有Pod停止。

    参数配置

    spec:
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
    • 1

    字段含义

    • type:设置更新策略。有两个可选项:recreate和RollingUpdate(默认)。Recreate表示全部重新创建,RollingUpdate表示滚动更新。
    • maxSurge:升级过程中最多可以比原先设置多出的POD数量,可以是数字,也可以是比例。例如:maxSurage=1,replicas=5,则表示升级过程中最多会有5+1个POD。
    • 升级过程中最多允许有多少个POD处于不可用状态。maxUnavailable =1 表示升级过程中最多会有一个pod可以处于无法服务的状态,在这里就是至少要有5-1个pod正常。

    说明:maxSurge和maxUnavaible在更新策略为RollingUpdate时才需要设置。

    实战测试

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx-deploy
      name: nginx-deploy
    spec:
      replicas: 5
      revisionHistoryLimit: 10
      minReadySeconds: 5
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
      selector:
        matchLabels:
          app: nginx-deploy
      template:
        metadata:
          labels:
            app: nginx-deploy
        spec:
          restartPolicy: Always
          containers:
            - name: mynginx
              image: nginx:1.23
              imagePullPolicy: IfNotPresent
    • 1
    [root@k8s-master ~]# kubectl apply -f deployment.yaml
    deployment.apps/nginx-deploy created
    [root@k8s-master ~]# 
    • 1

    使用nginx:1.23版本启动了5个pod。

    alt

    现在我们进行升级,使用nginx:1.23.1。我这里使用命令行,当然写到yaml中也可以。

    kubectl set image deployment/nginx-deploy mynginx=nginx:1.23.1 --record
    • 1

    通过命令kubectl get pod -w我们可以看到整个清晰地过程,即创建一个pod,再删除一个pod,直至所有的pod被更新完成。

    alt

    查看yaml

    [root@k8s-master ~]# kubectl get deploy nginx-deploy -o yaml
    apiVersion: apps/v1
    kind: Deployment
    ...
    spec:
      containers:
      - image: nginx:1.23.1
        imagePullPolicy: IfNotPresent
        name: mynginx
    ...
    [root@k8s-master ~]#
    • 1

    可以发现nginx已经被更新为1.23.1版本,更新成功。

    版本回退

    有版本升级,就会有对应的版本回退。我们可以通过以下命令来完成版本回退。

    # 历史记录
    [root@k8s-master ~]# kubectl rollout history deployment/nginx-deploy
    deployment.apps/nginx-deploy
    REVISION  CHANGE-CAUSE
    1         
    2         kubectl set image deployment/nginx-deploy mynginx=nginx:1.23.1 --record=true
    [root@k8s-master ~]#
    • 1

    VERSION=1表示最初始的版本。VERSION=2表示一次升级的版本,依次类推...

    # 查看某个版本历史详情
    kubectl rollout history deployment/nginx-deploy --revision=1
    • 1
    alt
    # 回滚(回到上次)
    kubectl rollout undo deployment/nginx-deploy

    #
     回滚(回到指定版本)
    kubectl rollout undo deployment/nginx-deploy --to-revision=2
    • 1

    说明:这些命令中的nginx-deploy是部署的名称,换成自己的即可。前面数字表示版本。

    注意点

    1. 更新策略

    我们这里使用的是滚动更新RollingUpdate。如何使用Recreate,会和传统的升级方法一样,先停掉所有的pod,然后重建pod。

    1. 参数设置

    maxSurge设置为0的时候,maxUnavailable不能设置为0。maxSurge=0时先删除后启动,maxSurge!=0时先启动后删除。

    1. 两个字段说明
    spec:
      revisionHistoryLimit: 10
      minReadySeconds: 5
    • 1
    • revisionHistoryLimit表示保留的版本数。
    • minReadySeconds表示pod启动后经过多少秒pod才开始对外提供服务。

    这两个字段一般都需要设置。

    本文由 mdnice 多平台发布

  • 相关阅读:
    财长耶伦和她诺奖丈夫的千万身家
    2022-11-21 mysql列存储引擎-架构实现缺陷梳理-P1
    PgSQL-执行器机制-Unique算子
    【生日快乐】Node.js 实战 第1章 欢迎进入Node.js 的世界 1.1 一个典型的Node Web 应用程序
    【已解决】Python读取sql数据,报错:Not an executable object,解决方案
    Week 7 Latent Variable Models and Expectation Maximization
    Matlab论文插图绘制模板第116期—带时间刻度的图
    3.0、软件测试——测试用例
    论文学习:Graph Data Augmentation for Graph Machine Learning: A Survey
    java计算机毕业设计健康食谱系统服务器端源码+mysql数据库+系统+lw文档+部署
  • 原文地址:https://blog.csdn.net/weixin_45842494/article/details/126338082