Koordinator-NodeSLO

news2025/4/15 5:14:13

Reconcile()

  • 获取node和nodeSLO,设置nodeExist和nodeSLOExist
  • node和nodeSLO都不存在,直接返回
  • 若!nodeExist
    • 删除对应nodeSLO
  • 若!nodeSLOExist
    • 初始化nodeSLO
    • 创建nodeSLO
  • 若nodeExist和nodeSLOExist都存在
    • 获取nodeSLOSpec,若nodeSLOSpec改变了,则更新nodeSLO。
func (r *NodeSLOReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    // reconcile for 2 things:
    //   1. ensuring the NodeSLO exists iff the Node exists
    //   2. update NodeSLO Spec
    _ = log.FromContext(ctx, "node-slo-reconciler", req.NamespacedName)
    // if cache unavailable, requeue the req
    if !r.sloCfgCache.IsCfgAvailable() {
        // all nodes would be enqueued once the config is available, so here we just drop the req
        klog.Warningf("slo config is not available, drop the req %v until a valid config is set",
            req.NamespacedName)
        return ctrl.Result{}, nil
    }
    // get the node
    nodeExist := true
    nodeName := req.Name
    node := &corev1.Node{}
    err := r.Client.Get(context.TODO(), req.NamespacedName, node)
    if err != nil {
        if !errors.IsNotFound(err) {
            metrics.RecordNodeSLOReconcileCount(false, "reconcileNodeGetError")
            klog.Errorf("failed to find node %v, error: %v", nodeName, err)
            return ctrl.Result{Requeue: true}, err
        }
        nodeExist = false
    }
    // get the nodeSLO
    nodeSLOExist := true
    nodeSLOName := req.Name
    nodeSLO := &slov1alpha1.NodeSLO{}
    err = r.Client.Get(context.TODO(), req.NamespacedName, nodeSLO)
    if err != nil {
        if !errors.IsNotFound(err) {
            metrics.RecordNodeSLOReconcileCount(false, "reconcileNodeSLOGetError")
            klog.Errorf("failed to find nodeSLO %v, error: %v", nodeName, err)
            return ctrl.Result{Requeue: true}, err
        }
        nodeSLOExist = false
    }
    // NodeSLO lifecycle management
    if !nodeExist && !nodeSLOExist {
        // do nothing if both does not exist
        return ctrl.Result{}, nil
    } else if !nodeExist {
        // delete CR if only the nodeSLO exists
        err = r.Client.Delete(context.TODO(), nodeSLO)
        if err != nil {
            if errors.IsNotFound(err) {
                klog.V(4).Infof("failed to delete nodeSLO %v because error: %v", nodeSLOName, err)
                return ctrl.Result{}, nil
            }
            metrics.RecordNodeSLOReconcileCount(false, "deleteNodeSLO")
            klog.Errorf("failed to delete nodeSLO %v, error: %v", nodeSLOName, err)
            return reconcile.Result{Requeue: true}, err
        }
        metrics.RecordNodeSLOReconcileCount(true, "deleteNodeSLO")
        return ctrl.Result{}, nil
    } else if !nodeSLOExist {
        // create and initialize CR if only the node exists
        if err = r.initNodeSLO(node, nodeSLO); err != nil {
            klog.Errorf("failed to init nodeSLO instance %v: %v", nodeSLOName, err)
            return ctrl.Result{Requeue: true}, err
        }
        err = r.Client.Create(context.TODO(), nodeSLO)
        if err != nil {
            metrics.RecordNodeSLOReconcileCount(false, "createNodeSLO")
            klog.Errorf("failed to create nodeSLO instance %v: %v", nodeSLOName, err)
            return ctrl.Result{Requeue: true}, err
        }
        metrics.RecordNodeSLOReconcileCount(true, "createNodeSLO")
    } else {
        // update nodeSLO spec if both exists
        nodeSLOSpec, err := r.getNodeSLOSpec(node, &nodeSLO.Spec)
        if err != nil {
            klog.Errorf("failed to get nodeSLO %v, spec: %v", nodeSLOName, err)
            return ctrl.Result{Requeue: true}, err
        }
        if !reflect.DeepEqual(nodeSLOSpec, &nodeSLO.Spec) {
            nodeSLO.Spec = *nodeSLOSpec
            err = r.Client.Update(context.TODO(), nodeSLO)
            if err != nil {
                metrics.RecordNodeSLOReconcileCount(false, "updateNodeSLO")
                klog.Errorf("failed to update nodeSLO %v, error: %v", nodeSLOName, err)
                return ctrl.Result{Requeue: true}, err
            }
            metrics.RecordNodeSLOReconcileCount(true, "updateNodeSLO")
        }
    }
    klog.V(6).Infof("nodeslo-controller succeeded to update nodeSLO %v", nodeSLOName)
    return ctrl.Result{}, nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理 整体布局分左右,左边调试,右边显示接口列表 左侧: 一个输入框按钮;下面展示信息,大部分使用代码编辑器就好了,除了请求体传文件类型需要额外处理。然后再下方显示响应信…

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符,整个运算符会将宏的参数转换为字符串字面量,它仅可以出现在带参数的宏的替换列表中,我们可以将其理解为字符串化。 我们先看下面的一段代码: 第二个printf中是由两个字符串组成的&am…

低频rfid手持机,助力动物耳标智能化管理

低频RFID手持机,助力动物耳标智能化管理,正逐步成为现代畜牧业不可或缺的工具。它不仅能够高效读取动物耳标中的信息,如唯一识别码、疫苗接种记录、健康状态等,还极大地提升了数据录入的准确性和时效性。 1.精准识别与追踪‌ 通过…

【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap&am…

Jieba分词的原理及应用(三)

前言 “结巴”中文分词:做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景,在喂给模型之前需要进行分词操作。 分词的手段有很多,其中最常用的手段还是Jieba库进行…

Openlayers:flat样式介绍

在前段时间我在使用WebGL矢量图层时接触到了flat样式,我对其十分的感兴趣,于是我花了几天的时间对其进行了了解,在这篇文章中我将简单的介绍一下flat样式的使用方式以及我对其的一些理解。 一、了解flat样式 1.什么是flat样式? …

149页研读——华为基于IPD全过程研发质量管理【附全文阅读】

本文介绍了IPD(集成产品开发)的全过程研发质量管理,强调了以客户需求为导向,通过跨部门协同、资源整合、快速响应等方式提高研发效率和成功率。文章详细阐述了IPD研发管理体系的精要,包括其核心思想、优势、框架以及核心理念。 其中,跨领域平台与技术研发、端到端流程与项…

Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)

文章目录 Oracle 23ai Vector Search 系列之5 向量索引Oracle 23ai支持的向量索引类型内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index)磁盘上的邻居分区矢量索引 (Neighbor Partition Vector Index) 创建向量索引HNSW索引IVF索引 向量索引示例参考 Windows 环…

vue模拟扑克效果

vue模拟扑克效果 效果图&#xff1a; step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"poker-container"><!-- 使用复合数据对象实现双行显示 --><divv-for"(card, index) in POKER_…

Android12源码编译之预置Android Studio项目Android.mk文件编写

1、在AndroidManifest.xml文件中添加package"com.sprd.silentinstalldemo"属性&#xff0c;因为新版本的Android Studio默认生成的AndroidManifest.xml是没有这个属性值的 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:an…

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…

leetcode刷题日记——螺旋矩阵

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求按顺时针顺序给出m行n列的矩阵的数组按照题目所给的顺序挨个插入答案数组中运行如下 int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize matrixSize * matrixCol…

模板引擎语法-标签

模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…

当Browser Use遇见A2A:浏览器自动化与智能体协作的“冰与火之歌“

——一场正在改写数字文明的技术奇遇 第一章 浏览器革命&#xff1a;从"手动挡"到"自动驾驶" 1.1 传统自动化工具的"中年危机" 还记得2023年那个抓狂的凌晨吗&#xff1f;你蹲守演唱会门票时&#xff0c;Selenium脚本因为验证码识别失败第108次…

(已解决)如何安装python离线包及其依赖包 2025最新

字数 305&#xff0c;阅读大约需 2 分钟 没有网络的Linux服务器上&#xff0c;如何安装完整的、离线的python包 1. 写入待安装的包 新建requirement.txt, 写入待安装的包 和 包的版本 如 flwr1.13.0 2.使用命令行直接下载 pip download -d flwr_packages -r requirements.tx…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中&#xff0c;内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新&#xff0c;深入剖析消防体系内部管理的痛点&#xff0c;以自主研发的消防一体化安全管控平台&#xff0c;为行业发展提供了创…

拓扑排序 —— 2. 力扣刷题207. 课程表

题目链接&#xff1a;https://leetcode.cn/problems/course-schedule/description/ 题目难度&#xff1a;中等 相关标签&#xff1a;拓扑排序 / 广度优先搜搜 BFS / 深度优先搜索 DFS 2.1 问题与分析 2.1.1 原题截图 2.1.2 题目分析 首先&#xff0c;理解题目后必须马上意识到…

【STM32】ST7789屏幕驱动

目录 CubeMX配置 配置SPI 开DMA 时钟树 堆栈大小 Keil工程配置 添加两个group 添加文件包含路径 驱动编写 写单字节函数 写字函数 写多字节函数 初始化函数 设置窗口函数 情况一&#xff1a;正常的0度旋转 情况二&#xff1a;顺时针90度旋转 情况三&#xff1…

10min速通Linux文件传输

实验环境 在Linux中传输文件需要借助网络以及sshd&#xff0c;我们可通过systemctl status sshd来查看sshd状态 若服务未开启我们可通过systemctl enable --now sshd来开启sshd服务 将/etc/ssh/sshd_config中的PermitRootLogin 状态修改为yes 传输文件 scp scp &#xff08;Sec…