当前位置: 首页 > news >正文

K8s deployment 进阶

文章目录

  • K8s deployment 进阶
    • Deployment 更新策略
      • Recreate
      • RollingUpdate
        • maxSurge 和 maxUnavailable
      • minReadySeconds
      • progressDeadlineSeconds
    • Deployment 版本回滚
    • Deployment 实现灰度发布

K8s deployment 进阶

Deployment 更新策略

Recreate

重建 (Recreate),当更新策略设定为 Recreate,在更新镜像时,它会先杀死正在运行的Pod,等彻底杀死后,重新创建新的RS,然后启动对应的Pod,那么在这个更新过程中,会造成服务一段时问无法提供服务;

  • 第一步:同时杀死所有旧版本的Pod,此时Pod无法正常对外提供服务;
  • 第二步:创建新的RS,启动新的Pod;
  • 第三步:等待Pod就绪,对外提供服务;

在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:name: demoapp-deploynamespace: default
spec:strategy:         # 更新策略type: Recreate  # 更新镜像的策略定义为Recreatereplicas: 5            # 副本数selector:             # 通过标签选择器选择要管理的PodmatchLabels:app: demoapptemplate:metadata:labels:app: demoappspec:containers:- name: webserverimage: nginx:1.7.9ports:- name: httpcontainerPort: 80

通常只有应用的新旧版本不兼容(例如依赖的后台数据的格式不同且无法兼容)时才会使用,这种更新会出现一段时间的服务无法访问

RollingUpdate

滚动更新 (RoILingupdate),一次仅更新一批Pod,当更新的Pod就绪后,在更新另一批,直到全部更新完成为止;该策路实现了不间断服务的目标,在更新过程中可能会出现不同的应用版本井存且,同时提供服务的情况。

  • 第一步:创建新的Replicaset,然后根据新的镜像运行新的Pod;
  • 第二步:删除1日的Pod,启动新的Pod,新Pod就绪后,继续删除1日
    Pod,启动新Pod;
  • 第三步:持续第二步过程,一直到所有Pod都被更新成功。

在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:name: demoapp-deploynamespace: default
spec:strategy:type: RollingUpdate  # 更新镜像的策略为RollingUpdatereplicas: 5            # 副本数selector:             # 通过标签选择器选择要管理的PodmatchLabels:app: demoapptemplate:metadata:labels:app: demoappspec:containers:- name: webserverimage: oldxu3957/demoapp:v1.1ports:- name: httpcontainerPort: 80

RollingUpdate 更新时,会出现新老版本同时存在,同时能访问的情况,让使用者无法明显感知到服务更新

maxSurge 和 maxUnavailable

Deployment 会在 spec.strategy.type=Rollingupdate 时,采取滚动更新的方式更新 Pods。可以指定 maxUnavailable 和

maxsurge 来控制滚动更新过程。

  • maxSurge 最大可用Pod
    • 用来指定可以创建超出期望Pod个数的 Pod数量。可以是数字,也可以是百分比(例如10%) 此字段的默认值为25%。
    • 例如,当此值为 20% 时,启动滚动更新后,会立即对新的Replicaset 扩容,同时保证新1日 Pod 的总数不超过所需 Pod 总数的 120%。一旦1 Pods 被杀死,新的Replicaset 可以进一步扩容, 同时确保更新期间的任何时候行中的 Pods 总数最多为所需 Pods 总数的 120%。计算公式:10+(10x20%)=12
  • maxUnavailable 最大不可用Pod
    • 用来指定更新过程中不可用的 Pod 的个数上限。可以是数字,也可以是百分比(例如10%) 此字段的默认值为25%。
    • 例如,当此值设置为 20% 时,滚动更新开始时会立即将旧Replicaset 缩容到期望 Pod 个数的70%。新 Pod 准备就绪后,继续缩容1旧有的 Replicaset,然后对新的Replicaset 扩容,确保在更新期间可用的 Pods 总数在任何时候都是所需的 Pod 个数的 70%。 计算公式:10-(1 0×20%)=8

maxSurge 和 maxUnavailable 两个属性协同工作,可组合定义出3中不同的策路完成多批次的应用更新。

  • 先增新,后减旧:将maxSurge设置为30%,将maxUnavailable的值设为0;
  • 先减旧,后增新:将maxUnavailabre设置为30%,将maxSurge的值设为0;
  • 同时增减,将maxSurge和maxUnavailable分别设定为20%;期望是12Pod,至少就绪8个Pod

同时增减配置

apiVersion: apps/v1
kind: Deployment
metadata:name: demoapp-deploynamespace: default
spec:# pasued: true  # 默认为false 设置为true 时,停止更新minReadySeconds: 5   # 设置 就绪等待时长 5s  默认为0 strategy:rollingUpdate:maxSurge: 20%maxUnavailable: 20%type: RollingUpdate  # 更新镜像的策略为RollingUpdatereplicas: 10            # 副本数selector:             # 通过标签选择器选择要管理的PodmatchLabels:app: demoapptemplate:metadata:labels:app: demoappspec:containers:- name: webserverimage: nginx:1.7.9ports:- name: httpcontainerPort: 80

minReadySeconds

Deployment支持使用 spec .minReadySeconds 字段来控制滚动更新的速度,默认值为0,表示新建的Pod对象一旦 “就绪“将立即被视作可用,随后即可开始下一轮更新过程。如果设定了spec .minReadySeconds:3 及表示新建的Pod对象至少要成功运行多久才会被视作可用,即就绪之后还要等待指定的 3s 才能开始下一批次的更新。在一个批次内新建的所有Pod就绪后在转为可用状态前,更新操作会被阻塞,并且任何一个Pod就绪探测失败,都会导致滚动更新被终止。

因此,为ninReadySeconds 设定一个合理的值,不仅能够减缓更新的速度,还能够让Deployment提前发现一部分程序因为Bug导致的升级故障。

progressDeadlineSeconds

滚动更新故障超时时长,默认时600秒,在升级版本过程中,出现各种问题导致升级进程卡住,比如拉镜像网络不好,没有权限等。 当超时后,就会上报这个异常,这个时候deployment 状态会被标记为False,并注明原因。但是并不会阻止 deployment 继续进行卡在后面的升级操作

Deployment 版本回滚

当deployment 不稳定进入反复崩溃状态时。默认情况下,deployment 的所有上线记录都保存在系统中,以便随时回滚。(可以通过修改spec.revisionHistoryLimit 调整保留数量, 默认10条)

1. 查看历史版本
$ kubectl rollout history deployment demo-deploy
2. 查看对应version 的具体信息
$ kubectl rollout history deployment demo-deploy --version=1
3. 回滚对应版本
$ kubectl rollout undo deployment demo-deploy --to-version=1 

Deployment 实现灰度发布

灰度发布(又名金丝雀发布) 是指黑与白之前,能够平滑过度的一种发布方式,在上面可以进行 A/B Testing

  1. 首先:让一部分用户继续使用产品特性A (旧版本)
  2. 其次:让一部分用户开始使用产品特性B(新版本)
  3. 最后:如果用户对产品特性B没有反对意见,那么逐步扩大反问,将用户的流量迁移到B上面来。

使用灰度发布的模式,可以及时发现问题,调整问题,以减少影响的速度,保证整体系统的稳定运行。简单点说就是同时运行两个版本的deployment,用同一个 service 代理 两个deployment。

在这里插入图片描述

相关文章:

K8s deployment 进阶

文章目录 K8s deployment 进阶Deployment 更新策略RecreateRollingUpdatemaxSurge 和 maxUnavailable minReadySecondsprogressDeadlineSeconds Deployment 版本回滚Deployment 实现灰度发布 K8s deployment 进阶 Deployment 更新策略 Recreate 重建 (Recreate)&…...

python实现二叉搜索树(AVL树)简单样例

一、二叉搜索树 class TreeNode:def __init__(self, value):self.value valueself.left Noneself.right Noneclass BinarySearchTree:def __init__(self):self.root Nonedef insert(self, value):if self.root is None:self.root TreeNode(value)else:self._insert(self.…...

Day47 打家劫舍123

198 打家劫舍 题目链接:198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,…...

OceanBase 开源社区新进展|obdiag SIG成立

为了构建完善的 OceanBase 诊断生态系统,汇聚各方力量,形成涵盖工具、知识在内的全方位诊断生态体系,助力开发者更高效地驾驭 OceanBase,OceanBase 社区宣布成立诊断 SIG,名称:obdiag SIG。 详情参加原文链…...

React类组件生命周期详解

在React的类组件中,从组件创建到组件被挂载到页面中,这个过程react存在一系列的生命周期函数,最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount 生命周期图例如下 1. componentDidMount组件挂载 如果你…...

智能车竞赛指南:从零到一,驶向自动驾驶的未来

智能车竞赛指南:从零到一,驶向自动驾驶的未来 一、智能车竞赛概览1.1 竞赛介绍1.2 竞赛分类 二、智能车开发技术基础2.1 硬件平台2.2 软件开发 三、实战案例:循线小车开发3.1 系统架构3.2 代码示例 四、技术项目:基于ROS的视觉导航…...

微服务项目收获和总结---第2,3天(分库分表思想,文章业务)

①分库分表思想 文章表一对一为什么要拆分?因为文章的内容会非常大,查询效率会很低,我们经常操作文章的基本信息,不会很经常查询文章内容。充分发挥高频数据的操作效率。 ②freemarker和minIO 由于文章内容数据量过大&#xff0c…...

【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片链接,那是获取资料的入口! 【全网最全】2024电工杯数学建模A题21页初步参考论文py代码保奖思路等(后续会更新成品论文)「首先来看看目前已有的资料&#x…...

怎么通过OpenAI API调用其多模态大模型(GPT-4o)

现在只要有额度,大家都可以调用OpenAI的多模态大模型了,例如GPT-4o和GPT-4 Turbo,我一年多前总结过一些OpenAI API的用法,发现现在稍微更新了一下。主要参考了这里:https://platform.openai.com/docs/guides/vision 其…...

自定义文字线性

...

robosuite导入自定义机器人

目录 目的:案例一:成果展示具体步骤:URDF文件准备xml文件生成xml修改机器人构建 目的: 实现其他标准/非标准机器人的构建 案例一: 成果展示 添加机器人JAKA ZU 7 这个模型 具体步骤: URDF文件准备 从…...

四天学会JS高阶(学好vue的关键)——构造函数数据常用函数(理论+实战)(第二天)

一、对象创建引发构造函数产生 1.1 创建对象三种方式: 利用对象字面量创建对象 const obj {name: 佩奇}注:对象字面量的由来:即它是直接由字面形式(由源代码直接)创建出来的对象,而不是通过构造函数或者…...

【Linux学习】进程地址空间与写时拷贝

文章目录 Linux进程内存布局图&#xff1a;内存布局的验证 进程地址空间写时拷贝 Linux进程内存布局图&#xff1a; 地址空间的范围&#xff0c;在32位机器上是2^32比特位,也就是[0,4G]。 内存布局的验证 代码验证内存布局&#xff1a; 验证代码&#xff1a; #include<s…...

Git远程控制

文章目录 1. 创建仓库1.1 Readme1.2 Issue1.3 Pull request 2. 远程仓库克隆3. 推送远程仓库4. 拉取远程仓库5. 配置Git.gitignore配置别名 使用GitHub可以&#xff0c;采用Gitee也行 1. 创建仓库 1.1 Readme Readme文件相当于这个仓库的说明书&#xff0c;gitee会初始化2两份…...

怎样从SQL中分析和提取访问的字段信息?| OceanBase实践

当执行任意一条SELECT SQL语句时&#xff0c;我们如何能够分析出所访问的字段信息&#xff0c;并进一步判断结果集中的每一列数据具体来自于哪些数据库、表以及表中的哪些字段呢&#xff1f;本文将会详细阐述针对此问题的技术解决方案。 应用场景 从 SQL 中解析访问的原始字段…...

MySQL 服务无法启动

常见原因: 检查端口占用&#xff1a; 使用命令行工具&#xff08;如netstat&#xff09;来检查3306端口是否已被其他程序占用,输入netstat -ano&#xff08;Windows&#xff09;或netstat -tulnp | grep 3306&#xff08;Linux/Mac&#xff09;来查找3306端口的占用情况。如果…...

Python贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种常见的算法设计策略&#xff0c;它在每一步选择当前最优解&#xff0c;希望通过局部最优解最终得到全局最优解。贪心算法通常适用于满足一些特定条件的问题&#xff0c;例如货币找零、活动选择、任务调度等。贪心算法的…...

牛客网刷题 | BC85 牛牛学数列3

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 牛牛准备继续进阶&…...

quartz定时任务

Quartz 数据结构 quartz采用完全二叉树&#xff1a;除了最后一层每一层节点都是满的&#xff0c;而且最后一层靠左排列。 二叉树节点个数规则&#xff1a;每层从左开始&#xff0c;第一层只有一个&#xff0c;就是2的0次幂&#xff0c;第二层两个就是2的1次幂&#xff0c;第三…...

Python基础学习笔记(五)——选择结构与循环结构

目录 程序的组织结构条件选择结构1. 单分支结构2. 双分支结构3. 多分支结构4. 嵌套&#xff08;分支&#xff09;结构5. 无内容执行6. 条件表达式 循环结构1. 可迭代对象2. range()函数3. for循环语句4. while循环语句5. 结束语句 程序的组织结构 程序的组织结构主要有以下三种…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

mcts蒙特卡洛模拟树思想

您这个观察非常敏锐&#xff0c;而且在很大程度上是正确的&#xff01;您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些&#xff0c;您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”&#xff0c;这个观察非…...

前端打包工具简单介绍

前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry&#xff08;入口&#xff09; 指定应用的起点文件&#xff0c;比如 src/index.js。 Module&#xff08;模块&#xff09; Webpack 把项目当作模块图&#xff0c;模块可以是 JS、CSS、图片等…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下&#xff0c;数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统&#xff0c;还是初创…...