K8S滚动升级

2023-10-27

K8S滚动升级

对于多实例服务,滚动更新采用对各个实例逐批次进行单独更新而非同一时刻对所有实例进行全部更新,来达到不中断服务的更新升级方式。

对于Kubernetes集群来说,一个service可能有多个pod,滚动升级(Rolling update)就是指每次更新部分Pod,而不是在同一时刻将该Service下面的所有Pod shutdown,然后去更新(例如replace --force方案),逐个更新可以避免将业务中断,(但是也可能带来数据不一致的问题,本文就不过多讨论了)。

关键代码
在spec项中增加几个参数

spec:
  minReadySeconds: 5
  strategy:
  # indicate which strategy we want for rolling update
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1


      
字段解释
minReadySeconds
Kubernetes在等待设置的时间后才进行升级
如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了,所以这个可以设置的保守一些,比如我们的服务启动从3-20秒不等,我可以设置成30秒,这样防止pod启动了但是服务还没准备好导致系统不可用。

maxSurge
升级过程中最多可以比原先设置多出的POD数量
例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。

maxUnavaible
升级过程中最多有多少个POD处于无法提供服务的状态,当maxSurge不为0时,该值也不能为0,最好和maxSurge保持一致。
例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态,可以保证有足够的pod(或者认为是足够的性能)提供服务。

举例说明
测试代码

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-api
  labels:
    name: dev-api
spec:
  replicas: 2
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      name: dev-api
  template:
    metadata:
      labels:
       name: dev-api
    spec:
      containers:
      - name: dev-api
        image: vinterhe/n-p-xh:1.1
        imagePullPolicy: Never
        ports:
        - containerPort: 80
        command: ["/bin/sh","-c"]
        args:
          - |
            rm -f /etc/nginx/sites-enabled/default.conf
            chmod -R 777 /data/
            php-fpm -y /usr/local/etc/php-fpm.d/www.conf -D
            /usr/sbin/nginx -g 'daemon off;'


如何滚动升级
如果修改了yaml文件

kubectl apply -f ****.yml



如果没有更改yaml文件却想要平滑重启

$ kubectl rollout restart deployment <deployment>


查看滚动升级的状态

$ kubectl rollout status deployment/<deployment>


暂停升级

$ kubectl rollout pause deployment <deployment>


恢复升级

$ kubectl rollout resume deployment <deployment>


升级完成后
查看replicaSet的状态

kubectl get rs


或者:

kubectl get replicaSet

输出:

NAME                   DESIRED   CURRENT   READY   AGE
dev-api-54559c6cd8     2         2         2       26m
dev-api-759d5464bb     0         0         0       49m


也可以用describe 来查看升级的详细信息,下面我是节选了events等信息

NewReplicaSet:   dev-api-54559c6cd8 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  56m   deployment-controller  Scaled up replica set dev-api-759d5464bb to 2
  Normal  ScalingReplicaSet  33m   deployment-controller  Scaled up replica set dev-api-54559c6cd8 to 1
  Normal  ScalingReplicaSet  33m   deployment-controller  Scaled down replica set dev-api-759d5464bb to 1
  Normal  ScalingReplicaSet  33m   deployment-controller  Scaled up replica set dev-api-54559c6cd8 to 2
  Normal  ScalingReplicaSet  33m   deployment-controller  Scaled down replica set dev-api-759d5464bb to 0


回滚
我们已经能够滚动平滑的升级我们的Deployment了,但是如果升级后的POD出了问题该怎么办?我们能够想到的最好最快的方式当然是回退到上一次能够提供正常工作的版本,Deployment就为我们提供了回滚机制。

首先,查看Deployment的升级历史:

$ kubectl rollout history deployment <deployment>

输出:

REVISION  CHANGE-CAUSE
1         kubectl apply --filename=api.yml --record=true
2         kubectl apply --filename=api.yml --record=true


注意:
record类似一个栈,先执行的apply会放到记录的最下端。也就是说你的上一个版本一定是2.
record记录的是apply的命令,所以如果每次执行的命令是一样的话,会覆盖掉。

查看某一次的revison信息

$ kubectl rollout history deployment <deployment> --revision=1


回滚到某一版本

$ kubectl rollout undo deployment <deployment> --to-revision=2

如果不写后面的--to-revision参数,默认回滚到上一个版本


拓展
所有通过kubectl xxxx --record都会被kubernetes记录到etcd进行持久化,这无疑会占用etcd资源,最重要的是,时间久了,当你kubectl get rs时,会有成百上千的垃圾RS返回给你,这其实也没有太大的作用,一般保留几个版本就可以了。

我们可以通过设置Deployment的.spec.revisionHistoryLimit参数来限制最大保留的revision 数量,比如10个版本。

另外其实rollout history中记录的revision都和ReplicaSets一一对应。如果手动delete某个ReplicaSet,对应的rollout history就会被删除,也就是还说你无法回滚到这个revison了。


原文链接:https://blog.csdn.net/winterfeng123/article/details/109075454

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S滚动升级 的相关文章

  • k8s之ReplicaSet

    我们在定义pod资源时 可以直接创建一个kind Pod类型的自主式pod 但是这存在一个问题 假如pod被删除了 那这个pod就不能自我恢复 就会彻底被删除 线上这种情况非常危险 所以今天就给大家讲解下pod的控制器 所谓控制器就是能够管
  • kubeadm一键搭建kubernetes环境

    kubeadm一键搭建kubernetes环境 安装docker 按官网教程执行https docs docker com v17 09 engine installation linux docker ce centos install
  • 局域网使用kubeadm安装高可用k8s集群

    主机列表 ip 主机名 节点 cpu 内存 192 168 23 100 k8smaster01 master 2核 2G 192 168 23 101 k8smaster02 node 2核 2G 192 168 23 102 k8sma
  • Harbor镜像仓库搭建

    1 安装docker comprose docker comprose是docker容器批量管理工具 curl L https get daocloud io docker compose releases download 1 25 0
  • k8s系统获取真实客户端ip

    k8s部署 系统获取真实客户端ip 我们生产中使用的是kong网关环境的架构也不同 第一种kong网管后走nginx 第二种kong网管后不走nginx kong网管后走ingress nginx 修改kong的配置 配置要信任的原始IP地
  • k8s v1.16设置Job ttlSecondsAfterFinished不生效

    目录 Completed的job默认不会清理 配置自动清理job ttl机制自动清理完成的job ttl controller 开启 TTLAfterFinished kube apiserver开启TTLAfterFinished kub
  • k8s英伟达GPU插件(nvidia-device-plugin)

    安装方法 Installation Guide NVIDIA Cloud Native Technologies documentation 1 本地节点添加 NVIDIA 驱动程序 要求 NVIDIA drivers 384 81 先确保
  • k8s部署springboot

    前言 首先以SpringBoot应用为例介绍一下k8s的部署步骤 1 从代码仓库下载代码 比如GitLab 2 接着是进行打包 比如使用Maven 3 编写Dockerfile文件 把步骤2产生的包制作成镜像 4 上传步骤3的镜像到远程仓库
  • k8s删除Terminating 的命名空间等资源

    背景 在k8s中执行删除命名空间后 命名空间没有被删除而是处于Terminating状态 此时再执行删除仍然删除不掉 解决 将要删除的命名空间信息导出为json数据 下面traefik v2 替换成你需要删除的命名空间名称 kubectl
  • 单机版kubernetes

    Kubernetes 集群的搭建是有一定难度的 官方安装推荐了MiniKube作为单机调试 学习 1 centos安装 1 1 先决条件 安装VirtualBox KVM Note Minikube 也支持 vm driver none 选
  • kubernetes集群更新证书(kubeadm方式)

    一 kubernets证书详情 1 查看证书 tree etc kubernetes pki etc kubernetes pki apiserver crt apiserver etcd client crt apiserver etcd
  • CentOS 7 下 minikube 部署 && 配置

    CentOS 7 下 minikube 部署 配置 文章目录 CentOS 7 下 minikube 部署 配置 下载 安装 下载安装脚本 安装 minikube 启动 minikube 环境 安装 kubectl 工具 启动 miniku
  • k8s--基础--23.1--认证-授权-准入控制--介绍

    k8s 基础 23 1 认证 授权 准入控制 介绍 1 介绍 k8s对我们整个系统的认证 授权 访问控制做了精密的设置 对于k8s集群来说 apiserver是整个就集群访问控制的唯一入口 我们在k8s集群之上部署应用程序的时候 可以通过宿
  • 如何解决K8S节点显示NotReady

    文章目录 kubernetes节点断电重启 kubernetes节点断电重启 背景 运行的好好的k8s集群 某天断电 发现一个节点炸了 显示NotReady kubectl get nodes 那么如何查找问题呢 我们用它 journalc
  • kubeadm构建(Calico+Dashboard+Containerd)

    文章目录 前言 一 环境 二 部署容器网络 CNI master操作 1 下载yamll 2 修改yaml 3 部署 三 部署 Dashboard 1 下载yaml 2 修改yaml 3 部署 4 创建管理员 四 切换容器引擎为Contai
  • kubeadm配置虚拟机k8s集群

    环境 centos7 vm pro windows terminal termius 虚拟机 硬件配置 2核2G 实验用 具体可根据电脑调整 配置3台 master01 node01 node02 通过克隆虚拟机直接复制 配置通一项以后建议
  • K8S暴露服务的三种方式

    文章目录 暴露服务的三种方式 NodePort LoadBalane Ingress 内容参考 暴露服务的三种方式 NodePort 将服务的类型设置成NodePort 每个集群节点都会在节点上打 开 一 个端口 对于NodePort服务
  • kubeadm 安装k8s

    关于k8s集群化部署 以下均是个人一步一步的完成部署 并且会罗列出在部署过程中遇到的各种问题及其解决方式 一 环境准备 环境准备阶段试用与master节点部署与work节点部署 即master和work节点全部都需要执行这些步骤 1 关闭防
  • 从Docker到Kubernetes——Kubernetes设计解读之ReplicationController、Service

    文章目录 Kubernetes的设计解读 replication controller 设计解读 replication controller 使用示例 service的设计解读 service的使用示例 Kubernetes的设计解读 r
  • flannel和calico区别

    k8s网络模式 Flannel数据包在主机间转发是由backend实现的 目前已经支持UDP VxLAN host gw等多种模式 VxLAN 使用内核中的VxLAN模块进行封装报文 也是flannel推荐的方式 host gw虽然VXLA

随机推荐

  • C++ 中的判断语句,if、else..if、switch 和三目运算符(C++复习向p10)

    文章目录 if 和 else 语句 三目运算符 switch 语句 if 和 else 语句 只有 if 的情况 if boolExpression 如果括号满足 执行 if boolExpreesion cout lt lt yes 无代
  • add_executable错误总结

    很久没有写blog了 最近在kdevelop上开发程序的时候 需要在主函数的文件中引用别的文件的函数 添加了对该函数所在的头文件之后仍然出现该函数没有定义的错误 经历了一番波折之后 才发现是忘记了在cmakelist的add executa
  • Direct3D Demo

    空项目 C 代码 gt 空白窗口应用程序 gt 创建初始化D3D11 用D3D渲染窗体的画布 添加Direct3D 分为一下步骤 1 定义想检查的设备类型 和 特征级别 2 创建Direct3D设备 渲染环境和交换链 3 创建渲染对象 4
  • TEZ引擎简介

    TEZ 我们在上一篇文章中提到过 MapReduce模型虽然很厉害 但是它不够的灵活 一个简单的join都需要很多骚操作才能完成 又是加标签又是笛卡尔积 那有人就说我就是不想这么干那怎么办呢 Tez应运起 图飞入MR Tez采用了DAG 有
  • java知识点回顾(4):equals方法重写相关知识点

    和equals 区别 是运算符 如果是基本数据类型 则比较存储的值 如果是引用数据类型 则比较所指向对象的地址值 equals是Object类中的方法 所有java类都直接或者间接继承object类 它比较的是所指向的对象的地址值 一般情况
  • NLP扎实基础2:Word2vec模型CBOW Pytorch复现

    Word2vec模型简介请参考 NLP扎实基础1 Word2vec模型Skip Gram Pytorch复现 CBOW模型可以参考论文 Mikolov Tomas et al Efficient estimation of word rep
  • Hadoop Shell常用命令

    Hadoop Shell命令在管理HDFS的时候还是比较常用的 Hadoop Shell命令与shell命令极为相似 但是方便查询 在这里总结分享 大家enjoy 1 cat 语法格式 hadoop fs cat URI URI 含义 将路
  • MySql 之建表语句

    create database book db use book db create table book b number int primary key b name varchar 20 b auther varchar 20 b p
  • 2021年全国省市县行政区划道路水系shp矢量数据(路网:国道省道县道乡道城市一级二级三级四级高速铁路 水系:全国水系一级二级四级五级河流 行政边界:省市县行政区划界线)

    全国电子地图省市县行政区划道路水系shp数据 1 数据来源 地理信息中心 2 时间跨度 无 3 区域范围 全国 4 指标说明 行政边界数据截止2020年12月31日GCS WGS 1984坐标系 路网 水系为2018年版GCS WGS 19
  • JVM学习笔记

    本文部分引自张凯大神的博客 Java虚拟机 JVM 你只要看这一篇就够了 Java 内存区域与内存溢出异常 Java 程序员不需要像C C 开发者一样去为每一个 new 操作去写配对的 delete free 代码 不容易出现内存泄漏和内存
  • 14_Nginx正则表达式_动静分离配置

    文章目录 正则语法说明 pcretest 工具 动静分离 正则语法说明 转义符号 取消元字符的特殊含义 分组与取值 开头 png jpg gif jpeg bmp rewrite reg expr new expr 正则表达式 加 前缀 r
  • AI小项目

    闯红灯检测项目 给定特定场景 检测非机动车是否闯红灯 并形成完整证据链 1 首先检测三种物体 person bicycle motorbike 拟采用Yolov5进行检测 Yolov5在目标检测领域中十分常用 官方Yolov5包括四个版本
  • Qt中MVC模式分析与使用

    Qt中MVC模式实际上是MVD 如下图所示 QListView QTreeView QTableView都用到了MVD模式 Model和View都交由Delegate集中处理 与QListWidget QTreeWidget QTableW
  • 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music

    本地音乐如何导入apple Apple Music has been available to the public for just about a month now and so far the service looks like
  • Python实战项目:20个非常实用的编程练习

    Python实战项目 20个非常实用的编程练习 在学习Python编程语言时 实战项目是必不可少的 在此 我为大家整理了20个非常实用的Python项目 旨在帮助大家更好地学习Python 通过这些实战项目的练习 你可以提高自己的编程水平
  • JS逆向之巨量创意signature签名

    文章目录 目标网站 接口分析 定位 signature生成位置 补环境还原js 编码测试 往期逆向文章推荐 JS逆向之百度翻译 JS逆向解析之有道翻译 JS逆向之企名科技 JS逆向之人口流动态势 js逆向系列之猿人学爬虫第12题 js逆向系
  • 小程序WebSocket详解

    1 什么是WebSocket WebSocket是一种用于在Web浏览器和服务器之间进行双向通信的协议 而小程序WebSocket是在小程序中使用WebSocket协议进行双向数据通信的一种技术 它可以在单个TCP连接上进行全双工通信 实现
  • 国产集成开发环境工具 CEC-IDE

    本周 国内首款适配国产操作系统 自主可控的集成开发环境工具 CEC IDE 终于开放下载了 公开报道显示 这款集成开发环境工具由数字广东公司联合麒麟软件打造 于今年 6 月份首次亮相 本周 软件上线仅几天内就在知乎和 GitHub 上引发了
  • 数据挖掘的研究背景

    数据挖掘是一门研究如何从大量的数据中发现有用的信息和知识的学科 数据挖掘的研究背景可以归纳为以下几点 数据爆炸 随着信息技术的发展 数据的生成速度越来越快 数据量越来越大 人们希望能够从中发现有用的信息和知识 决策支持 数据挖掘可以帮助人们
  • K8S滚动升级

    K8S滚动升级 对于多实例服务 滚动更新采用对各个实例逐批次进行单独更新而非同一时刻对所有实例进行全部更新 来达到不中断服务的更新升级方式 对于Kubernetes集群来说 一个service可能有多个pod 滚动升级 Rolling up