# operator-numaadj
**Repository Path**: hong-xuming/operator-numaadj
## Basic Information
- **Project Name**: operator-numaadj
- **Description**: 基于Pod亲和性,通过NRI插件和Operator用于调整Pod资源配置
- **Primary Language**: Go
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2024-08-12
- **Last Updated**: 2025-01-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 🎡 介绍
本产品是一款基于Pod亲缘关系来动态调整节点资源的NRI插件。由于多处理器的服务器使用Numa架构,不同的Numa节点资源分配对Pod的性能是一个重要的影响因素。实验表明,Pod之间存在很多的网络互相行为,可以将他们视作一组具有亲缘关系的Pod。如果将这一组具有亲缘关系的Pod分配在统一Numa节点上,可以有效的降低他们的跨Numa访问次数,从而提升系统的吞吐率。
## ⛄️ 能力介绍
识别Pod之间的亲缘关系,动态调整Pod的资源分配,使节点的资源分配更加合理,从而提高系统吞吐率。
## ⚙️ 基本概念
+ **Pod**: kubernets中可以创建和管理的最小单元,也是NRI插件重新分配资源的目标。
+ **container**:容器,镜像运行的实例,Pod中可以包含多个容器,一个容器对应一个进程。容器是用来感知Pod之间亲缘关系的重要参数来源。
+ **亲缘关系**:指容器或Pod之间在一定程度上具有网络互访或内存互访的行为。
+ **net_rship**: 一个二进制程序,采用eBPF技术用来获取网络亲缘关系。
+ **crictl**:是kubernetes中的一个容器接口工具,可以用于分析容器对应的进程Id,在NRI插件中需要借助该命令行工具来解析出容器对应的进程Id。
## ✏️ 实现原理

NRI(Node Resource Interface),是节点资源接口,支持将特定逻辑插入兼容OCI的运行时,从而在容器生命周期时间点执行OCI规定范围之外的操作。NRI插件有两种运行方式,一种是NRI插件作为一个独立的进程,通过NRI Socket与CRI运行时通信;第二种是把NRI插件部署成为一个Daemonset,更方便在kubernetes上管理。因此,这里的主要原理是通过分析Pod之间的亲缘关系,然后通过NRI插件调整节点资源,将具有亲缘关系的Pod调整到合适的Numa节点上。
## 🌲 环境准备
#### 环境要求
+ 安装好kubernetes
+ containerd version 大于 1.7
+ 操作系统:openeuler 22.03-SP4,内核版本:kernel-5.10.0-230.0.0.129.oe2203sp4.aarch64
+ 安装好crictl工具
#### 环境搭建
操作系统:启动参数增加:kpti=off men_sampling_on numa_icon=enable
## 🧾 任务场景
#### 任务场景
工作节点上至少需要两个Pod,如果这两个Pod具有网络亲缘关系,NRI插件将他们调整到一个numa节点上。测试用例提供了2个Pod,分别为wrk客户端和Nginx服务器,客户端给服务器发送网络请求,并输出压测结果。可以在wrk的deployment文件中传入wrk压测参数,并通过查看Pod日志来查看吞吐率。
#### 开发流程
1. 在openeluer 22.03-SP4上安装Go和C的开发环境。
2. 定义CRD,用于描述节点资源和分配。
3. 编写NRI插件和Operator用于调整Pod的节点资源。
4. 编写grpc服务器,用于感知Pod之间的网络亲缘关系,并和NRI插件中的grpc客户端交互,发送亲缘关系拓扑结构。
## 🚀 调测验证
##### 启用NRI插件之前
0. 克隆代码仓到本地
1. 部署测试用例:
kubectl apply -f nginx-deployment.yaml
kubectl apply -f wrk-deployment.yaml
kubectl apply -f nginx-svc.yaml
2. 使用kubectl 命令查看wrk对应Pod的日志,日志的输出为压测的值
##### 启用NRI插件之后
1. 编译构建grpc服务器:make build_grpc_server (可选,代码仓已提供编译后的二进制文件)
2. 启动ebpf程序 ./net_rship -l -I 6000 -i 3000
3. 安装NRI插件:make plugin_install
4. 再次使用kubectl log命令查看wrk对应Pod日志,查看输出压测的值