k8s支持自定义field-selector spec.hostNetwork过滤

news2025/1/29 8:37:48

好久没写博客啦,年前写一个博客就算混过去啦😂

写一个小功能,对于 Pod,在没有 label 的情况下,支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型,只为了熟悉 APIServer 是如何构建索引向 Etcd 查询过程。

Kubernetes 版本1.17.4的,需要重新编译 APIServer。不要怪太老了😅,高版本代码这块儿没怎么变过,下载代码:

git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
git branch v1.17.4 v1.17.4 && git checkout v1.17.4

一、修改代码:

1. 修改 pkg/registry/core/pod/strategy.go:PodToSelectableFields

此处修改相当于是让 APIServer 建立了索引,可以查询到 etcd 中的资源

2. 修改 staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go: 

addConversionFuncs

此处是为了让 APIServer 识别 spec.hostNetwork 字段

3. 增加两处校验,不加也没啥影响

 修改 pkg/apis/core/validation/validation.go:validEnvDownwardAPIFieldPathExpressions

pkg/apis/core/pods/helpers.go:ConvertDownwardAPIFieldLabel(kubelet也会用到这个函数,不影响)

经过这个过程也是走读了大量代码。

二、重新编译 APIServer,这个可以搜一堆文章出来:

1. 修改 build/common.sh:

修改 KUBE_DOCKER_REGISTRY 的默认值 k8s.gcr.io 为可用镜像仓库,因为要下载

k8s.gcr.io/build-image/kube-cross:v1.13.8-1
k8s.gcr.io/build-image/debian-base:v2.0.0
k8s.gcr.io/build-image/debian-iptables:v12.0.1

可以去dockerhub找下,pull到本地也行

我只需要构建 APIServer 镜像,删除红框的几个,只保留"kube-apiserver"

执行编译指令:

WHAT=cmd/kube-apiserver KUBE_BUILD_PLATFORMS=linux/amd64 KUBE_BUILD_CONFORMANCE=n KUBE_BUILD_HYPERKUBE=n make quick-release

为了加快构建:

KUBE_BUILD_CONFORMANCE=n,不需要一致性测试(Conformance Tests)

KUBE_BUILD_HYPERKUBE=n,不构建Hyperkube镜像

如果不需要一直 pull 镜像,可以添加 KUBE_BUILD_PULL_LATEST_IMAGES=n 选项


...
+++ [0123 16:06:46] Syncing out of container
+++ [0123 16:06:56] Building tarball: src
+++ [0123 16:06:56] Building tarball: manifests
+++ [0123 16:06:56] Starting tarball: client linux-amd64
+++ [0123 16:06:56] Waiting on tarballs
+++ [0123 16:07:02] Building tarball: node linux-amd64
+++ [0123 16:07:02] Building images: linux-amd64
+++ [0123 16:07:02] Starting docker build for image: kube-apiserver-amd64
+++ [0123 16:07:21] Tagging docker image k8s.gcr.io/kube-apiserver-amd64:v1.17.4-dirty as xxx.io/kube-apiserver-amd64:v1.17.4-dirty
Untagged: xxx.io/kube-apiserver-amd64:v1.17.4-dirty
Deleted: sha256:7e2e82289173553722f6fde7696130114fbf6e1e7674d01a1d075895a1d936b5
+++ [0123 16:07:26] Deleting docker image k8s.gcr.io/kube-apiserver-amd64:v1.17.4-dirty
+++ [0123 16:07:26] Docker builds done
+++ [0123 16:07:26] Building tarball: server linux-amd64
+++ [0123 16:08:15] Building tarball: final
+++ [0123 16:08:16] Starting tarball: test linux-amd64
+++ [0123 16:08:16] Waiting on test tarballs
+++ [0123 16:09:04] Building tarball: test portable

本地会生成一个镜像压缩包:_output/release-images/amd64/kube-apiserver.tar,上传到 master 节点,或者镜像仓库。

三、部署 APIServer

如果使用 containerd 导入镜像:

sudo ctr -n=k8s.io images import kube-apiserver.tar

# 查询
sudo ctr images list

如果使用 docker 导入镜像:

sudo docker load -i kube-apiserver.tar

# 查询是否有
sudo docker images | grep kube-apiserver

编辑 /etc/kubernetes/manifests/kube-apiserver.yaml 修改镜像名和tag,过十多秒就自动重启了。

四、检查 spec.hostNetwork 是否生效:

kubectl get po --field-selector spec.hostNetwork=false -owide
NAME                           READY   STATUS    RESTARTS   AGE   IP           NODE                                      NOMINATED NODE   READINESS GATES
busybox-776bdc8757-gmr2l       1/1     Running   0          63d   11.0.0.22    node1   <none>           <none>

完成。

实际上只需要给 pod 或者其他资源打上相应的 label,使用 label-selector 查询即可,搞这些就是为了了解代码的细节和编译流程😁

该文章只是针对 Pod 字段支持自定义field-selector,当然其他类型的资源也可以按照对应的去修改

看都看了,点个赞再走吧😎

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

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

相关文章

图漾相机搭配VisionPro使用简易教程

1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0/9.5/9.6版本经测试&#xff0c;可正常打开图漾相机&#xff0c;建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载&#xff1a;https://gitee.com/percipioxyz/camport3…

【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124

MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里&#xff0c;根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件&#xff0c;根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…

【2024年华为OD机试】 (C卷,200分)- 机器人走迷宫(JavaScriptJava PythonC/C++)

一、问题描述 题目描述 房间由X * Y的方格组成&#xff0c;每个方格用坐标(x, y)描述。机器人从(0, 0)出发&#xff0c;只能向东或向北前进&#xff0c;出口在(X-1, Y-1)。房间中有一些墙壁&#xff0c;机器人不能经过。有些方格是陷阱&#xff08;B&#xff09;&#xff0c;…

DAY01 面向对象回顾、继承、抽象类

学习目标 能够写出类的继承格式public class 子类 extends 父类{}public class Cat extends Animal{} 能够说出继承的特点子类继承父类,就会自动拥有父类非私有的成员 能够说出子类调用父类的成员特点1.子类有使用子类自己的2.子类没有使用,继承自父类的3.子类父类都没有编译报…

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

&#xff08;一&#xff09;问题描述 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…

PyTorch入门 - 为什么选择PyTorch?

PyTorch入门 - 为什么选择PyTorch? Entry to PyTorch - Why PyTorch? by JacksonML $ pip install pytorch安装完毕后&#xff0c;可以使用以下命令&#xff0c;导入第三方库。 $ import pytorch

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

Linux相关概念和易错知识点(26)(命名管道、共享内存)

目录 1.命名管道 &#xff08;1&#xff09;匿名管道 -> 命名管道 ①匿名管道 ②命名管道 &#xff08;2&#xff09;命名管道的使用 ①创建和删除命名管道文件 ②命名管道文件的特性 ③命名管道和匿名管道的区别 &#xff08;3&#xff09;用命名管道实现进程间通信…

K8S 启动探测、就绪探测、存活探测

先来思考一个问题&#xff1a; 在 Deployment 执行滚动更新 web 应用的时候&#xff0c;总会出现一段时间&#xff0c;Pod 对外提供网络访问&#xff0c;但是页面访问却发生404&#xff0c;这个问题要如何解决呢&#xff1f;学完今天的内容&#xff0c;相信你会有自己的答案。 …

2024年度总结——理想的风,吹进现实

2024年悄然过去&#xff0c;留下了太多美好的回忆&#xff0c;不得不感慨一声时间过得真快啊&#xff01;旧年风雪尽&#xff0c;新岁星河明。写下这篇博客&#xff0c;记录我独一无二的2024年。这一年&#xff0c;理想的风终于吹进现实&#xff01; 如果用一句话总结这一年&am…

Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

hadoop==docker desktop搭建hadoop

hdfs map readuce yarn https://medium.com/guillermovc/setting-up-hadoop-with-docker-and-using-mapreduce-framework-c1cd125d4f7b 清理资源 docker-compose down docker system prune -f

Linux下的编辑器 —— vim

目录 1.什么是vim 2.vim的模式 认识常用的三种模式 三种模式之间的切换 命令模式和插入模式的转化 命令模式和底行模式的转化 插入模式和底行模式的转化 3.命令模式下的命令集 光标移动相关的命令 复制粘贴相关命令 撤销删除相关命令 查找相关命令 批量化注释和去…

C25.【C++ Cont】初识运算符的重载和sort函数

目录 1.为什么要引入运算符重载 2.运算符重载写法 格式 例子 示例代码 运行结果 3.sort函数 两种声明 声明1:默认情况 参数 示例代码1:排整型 示例代码2:排浮点数 ​编辑 示例代码3:排字符串 声明2:自定义情况 参数 comp比较函数的两种写法 写法1:创建比较函…

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#xff1a;如果只是贪心的话&#xff0c;容易被局部最大解锁定 方法有&#xff1a;盲目搜索&#xff0c;启发式搜索 盲目搜索&#xff1a;枚举法和蒙特卡洛模拟&#xff0c;但是样例太多花费巨量时间 所以启发式算法就来了&#xff0c;通过经验和规…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

实战网络安全:渗透测试与防御指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要课题。网络攻击的复杂性与日俱增&#xff0c;从数据泄露…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…

详解最基本的数据顺序存储结构:顺序表

新的一年&#xff0c;我觉得这张图很合适&#xff01;有梦想&#xff0c;敢拼&#xff0c;马上就是除夕了&#xff0c;希望新的一年我们逢考必过&#xff0c;事事顺心&#xff0c;看见朝阳的你是不是嘴角微微上扬&#xff01; 本篇从0基础白话文讲述顺序表的概念、用法、注意事…