- 一.系統環境
- 二.前言
- 三.核心模組簡介
- 四.刪除不必要的核心模組
- 五.總結
一.系統環境
本文主要基於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特別相關的是,即使沒有特權的程序也可以透過建立適當型別的套接字來載入某些與網路協議相關的核心模組。這可能使攻擊者可以利用管理員認為未使用的核心模組中的安全漏洞。
四.刪除不必要的核心模組
建立目錄存放檔案。
root@k8scludes1:~# mkdir systemsafe
root@k8scludes1:~# cd systemsafe/
建立systemsafe名稱空間。
root@k8scludes1:~/systemsafe# kubectl create ns systemsafe
切換名稱空間到systemsafe,現在還沒有pod。
root@k8scludes1:~/systemsafe# kubens systemsafe
root@k8scludes1:~/systemsafe# kubectl get pod
No resources found in systemsafe namespace.
檢視node節點的標籤。
root@k8scludes1:~/systemsafe# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
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=
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
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。
root@k8scludes1:~/systemsafe# kubectl label nodes k8scludes3 yy=xx
檢視標籤為yy=xx的節點。
root@k8scludes1:~/systemsafe# kubectl get node -l yy=xx
NAME STATUS ROLES AGE VERSION
k8scludes3 Ready <none> 30d v1.22.2
編寫pod配置檔案,使用nginx映象建立一個pod,nodeSelector:yy: xx 表示pod執行在標籤為yy=xx的節點上。
root@k8scludes1:~/systemsafe# vim pod0.yaml
root@k8scludes1:~/systemsafe# cat pod0.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: podtest
name: podtest
spec:
#當需要關閉容器時,立即殺死容器而不等待預設的30秒優雅停機時長。
terminationGracePeriodSeconds: 0
nodeSelector:
yy: xx
containers:
- image: hub.c.163.com/library/nginx:latest
#imagePullPolicy: IfNotPresent:表示如果本地已經存在該映象,則不重新下載;否則從遠端 Docker Hub 下載該映象
imagePullPolicy: IfNotPresent
name: podtest
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
建立pod。
root@k8scludes1:~/systemsafe# kubectl apply -f pod0.yaml
pod/podtest created
檢視pod,podtest就執行在k8scludes3節點上。
root@k8scludes1:~/systemsafe# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
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命令的絕對路徑。
root@k8scludes1:~/systemsafe# which lsmod
/sbin/lsmod
搜尋/sbin/lsmod是由哪個軟體包安裝的,kmod: /sbin/lsmod表示/sbin/lsmod由kmod軟體包安裝的。
root@k8scludes1:~/systemsafe# dpkg -S /sbin/lsmod
kmod: /sbin/lsmod
進入pod裡。
root@k8scludes1:~/systemsafe# kubectl exec -it podtest -- bash
#更新軟體源
root@podtest:/# apt-get update
#安裝kmod
root@podtest:/# apt-get install kmod
#容器里載入的模組為128個
root@podtest:/# lsmod | wc -l
128
#退出pod
root@podtest:/# exit
exit
因為podtest執行在k8scludes3上,在k8scludes3節點上檢視載入的模組,可以發現:容器里載入的模組和宿主機里載入的模組是一樣的,都是128個。
root@k8scludes3:~# lsmod | wc -l
128
以i2c_piix4模組為例。
root@k8scludes3:~# lsmod | grep i2c_piix4
i2c_piix4 24576 0
刪除模組:modprobe -r i2c_piix4 ,宿主機modprobe -r i2c_piix4 刪除模組之後,pod裡i2c_piix4也被刪除了。
root@k8scludes3:~# modprobe -r i2c_piix4
root@k8scludes3:~# lsmod | grep i2c_piix4
載入模組,宿主機modprobe i2c_piix4 載入模組之後,pod裡i2c_piix4模組也載入了。
root@k8scludes3:~# modprobe i2c_piix4
注意:宿主機才有許可權載入核心模組,pod裡沒許可權。
/etc/modprobe.d/目錄裡,可以設定核心模組不自動載入。
root@k8scludes1:~/systemsafe# cd /etc/modprobe.d/
root@k8scludes1:/etc/modprobe.d# ls
amd64-microcode-blacklist.conf blacklist.conf blacklist-framebuffer.conf dkms.conf iwlwifi.conf
blacklist-ath_pci.conf blacklist-firewire.conf blacklist-rare-network.conf intel-microcode-blacklist.conf mdadm.conf
可以透過設定 blacklist 模組名 來防止系統自動載入核心模組,比如 blacklist pcspkr 系統就不會自動載入pcspkr模組。
root@k8scludes1:/etc/modprobe.d# cat blacklist.conf | grep blacklist | head -4
blacklist evbug
blacklist usbmouse
blacklist usbkbd
blacklist eepro100
五.總結
刪除不必要的核心模組可以提高系統的效能和穩定性。透過以上步驟,我們可以輕鬆地去除不必要的核心模組,最佳化系統的效能。