k8s的daemonset里判断CRD资源里定义的NodeSelector是否包含本节点

要实现一个 Kubernetes 控制器,它在 DaemonSet 容器中运行,并侦听自定义资源创建事件,然后基于自定义资源的 spec.nodeSelector 判断当前节点是否匹配,你可以根据以下步骤实现:

第 1 步:获取当前节点的标签

首先,你需要获取当前节点上的标签。这可以通过访问 Kubernetes API 来完成。

package main

import (
    "context"
    "fmt"
    "os"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)

// getNodeLabels 返回当前节点的标签。
func getNodeLabels(nodeName string) (map[string]string, error) {
    config, err := rest.InClusterConfig()
    if err != nil {
        return nil, fmt.Errorf("获取 in-cluster config 失败: %v", err)
    }

    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, fmt.Errorf("创建 clientset 失败: %v", err)
    }

    node, err := clientset.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
    if err != nil {
        return nil, fmt.Errorf("获取节点 %s 失败: %v", nodeName, err)
    }

    return node.Labels, nil
}

第 2 步:判断节点是否满足 nodeSelector

接下来,你需要一种方法来比较这些标签和自定义资源的 spec.nodeSelector,以判断当前节点是否满足条件。

// isNodeSelected 判断给定的 nodeSelector 是否选择了具有给定标签的节点。
func isNodeSelected(nodeLabels map[string]string, nodeSelector map[string]string) bool {
    for key, value := range nodeSelector {
        if val, ok := nodeLabels[key]; !ok || val != value {
            return false
        }
    }
    return true
}

完整示例

将这两部分结合,偏设你已有逻辑在适当的时间监听到自定义资源的创建,并从该资源中提取 nodeSelector。以下是如何将这些组合来判断当前节点是否被选中:

package main

import (
    "fmt"
    "os"
)

func main() {
    // 模拟接收到的 nodeSelector,实际情况你会从自定义资源中提取这个信息
    // 例如: spec.nodeSelector
    receivedNodeSelector := map[string]string{
        "disktype": "ssd",
        "gpu":      "true",
    }

    // 假设当前节点的名称通过环境变量获得
    nodeName := os.Getenv("MY_NODE_NAME")
    if nodeName == "" {
        fmt.Println("节点名称未设置")
        return
    }

    nodeLabels, err := getNodeLabels(nodeName)
    if err != nil {
        fmt.Printf("获取节点标签失败: %v\n", err)
        return
    }

    isSelected := isNodeSelected(nodeLabels, receivedNodeSelector)
    if isSelected {
        fmt.Println("当前节点被选择")
    } else {
        fmt.Println("当前节点未被选择")
    }
}

注意:MY_NODE_NAME 环境变量应该在你的 DaemonSet 定义中设置,确保它能够获取到当前节点的名称。一种常见的做法是使用 Downward API 来将节点名称作为环境变量传递给容器:

env:
- name: MY_NODE_NAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName

在实际使用中,receivedNodeSelector 应由监听到的自定义资源事件提供。这里只是简化了这部分逻辑,以便集中展示如何使用节点的标签和 nodeSelector 进行匹配。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊卖家为何需要自养账号?揭秘背后的原因

亚马逊是一家极为重视用户体验的国际电商平台,因此用户的评论和星级评价对店铺排名影响深远。平台审核评论非常严格,这些评价直接影响商品在平台上的生存和发展。 在亚马逊上,用户的评分和评论对商品的成功至关重要。好评多的商品通常被认为优…

项目管理的六个核心内容

项目管理是一个系统性和综合性的过程,涉及多个核心内容的协同管理,以确保项目能够按时、按预算、高质量的完成,以下是项目管理的六个核心内容: 一、项目目标与范围 项目目标与范围是项目管理的起点和基础,在项目启动…

【鸿蒙】ArkTS语言

HarmonyOS 应⽤的主要开发语⾔是 ArkTS,它由 TypeScript(简称TS)扩展⽽来,在继承 TypeScript语法的基础上进⾏了⼀系列优化,使开发者能够以更简洁、更⾃然的⽅式开发应⽤。 值得注意的是,TypeScript 本身也…

SecureCRT使用方法(非常简单)!!!

一、简单了解 SecureCRT是一款功能强大的终端仿真软件,广泛用于远程访问和管理服务器。它提供了丰富的功能和安全性,使得远程连接更加简单、高效和可靠。 SecureFX 可以提供安全文件传输。主要用于Linux操作系统客户端文件传输程序,该客户端…

如果一个云服务提供商没有通过等保2.0认证,客户有哪些风险?

如果一个云服务提供商没有通过等保2.0(信息安全等级保护2.0)认证,其客户可能会面临以下几类风险: 1. 安全隐患增加:等保2.0是对信息系统安全保护的一种国家标准,未通过认证可能意味着云服务提供商在安全技…

基于PHP+MySQL组合开发的在线客服小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 源码系统是专门为满足企业在线客服需求而设计的,它集成了多种功能,能够帮助企业实现与用户的实时沟通、问题解答、信息反馈等。通过该系统,企业可以更好地了解用户需求,提升用户体验,增强用户对企业的信任感…

ROS动态参数调节

一、原因 在ROS系统中,需要我们经常去修改参数的数值,传统的静态参数传递办法很难满足需求,需要我们进行动态参数调整。 二、步骤 新建ROS工作空间 mkdir turtle_traning/src -pcd src 在src在里面新建一个功能包parameter_set catkin_create_pkg parameter_set roscpp …

2024年6月上半月30篇大语言模型的论文推荐

大语言模型(LLMs)在近年来取得了快速发展。本文总结了2024年6月上半月发布的一些最重要的LLM论文,可以让你及时了解最新进展。 LLM进展与基准测试 1、WildBench: Benchmarking LLMs with Challenging Tasks from Real Users in the Wild Wi…

C#快速开发OPCUA服务器

为方便演示,此时创建一个控制台应用程序。第三方dll(C编写的库opcsrv.dll,他人实现)。 拷贝dll到运行目录下: 拷贝二次封装后的文件到项目目录下: 第一步:创建OpcUa服务器 //第一步:创建OpcUa服务器 OPCSr…

八、yolov8模型预测和模型导出(目标检测)

模型查看 模型预测 模型导出 模型训练完成后,找到训练文件生成文件夹,里面包含wights、过程图、曲线图。 模型预测 1、在以下文件夹中放入需要预测的图; 2、找到detect文件下的predict.py文件,修改以下内容。 3、右键点击…

外贸独立站应该如何做谷歌SEO外链?

通过高低搭配的外链组合来安全建设外链结构,实现外链建设效果最大化 所谓高低搭配的外链组合,就是GPB,GNB,GMB三种外链的搭配组合,GPB独立站外链,高低搭配组合的最高位外链,这种外链拥有相关的…

STARTRADER星迈:银和铜的未来前景,是否即将迎来历史新高?

随着全球经济的复苏和技术进步的加速,大宗商品市场特别是金属市场近年来表现出强劲的动态。2024年,包括白银和铜在内的大宗商品价格已连续创下多年和历史新高,被分析师誉为可能是大宗商品交易史上赚钱的一年。本文将STARTRADER外汇深入探讨白…

游戏AI的创造思路-技术基础-深度学习(5)

继续深度学习技术的探讨,填坑不断,头秃不断~~~~~ 3.5. 自编码器(AE) 3.5.1. 定义 自编码器(Autoencoder, AE)是一种数据的压缩算法,其中压缩和解压缩函数是数据相关的、有损的、从样本中自动学…

打开自动联网,设置静态IP

TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic # 设置为static DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FATALno IPV6_ADDR_GEN_MODEstable-privacy NAMEens18 UUIDce34dd13-05cb-4d6d-95e4-252355b1…

“Cannot resolve ch.qos.logback:logback-classic:1.2.3”问题解决办法

当我们添加依赖配置时,通常会遇见如下错误: 这个问题是由于项目中使用了 logback-classic 版本1.2.3,但是无法从当前所配置的仓库中解析到这个特定的版本。可以尝试检查依赖配置,确保指定的仓库中包含了 logback-classic 版本1.2.…

IIC学习笔记

目录 #I2C涉及相关知识 #I2C相关介绍 欢迎指正,希望对你,有所帮助!!! 个人学习笔记,参考文献,链接最后!!! #I2C涉及相关知识 SDA串行数据线: Ser…

以创新赋能引领鸿蒙应用开发,凡泰极客亮相华为HDC2024

6月21日至23日,华为开发者大会2024在松山湖举行。大会现场,华为发布了HarmonyOS、盘古大模型等方面最新进展。国内外众多企业齐聚一堂,共迎新商机、共创新技术、共享新体验。 凡泰极客作为鸿蒙生态的重要战略合作伙伴,同时也是鸿…

Gobject tutorial 十

参考:GLib – 2.0: The Main Event Loop The Main Event Loop 主事件循环管理所有可用的事件源,事件可以是各种类型、各种数量的。比如说文件描述符(普通文件、管道以及套接字)和超时。 新类型的事件源可以通过函数g_source_attach来添加。为了使多个…

硬件开发笔记(十九):Altium Designer 21软件介绍和安装过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139706278 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

java运维交接项目逆向工程

​ 背景 有承接过Java项目运维的团队估计都处理过的一件事情,就是同步生产代码跟本地代码,条件再差些甚至要直接基于生产部署包逆向本地源码工程。而哪怕是原运维团队交接了源码,往往也会历史久远的原因,给了一份不太可靠的源码…