经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
删除不必要的内核模块
来源:cnblogs  作者:人生的哲理  时间:2024/5/29 9:10:18  对本文有异议

一.系统环境

本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu 18.04。

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 kube-bench版本 CPU架构
Ubuntu 18.04.5 LTS Docker version 20.10.14 v1.22.2 0.6.7 x86_64

Kubernetes集群架构:k8scludes1作为master节点,k8scludes2,k8scludes3作为worker节点。

服务器 操作系统版本 CPU架构 进程 功能描述
k8scludes1/192.168.110.128 Ubuntu 18.04.5 LTS x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scludes2/192.168.110.129 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scludes3/192.168.110.130 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

在现代的云计算环境中,Kubernetes 无疑是最重要的技术之一。而作为 Kubernetes 的运行环境,Linux 操作系统也显得尤为重要。本文将讲解如何去除不必要的内核模块,以提高系统的性能和稳定性。

本文是在kubernetes环境下进行操作的,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Ubuntu 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/17632858.html。

三.内核模块简介

内核模块是 Linux 内核的一部分,它是一个内核功能的集合,可以在不重新编译内核的情况下加载和卸载。内核模块为系统提供了许多功能,但同时也增加了系统的复杂性和开销。在不必要的内核模块没有被禁用的情况下,它们可能会消耗系统的资源,降低系统的性能。

对于容器来说,修改容器里的内核参数,实际上修改的是宿主机的内核参数,宿主机加载某个内核模块,容器里也会加载该内核模块。

操作系统默认有很多内核模块,有些内核模块我们根本用不着,如果某个内核模块存在漏洞,在pod里利用该漏洞,控制服务器干坏事,就存在安全隐患,所以对于没有必要的内核模块是没必要加载的。

Linux内核会根据需要从磁盘自动加载内核模块。与Kubernetes特别相关的是,即使没有特权的进程也可以通过创建适当类型的套接字来加载某些与网络协议相关的内核模块。这可能使攻击者可以利用管理员认为未使用的内核模块中的安全漏洞。

四.删除不必要的内核模块

创建目录存放文件。

  1. root@k8scludes1:~# mkdir systemsafe
  2. root@k8scludes1:~# cd systemsafe/

创建systemsafe命名空间。

  1. root@k8scludes1:~/systemsafe# kubectl create ns systemsafe

切换命名空间到systemsafe,现在还没有pod。

  1. root@k8scludes1:~/systemsafe# kubens systemsafe
  2. root@k8scludes1:~/systemsafe# kubectl get pod
  3. No resources found in systemsafe namespace.

查看node节点的标签。

  1. root@k8scludes1:~/systemsafe# kubectl get nodes --show-labels
  2. NAME STATUS ROLES AGE VERSION LABELS
  3. k8scludes1 Ready control-plane,master 30d v1.22.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scludes1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
  4. k8scludes2 Ready <none> 30d v1.22.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scludes2,kubernetes.io/os=linux
  5. k8scludes3 Ready <none> 30d v1.22.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scludes3,kubernetes.io/os=linux

给k8scludes3节点设置一个标签yy=xx。

  1. root@k8scludes1:~/systemsafe# kubectl label nodes k8scludes3 yy=xx

查看标签为yy=xx的节点。

  1. root@k8scludes1:~/systemsafe# kubectl get node -l yy=xx
  2. NAME STATUS ROLES AGE VERSION
  3. k8scludes3 Ready <none> 30d v1.22.2

编写pod配置文件,使用nginx镜像创建一个pod,nodeSelector:yy: xx 表示pod运行在标签为yy=xx的节点上。

  1. root@k8scludes1:~/systemsafe# vim pod0.yaml
  2. root@k8scludes1:~/systemsafe# cat pod0.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. creationTimestamp: null
  7. labels:
  8. run: podtest
  9. name: podtest
  10. spec:
  11. #当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
  12. terminationGracePeriodSeconds: 0
  13. nodeSelector:
  14. yy: xx
  15. containers:
  16. - image: hub.c.163.com/library/nginx:latest
  17. #imagePullPolicy: IfNotPresent:表示如果本地已经存在该镜像,则不重新下载;否则从远程 Docker Hub 下载该镜像
  18. imagePullPolicy: IfNotPresent
  19. name: podtest
  20. resources: {}
  21. dnsPolicy: ClusterFirst
  22. restartPolicy: Always
  23. status: {}

创建pod。

  1. root@k8scludes1:~/systemsafe# kubectl apply -f pod0.yaml
  2. pod/podtest created

查看pod,podtest就运行在k8scludes3节点上。

  1. root@k8scludes1:~/systemsafe# kubectl get pod -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. podtest 1/1 Running 0 18s 10.244.1.122 k8scludes3 <none> <none>

lsmod(list modules)命令用于显示已载入系统的模块。

执行 lsmod 指令,会列出所有已载入系统的模块,比如:drm 401408 4 vmwgfx,drm_kms_helper,ttm

  • 第1列:表示模块的名称,如drm表示drm模块;
  • 第2列:表示模块的大小,如401408表示drm模块的大小为401408字节;
  • 第3列:表示依赖于该模块的个数,如4表示有4个模块依赖drm模块;
  • 第4列:表示依赖模块的内容。

查看lsmod命令的绝对路径。

  1. root@k8scludes1:~/systemsafe# which lsmod
  2. /sbin/lsmod

搜索/sbin/lsmod是由哪个软件包安装的,kmod: /sbin/lsmod表示/sbin/lsmod由kmod软件包安装的。

  1. root@k8scludes1:~/systemsafe# dpkg -S /sbin/lsmod
  2. kmod: /sbin/lsmod

进入pod里。

  1. root@k8scludes1:~/systemsafe# kubectl exec -it podtest -- bash
  2. #更新软件源
  3. root@podtest:/# apt-get update
  4. #安装kmod
  5. root@podtest:/# apt-get install kmod
  6. #容器里加载的模块为128个
  7. root@podtest:/# lsmod | wc -l
  8. 128
  9. #退出pod
  10. root@podtest:/# exit
  11. exit

因为podtest运行在k8scludes3上,在k8scludes3节点上查看加载的模块,可以发现:容器里加载的模块和宿主机里加载的模块是一样的,都是128个。

  1. root@k8scludes3:~# lsmod | wc -l
  2. 128

以i2c_piix4模块为例。

  1. root@k8scludes3:~# lsmod | grep i2c_piix4
  2. i2c_piix4 24576 0

删除模块:modprobe -r i2c_piix4 ,宿主机modprobe -r i2c_piix4 删除模块之后,pod里i2c_piix4也被删除了。

  1. root@k8scludes3:~# modprobe -r i2c_piix4
  2. root@k8scludes3:~# lsmod | grep i2c_piix4

加载模块,宿主机modprobe i2c_piix4 加载模块之后,pod里i2c_piix4模块也加载了。

  1. root@k8scludes3:~# modprobe i2c_piix4

注意:宿主机才有权限加载内核模块,pod里没权限。

/etc/modprobe.d/目录里,可以设置内核模块不自动加载。

  1. root@k8scludes1:~/systemsafe# cd /etc/modprobe.d/
  2. root@k8scludes1:/etc/modprobe.d# ls
  3. amd64-microcode-blacklist.conf blacklist.conf blacklist-framebuffer.conf dkms.conf iwlwifi.conf
  4. blacklist-ath_pci.conf blacklist-firewire.conf blacklist-rare-network.conf intel-microcode-blacklist.conf mdadm.conf

可以通过设置 blacklist 模块名 来防止系统自动加载内核模块,比如 blacklist pcspkr 系统就不会自动加载pcspkr模块。

  1. root@k8scludes1:/etc/modprobe.d# cat blacklist.conf | grep blacklist | head -4
  2. blacklist evbug
  3. blacklist usbmouse
  4. blacklist usbkbd
  5. blacklist eepro100

五.总结

删除不必要的内核模块可以提高系统的性能和稳定性。通过以上步骤,我们可以轻松地去除不必要的内核模块,优化系统的性能。

原文链接:https://www.cnblogs.com/renshengdezheli/p/18218274

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号