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

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

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

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

bash 复制代码
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 中的资源

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

addConversionFuncs

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

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

修改 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可用镜像仓库,因为要下载

bash 复制代码
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"

执行编译指令:

bash 复制代码
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 选项

bash 复制代码
...
+++ [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 导入镜像:

bash 复制代码
sudo ctr -n=k8s.io images import kube-apiserver.tar

# 查询
sudo ctr images list

如果使用 docker 导入镜像:

bash 复制代码
sudo docker load -i kube-apiserver.tar

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

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

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

bash 复制代码
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,当然其他类型的资源也可以按照对应的去修改

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

相关推荐
GoWjw9 分钟前
Linux虚拟文件系统(1)
运维·服务器·数据库
SunTecTec35 分钟前
Linux grep -r 查找依赖包是否存在依赖类 Class
linux·运维·服务器
Johny_Zhao1 小时前
AI+自动化测试系统方案:网络设备与网络应用智能测试
linux·网络·人工智能·python·网络安全·docker·ai·信息安全·云计算·ansible·shell·cisco·huawei·系统运维·itsm·华三·deepseek
Javis2111 小时前
【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现
linux·运维·php
FBI HackerHarry浩1 小时前
Linux云计算训练营笔记day10(MySQL数据库)
linux·运维·数据库·笔记·mysql
南暮思鸢1 小时前
vulnhub靶场——secarmy
linux·网络安全·vulnhub靶场·write up·secarmy
掘金-我是哪吒2 小时前
分布式微服务系统架构第134集:笔记1运维服务器经验,高并发,大数据量系统
运维·笔记·分布式·微服务·系统架构
YOYO--小天2 小时前
RK3588 ADB使用
linux·嵌入式硬件·adb
猴子请来的逗比4892 小时前
tomcat查看状态页及调优信息
服务器·学习·tomcat·firefox
Strugglingler2 小时前
Shell 脚本
linux·bash·shell