kubernetes1.4新特性(一):支持sysctl命令

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」參數上設置不安全的命名空間級內核參數。

相關文章
相關標籤/搜索