当前位置: 首页 > article >正文

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

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

写一个小功能,对于 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.kler.cn/a/520454.html

相关文章:

  • [MoeCTF 2022]ezhtml
  • 2014年蓝桥杯第五届CC++大学B组真题及代码
  • 【Postman接口测试】接口用例设计实战—以聚合数据的新闻头条接口为例
  • pytorch卷积的入门操作
  • 深入理解Pytest中的Setup和Teardown
  • LLM大模型推理中的常见数字
  • Windows上通过Git Bash激活Anaconda
  • 【算法】图解面试笔试热点二叉树相关算法题汇总
  • 人工智能:从基础到前沿
  • el-autocomplete组件模糊查询及显示空白解决方法
  • 【蓝桥杯】43695.填字母游戏
  • 【Linux】gcc/g++的使用
  • 淘宝商品数据解析的具体步骤是什么?
  • go单元测试和基准测试
  • wow-agent---task4 MetaGPT初体验
  • CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)
  • MATLAB编写遗传算法【Genetic Algorithm(GA)】求解函数最大值
  • [NOIP2007]矩阵取数游戏
  • 开发技巧,vue 中的动态组件的引用 component + is
  • 性能测试网络风险诊断有哪些?