云原生之深入解析K8S 1.27新特性如何简化状态服务跨集群平滑迁移
一、背景
- Kubernetes v1.26 为 StatefulSet 引入了一个新的 Alpha 级别特性,可以控制 Pod 副本的序号。从 Kubernetes v1.27 开始,此特性进级到 Beta 阶段。序数可以从任意非负数开始, 那么该如何使用此功能呢?
- StatefulSet 序号为 Pod 副本提供顺序标识。当使用 OrderedReady Pod 管理策略时, Pod 是从序号索引 0 到 N-1 顺序创建的。如今使用 Kubernetes 跨集群编排 StatefulSet 迁移具有挑战性。虽然存在备份和恢复解决方案,但这些解决方案需要在迁移之前将应用程序的副本数缩为 0。在当今这个完全互联的世界中,即使是计划内的应用停机可能也无法实现你的业务目标。
- 可以使用级联删除或 OnDelete 策略来迁移单个 Pod, 但是这很容易出错并且管理起来很乏味。当 Pod 出现故障或被逐出时,将失去 StatefulSet 控制器的自我修复优势。
- Kubernetes v1.26 使 StatefulSet 能够负责 {0…N-1} 范围内的一系列序数(序数 0、1、… 直到 N-1)。有了它,可以缩小源集群中的范围 {0…k-1},并扩大目标集群中的互补范围 {k…N-1},同时保证应用程序可用性,这使在编排跨集群迁移时保留至多一个语义(意味着最多有一个具有给定身份的 Pod 在 StatefulSet 中运行)和滚动更新行为。
- 假设在一个集群中运行 StatefulSet,并且需要将其迁移到另一个集群,需要这样做的原因有很多:
-
- 可扩展性:StatefulSet 对于集群而言规模过大,并且已经开始破坏集群中其他工作负载的服务质量;
-
- 隔离性:在一个供多个用户访问的集群中运行 StatefulSet,而命名空间隔离是不够的;
-
- 集群配置:想将 StatefulSet 迁移到另一个集群,以使用在当前集群上不存在的某些环境;
-
- 控制平面升级:想将 StatefulSet 迁移到运行着较高版本控制平面, 并且无法处承担就地升级控制平面所产生的风险或预留停机时间。
二、使用
① 先决条件
- 在集群上启用 StatefulSetStartOrdinal 特性门控,并使用自定义的 .spec.ordinals.start 创建一个 StatefulSet。
- 在此演示中,将使用新机制将 StatefulSet 从一个 Kubernetes 集群迁移到另一个,Bitnami Helm chart 将用于安装 redis-cluster。所需工具:yq、helm。
- 为此,需要两个可以访问公共网络和存储的 Kubernetes 集群,已将集群命名为 source 和 destination。具体来说:
-
- 在两个集群上都启用 StatefulSetStartOrdinal 特性门控;
-
- kubectl 的客户端配置允许我以管理员身份访问这两个集群;
-
- 两个集群上都安装了相同的 StorageClass,并设置为两个集群的默认 StorageClass,这个 StorageClass 应该提供可从一个或两个集群访问的底层存储;
-
- 一种扁平的网络拓扑,允许 Pod 向任一集群中的 Pod 发送数据包和从中接收数据包,如果在云提供商上创建集群,则此配置可能被称为私有云或私有网络。
② 步骤
- 在两个集群上创建一个用于演示的命名空间:
kubectl create ns kep-3335
- 在 source 集群中部署一个有六个副本的 Redis 集群:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install redis --namespace kep-3335 \bitnami/redis-cluster \--set persistence.size=1Gi \--set cluster.nodes=6
- 检查 source 集群中的副本状态:
kubectl exec -it redis-redis-cluster-0 -- /bin/bash -c \"redis-cli -c -h redis-redis-cluster -a $(kubectl get secret redis-redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) CLUSTER NODES;"
2ce30362c188aabc06f3eee5d92892d95b1da5c3 10.104.0.14:6379@16379 myself,master - 0 1669764411000 3 connected 10923-16383
7743661f60b6b17b5c71d083260419588b4f2451 10.104.0.16:6379@16379 slave 2ce30362c188aabc06f3eee5d92892d95b1da5c3 0 1669764410000 3 connected
961f35e37c4eea507cfe12f96e3bfd694b9c21d4 10.104.0.18:6379@16379 slave a8765caed08f3e185cef22bd09edf409dc2bcc61 0 1669764411000 1 connected
7136e37d8864db983f334b85d2b094be47c830e5 10.104.0.15:6379@16379 slave 2cff613d763b22c180cd40668da8e452edef3fc8 0 1669764412595 2 connected
a8765caed08f3e185cef22bd09edf409dc2bcc61 10.104.0.19:6379@16379 master - 0 1669764411592 1 connected 0-5460
2cff613d763b22c180cd40668da8e452edef3fc8 10.104.0.17:6379@16379 master - 0 1669764410000 2 connected 5461-10922
- 在 destination 集群中部署一个零副本的 Redis 集群:
helm install redis --namespace kep-3335 \bitnami/redis-cluster \--set persistence.size=1Gi \--set cluster.nodes=0 \--set redis.extraEnvVars\[0\].name=REDIS_NODES,redis.extraEnvVars\[0\].value="redis-redis-cluster-headless.kep-3335.svc.cluster.local" \--set existingSecret=redis-redis-cluster
- 将源集群中的 redis-redis-cluster StatefulSet 副本数缩小 1, 以删除副本 redis-redis-cluster-5:
kubectl patch sts redis-redis-cluster -p '{"spec": {"replicas": 5}}'
- 将依赖从 source 集群迁移到 destionation 集群:以下命令将依赖资源从 source 复制到 destionation,其中与 destionation 集群无关的详细信息已被删除(例如:uid、resourceVersion、status):
kubectl get pvc redis-data-redis-redis-cluster-5 -o yaml | yq 'del(.metadata.uid, .metadata.resourceVersion, .metadata.annotations, .metadata.finalizers, .status)' > /tmp/pvc-redis-data-redis-redis-cluster-5.yaml
kubectl get pv $(yq '.spec.volumeName' /tmp/pvc-redis-data-redis-redis-cluster-5.yaml) -o yaml | yq 'del(.metadata.uid, .metadata.resourceVersion, .metadata.annotations, .metadata.finalizers, .spec.claimRef, .status)' > /tmp/pv-redis-data-redis-redis-cluster-5.yaml
kubectl get secret redis-redis-cluster -o yaml | yq 'del(.metadata.uid, .metadata.resourceVersion)' > /tmp/secret-redis-redis-cluster.yaml
- 如果使用配置了 reclaimPolicy: Delete 的 StorageClass, 应该在删除之前使用 reclaimPolicy: Retain 修补 source 中的 PV, 以保留 destination 中使用的底层存储。
- 对于 PV/PVC,此过程仅在 PV 使用的底层存储系统支持复制到 destination 集群时才有效,可能不支持与特定节点或拓扑关联的存储。此外,某些存储系统可能会在 PV 对象之外存储有关卷的附加元数据,并且可能需要更专门的序列来导入卷。
kubectl create -f /tmp/pv-redis-data-redis-redis-cluster-5.yaml
kubectl create -f /tmp/pvc-redis-data-redis-redis-cluster-5.yaml
kubectl create -f /tmp/secret-redis-redis-cluster.yaml
- 将 destination 集群中的 redis-redis-cluster StatefulSet 扩容 1,起始序号为 5:
kubectl patch sts redis-redis-cluster -p '{"spec": {"ordinals": {"start": 5}, "replicas": 1}}'
- 检查 destination 集群中的副本状态:
kubectl exec -it redis-redis-cluster-5 -- /bin/bash -c \"redis-cli -c -h redis-redis-cluster -a $(kubectl get secret redis-redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) CLUSTER NODES;"
- 我应该看到新副本(标记为 myself)已加入 Redis 集群(IP 地址与 source 集群中的副本归属于不同的 CIDR 块):
2cff613d763b22c180cd40668da8e452edef3fc8 10.104.0.17:6379@16379 master - 0 1669766684000 2 connected 5461-10922
7136e37d8864db983f334b85d2b094be47c830e5 10.108.0.22:6379@16379 myself,slave 2cff613d763b22c180cd40668da8e452edef3fc8 0 1669766685609 2 connected
2ce30362c188aabc06f3eee5d92892d95b1da5c3 10.104.0.14:6379@16379 master - 0 1669766684000 3 connected 10923-16383
961f35e37c4eea507cfe12f96e3bfd694b9c21d4 10.104.0.18:6379@16379 slave a8765caed08f3e185cef22bd09edf409dc2bcc61 0 1669766683600 1 connected
a8765caed08f3e185cef22bd09edf409dc2bcc61 10.104.0.19:6379@16379 master - 0 1669766685000 1 connected 0-5460
7743661f60b6b17b5c71d083260419588b4f2451 10.104.0.16:6379@16379 slave 2ce30362c188aabc06f3eee5d92892d95b1da5c3 0 1669766686613 3 connected
- 对剩余的副本重复上面的步骤,直到 source 集群中的 Redis StatefulSet 副本缩放为 0, 并且 destination 集群中的 Redis StatefulSet 健康,总共有 6 个副本。
三、总结
- 此特性为跨集群拆分 StatefulSet 提供了一项基本支撑技术,但没有规定 StatefulSet 的迁移机制。迁移需要对 StatefulSet 副本的协调,以及对存储和网络层的编排,这取决于使用 StatefulSet 安装的应用程序的存储和网络连接要求。
- 此外,许多 StatefulSet 由 operator 管理,这也增加了额外的迁移复杂性。
相关文章:

云原生之深入解析K8S 1.27新特性如何简化状态服务跨集群平滑迁移
一、背景 Kubernetes v1.26 为 StatefulSet 引入了一个新的 Alpha 级别特性,可以控制 Pod 副本的序号。从 Kubernetes v1.27 开始,此特性进级到 Beta 阶段。序数可以从任意非负数开始, 那么该如何使用此功能呢?StatefulSet 序号为…...

鸿蒙OS:打破界限的操作系统新星
导言 鸿蒙OS(HarmonyOS)是华为公司为应对技术封锁而推出的分布式操作系统,其背后蕴含着华为构建全球数字生活愿景的雄心。本文将深入剖析鸿蒙OS的起源、核心特性,并展望其未来在数字生态中的角色。 1. 背景与起源 华为的…...

预测性维护在汽车制造行业中的应用
汽车制造行业是一个高度复杂和精细化的领域,依赖于各种设备来完成生产流程。这些设备包括机械装配线、焊接机器人、喷涂设备、传送带等。然而,这些设备在长时间运行中不可避免地会遇到各种故障,给生产进程带来延误和成本增加。为了应对这一挑…...

分布式链路追踪 —— 基于Dubbo的traceId追踪传递
文章目录 原文链接RpcContext 上下文对象Dubbo 过滤器(Filter)对象基于Dubbo的traceId追踪传递实现 原文链接 RpcContext 上下文对象 在实现 Dubbo 调用之间的链路跟踪之前,先简单了解 RpcContext 上下文对象和 Filter 过滤器对象ÿ…...

【uniapp小程序-上拉加载】
在需要上拉加载的页面的page.json上添加红框框里面的 onReachBottom() {if(this.commentCurrent<this.commentTotal){this.commentCurrent 1; this.commentList();this.status loading;}else{this.status ;} }, methods:{commentList(){let params {courseid:this.cour…...

ubuntu添加路由
ip route show 查看当前路由表 sudo ip route add /mask via 添加一条路由 目标ip 1.1.1.1/100 下一跳 2.2.2.2 sudo ip route add 1.1.1.1/100 via 2.2.2.2 dev ens160 proto static metric 100这是一条Linux命令,用于添加一个静态路由。具体含义如下࿱…...

python图像二值化处理
目录 1、双峰法 2、P参数法 3、迭代法 4、OTSU法 图像的二值化处理是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。二值化是图像分割的一种最简单的方法,可以把灰度图像转换成二值图像。具体实现是将大…...

4.配置系统时钟思路及方法
前言: 比起之前用过的三星的猎户座4412芯片,STM32F4的系统时钟可以说是小巫见大巫,首先我们需要清晰时钟产生的原理:几乎大多数的芯片都是由晶振产生一个比较低频的频率,然后通过若干个PLL得到单片机能承受的频率&…...

使用openMVS库,在VS2022中启用c++17标准编译仍然报错
使用openMVS库,在VS2022中启用c17标准编译仍然报错 现象 项目中引用了某些开源库(例如openmvs2.1.0),编译时要求启用编译器对c17的支持。 没问题!大家都知道在下图所示的位置调整C语言标准: 但是&#…...

uniGUI之上传文件UniFileUploadButton
TUniFileUploadButton主要属性: Filter: 文件类型过滤,有图片image/* audio/* video/*三种过滤 MaxAllowedSize: 设置文件最大上传尺寸; Message:标题以及消息文本,可翻译成中文 TUniFileUploadButton控件 支持多…...

福德植保无人机工厂:创新科技与绿色农业的完美结合
亲爱的读者们,欢迎来到福德植保无人机工厂的世界。这里,科技与农业的完美结合为我们描绘出一幅未来农业的新篇章。福德植保无人机工厂作为行业的领军者,以其领先的无人机技术,创新的理念,为我们展示了一种全新的农业服…...

JsRpc技术服务搭建,最简单的JSRPC,Flask+undetected-chromedriver
只需10来行代码快速实现JSRpc,最简单的JSRPC 使用Flask和undetected-chromedriver快速实现JsRpc 推荐Python版本3.7.x及以上,需要pip安装 pip install Flask pip install undetected-chromedriver __author__ jiuLiang __email__ "jiuliangef…...

<优化接口设计的思路>:接口安全
前言 一、接口安全的方式 1. 身份认证,鉴别客户端 2. 请求过程鉴权,防止请求被篡改 3. 访问控制,即控制客户端对API的访问权限 前言 某家电商平台上,用户可以通过客户端发起购物请求,并对所选商品进行下…...

Gitee基础知识
目录 1-gitee 1.1gitee介绍 1.2git与gitee的关系 1.3在国内为什么选择Gitee 2-注册与创建远程仓库 2.1注册 2.2创建远程仓库 2.3配置ssh公钥 2.3.1公钥的生成方法: 2.3.2 在gitee中配置公钥 2.3.4验证公钥 3-添加与推送远程仓库master 3.1基本命令…...

网络空间搜索引擎- FOFA的使用技巧总结
简介 FOFA是一款网络空间测绘的搜索引擎,旨在帮助用户以搜索的方式查找公网上的互联网资产。 FOFA的查询方式类似于谷歌或百度,用户可以输入关键词来匹配包含该关键词的数据。不同的是,这些数据不仅包括像谷歌或百度一样的网页,还…...

用户行为分析遇到的问题-ubantu16,hadoop3.1.3
用户行为分析传送门 我的版本 ubantu16 hadoop 3.1.3 habse 2.2.2 hive3.1.3 zookeeper3.8.3 sqoop 1.46/1.47 我sqoop把MySQL数据往hbase导数据时候有问题 重磅:大数据课程实验案例:网站用户行为分析(免费共享) 用户行为分析-小…...

camera曝光时间
曝光和传感器读数 相机上的图像采集过程由两个不同的部分组成。第一部分是曝光。曝光完成后,第二步就是从传感器的寄存器中读取数据并传输(readout)。 曝光:曝光是图像传感器进行感光的一个过程,相机曝光时间…...

Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码
问题 今天在代码里面输出 console.log 信息直接指向了 vue.js,并且代码里面写了 debgger 也不生效 解决 f12 找到浏览器的这个设置图标 找到这个 ignore list 的 custom exclusion rules 取消掉 /node_modules/|/bower_components/ 这样就正常了...

翻译: ChatGPT Token消耗粗略计算英文就是除以四分之三
在这个视频中,我想带你快速浏览一些例子,以建立对在软件应用中使用大型语言模型的实际成本的直观感受。让我们来看看。这是一些示例价格,用于从不同的大型语言模型获取提示和回应,这些模型对开发者可用。即,如果你在你…...

【线性代数】期末速通!
1. 行列式的性质 1.1 求一个行列式的值 特殊地,对角线左下全为0,结果为对角线乘积。行 r 列 c 1.2 性质 某行(列)加上或减去另一行(列)的几倍,行列式不变某行(列)乘 …...

速盾网络:业务卓越,数字安全的领先者
在数字时代的浪潮中,业务成功需要强大的数字基石。速盾网络以其出色的CDN加速、高防IP、SDK游戏盾和抗DDoS攻击等业务,成为业界领先的数字安全保障者,为您的业务提供全方位的支持与保护。 CDN加速:业务飞跃的翅膀 速盾网络以全球…...

Python 全栈体系【四阶】(七)
第四章 机器学习 六、多项式回归 1. 什么是多项式回归 线性回归适用于数据呈线性分布的回归问题。如果数据样本呈明显非线性分布,线性回归模型就不再适用(下图左),而采用多项式回归可能更好(下图右)。例…...

智能优化算法应用:基于蛾群算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于蛾群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蛾群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蛾群算法4.实验参数设定5.算法结果6.参考文献7.MA…...

Tekton 克隆 git 仓库
Tekton 克隆 git仓库 介绍如何使用 Tektonhub 官方 git-clone task 克隆 github 上的源码到本地。 git-clone task yaml文件下载地址:https://hub.tekton.dev/tekton/task/git-clone 查看git-clone task yaml内容: 点击Install,选择一种…...

高通平台开发系列讲解(AI篇)SNPE工作流程介绍
文章目录 一、转换网络模型二、量化2.1、选择量化或非量化模型2.2、使用离线TensorFlow或Caffe模型2.3、使用非量化DLC初始化SNPE2.4、使用量化DLC初始化SNPE三、准备输入数据四、运行加载网络沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍SNPE模型工作…...

YoloV8改进策略:ASF-YOLO,结合了空间和尺度特征在小目标和密集目标场景有效涨点
摘要 本文提出了一种新型的Attentional Scale Sequence Fusion based You Only Look Once (YOLO)框架(ASF-YOLO),该框架结合了空间和尺度特征,以实现准确且快速的细胞实例分割。该框架建立在YOLO分割框架之上,采用Scale Sequence Feature Fusion (SSFF)模块增强网络的多尺…...

OpenCV-8RGB和BGR颜色空间
一. RGB和BGR 最常见的色彩空间就是RGB,人眼也是基于RGB的色彩空间去分辨颜色。 OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同。 二.HSV, HSL和YUV 1.HSV(HSB) OpenCV用的最多的色彩空间是HSV. Hue:色相&…...

阿里云主导《Serverless 计算安全指南》国际标准正式立项!
日前,在韩国召开的国际电信联盟电信标准分局 ITU-T SG17 全会上,由阿里云主导的《Serverless 计算安全指南》国际标准正式立项成功。 图 1 项目信息 在现今数字化时代,Serverless 计算正逐渐成为云计算的一个新的发展方向,其灵活…...

YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
一、本文介绍 本文给大家带来的CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法(就是我们的Upsample)的性能。CARAFE的核心思想是:使用…...

AWS RDS慢日志文件另存到ES并且每天发送邮件统计慢日志
1.背景:需要对aws rds慢日志文件归档到es,让开发能够随时查看。 2.需求:并且每天把最新的慢日志,过滤最慢的5条sql 发送给各个产品线的开发负责人。 3.准备: aws ak/sk ,如果rds 在不同区域需要认证不同的…...