sysctl是一個容許改變正在運行中的Linux系統內核參數的接口。能夠經過sysctl修改Linux系統內核中的TCP/IP 堆棧和虛擬內存系統的高級選項,並且不須要從新啓動Linux系統,就能夠實現優化Linux系統和提升應用進程運行性能。 |
經過Linux系統中的/proc虛擬文件系統來實現動態配置Linux系統內核參數,在/proc/sys目錄下有Linux系統絕大多數的內核參數,這些內核參數能夠在Linux系統運行時進行修改,而且不須要從新啓動Linux系統即可以馬上生效,可是這種修改在從新啓動Linux系統後便會失效,要是想永久生效的話,須要更改配置文件/etc/sysctl.conf中相應的內核參數配置項。linux
能夠經過下面命令獲取sysctl能夠操做的全部內核參數配置項和已經配置的數值:緩存
# sysctl –a 這些內核參數主要包括下面幾類配置項: 全局內核配置項:以「kernel.」爲配置項前綴,舉例: kernel.shmmax = 33554432(共享內存段的最大尺寸,以字節爲單位) kernel.threads-max = 139264(Linux內核所能使用的線程最大數量) 網絡配置項:以「net.」爲配置項前綴,舉例: net.ipv4.ipfrag_low_thresh = 196608(用於IP分片匯聚的最小內存用量) net.ipv4.ipfrag_high_thresh = 262144(用於IP分片匯聚的最大內存用量) 虛擬內存配置項:以「vm.」爲配置項前綴,舉例: vm.swappiness = 60(減小系統對於swap頻繁的寫入,將加快應用程序之間的切換,有助於提高系統性能) vm.dirty_ratio = 40(該文件表示若是進程產生的廢數據到達系統總體內存的百分比,此時進程自信把廢數據寫回磁盤) 設備專用配置項:以「dev.」爲配置項前綴,舉例: dev.raid.speed_limit_max = 200000(須要初始化同步RAID的同步最大速度限制) dev.raid.speed_limit_min = 1000(須要初始化同步RAID的同步最小速度限制) 文件系統專用配置項:以「fs.」爲配置項前綴 fs.file-max = 779703(能夠分配的文件句柄的最大數目) fs.file-nr = 3930 0 779703(已分配文件句柄的數目,已使用文件句柄的數目,文件句柄的最大數目,該文件是隻讀的,僅用於顯示信息)
容器相關內核參數安全
上面介紹了經過sysctl能夠操做Linux系統內核參數,在這些內核參數中,有些不可是操做系統全局級別的內核參數,仍是命名空間級別的內核參數。對於容器來講,是經過命名空間實現隔離的,那麼就意味着這些命名空間級別的參數是容器相關的內核參數。cookie
Linux系統命名空間的分類以下:網絡
命名空間級別的內核參數包括: kernel.shm*(內核中共享內存相關參數),舉例: kernel.shmall = 3774873(可使用的共享內存的總量) kernel.shmmax = 15461882265(單個共享內存段的最大值) kernel.msg*(內核中SystemV消息隊列相關參數) kernel.msgmnb = 16384(每一個消息隊列的最大字節限制) kernel.msgmni = 128(同時運行的最大的消息隊列個數) kernel.sem(內核中信號量參數) kernel.sem = 250 32000 100 128(每一個信號集中的最大信號量數目、系統範圍內的最大信號量總數目、每一個信號發生時的最大系統操做數目、系統範圍內的最大信號集總數目) fs.mqueue.*(內核中POSIX消息隊列相關參數) fs.mqueue. msg_max = 32678(隊列裏緩存的軟最大消息數目) fs.mqueue. msgsize_max = 8192(最大消息長度上限) net.*(內核中網絡配置項相關參數) net.ipv4.ipfrag_low_thresh = 196608(用於IP分片匯聚的最小內存用量) net.ipv4.ipfrag_high_thresh = 262144(用於IP分片匯聚的最大內存用量)
新特性app
由於sysctl能夠修改命名空間級別的內核參數,因此在Kubernetes1.4中經過sysctl來配置POD中Linux內核參數的功能,經過修改POD中Linux內核參數,能夠優化POD性能,提高POD中容器運行效率。在Kubernetes1.4中這仍是一個阿爾法特性。tcp
修改Linux內核參數存在安全風險,修改錯誤極可能會下降系統性能,甚至會引發系統崩潰,因此須要謹慎對待。在Kubernetes1.4中將命名空間級別的內核參數分紅了兩類,一類是安全的內核參數,一類是不安全的內核參數。所謂安全的命名空間級別內核參數,就是要可以實現相同節點上不一樣POD之間的徹底隔離,要知足以下條件:性能
不能對相同節點上其餘POD產生任何影響 不能對節點上操做系統健康形成影響 不能在POD資源限制之外獲取更多的CPU和內存資源 根據上面三個條件能夠發現,大多數的命名空間級別內核參數都不是安全的。在Kubernetes1.4中,認爲下面的命名空間級別內核參數是安全的: kernel.shm_rmid_forced = 1(表示是否強制將共享內存和一個進程聯繫在一塊兒,這樣的話能夠經過殺死進程來釋放共享內存) net.ipv4.ip_local_port_range =1024 65000(表示容許使用的端口範圍) net.ipv4.tcp_syncookies = 1(表示是否打開TCP同步標籤,同步標籤能夠防止一個套接字在有過多試圖鏈接時引發過載)
在Kubernetes之後的版本中,還會繼續擴充安全的命名空間級別內核參數。在Kubernetes中,全部安全的命名空間級別內核參數默認都是啓用狀態的,全部不安全的命名空間級別內核參數默認都是禁用狀態的,若是想設置不安全的內核參數,須要Kubernetes管理員手工啓用。若是管理員沒有手工啓用不安全的內核參數,那麼Kubernetes仍然會進行調度,將這些帶有不安全內核參數的POD分配到節點上,可是這些POD在啓動時會失敗。優化
在啓動kubelet時經過增長參數「experimental-allowed-unsafe-sysctls」來啓用不安全的命名空間級別內核參數:操作系統
能夠在POD配置文件中設置已經被啓用的命名空間級別內核參數:
上面的配置文件在POD中設置了安全的命名空間級內核參數:kernel.shm_rmid_forced,而且在POD中設置了兩個不安全的命名空間級內核參數:net.ipv4.route.min_pmte和kernet.msgmax。
在annotations中的「security.alpha.kubernetes.io/sysctls」參數上設置安全的命名空間級內核參數,在annotations中的「security.alpha.kubernetes.io/unsafe-sysctls」參數上設置不安全的命名空間級內核參數。