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

devtools/2024/9/24 16:28:06/

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

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

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

package mainimport ("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 mainimport ("fmt""os"
)func main() {// 模拟接收到的 nodeSelector,实际情况你会从自定义资源中提取这个信息// 例如: spec.nodeSelectorreceivedNodeSelector := 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_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName

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


http://www.ppmy.cn/devtools/56513.html

相关文章

vue封装接口

找到src下的api 在里面创建一个名为Api.js的文件 1,在里面写入接口 import axios from axios//先引入axiosexport async function menusIndex(data) {//这个data代表传过来的值return axios({url: 要请求的地址,method: POST,data,}) } 2,在页面中 …

Vue3面试题

1. vue2和vue3区别 vue2和vue3双向绑定的方法不同 vue2:Object.defineProperty——>后添加的属性劫持不到——>因此用到了$set来解决数据更新了但视图没更新的问题 vue3: new Proxy——>即使是后添加的属性,也可以劫持到——>vue3中没有$set…

Vue2和Vue3的区别

注:本文提到的Vue2版本是2.6.10; 双向绑定:监听对象属性变化的底层方法不同; 2中使用的是Object.defineProperty;3中则使用Proxy拦截; Object.defineProperty 简单的写个方法,让监听对象属性的setter和…

Java SPI服务发现与扩展的利器

Java中,为了实现模块之间的解耦和可扩展性,我们常常需要一种机制来动态加载和替换实现。Java SPI就是这样一种机制,它允许我们在不修改原有代码的情况下,为接口添加新的实现,并在运行时动态加载它们。 SPI&#xff0c…

算法力扣刷题记录 十四【349. 两个数组的交集】及unordered_set用法

前言 哈希表结构篇,第二题。 记录十四:力扣【349.两个数组的交集】 加油,继续。 一、 题目阅读 给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例…

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例:创建一个webScoket实例对象1.1、WebSocket.Server(options[,callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…

Qt调用第三方库的通用方式(静态链接库.a或.lib、动态链接库.dll)

目录 一、前提 二、如何引用静态链接库 三、如何引用动态链接库 四、示例代码资源 在开发项目中经常会存在需要调用第三方库的时候,对于Qt如何来调用第三方库,为了方便自己特意记录下详细过程。 一、前提 1. window 10操作系统 2. 已安装了Qt6.7.…

福昕PDF编辑器(Foxit PDF Editor)修改成中文显示

双击打开Foxit PDF Editor 点击File->Preferences 从左侧下拉菜单找到Languages选项点击,然后在右边选择Chinese-Simplfied(简体中文),点击OK 点击下面的Restart Now立刻重启Foxit PDF Editor软件 重启后,发现软件已…