系列目錄html
在linux系統裏,sysctls 接口容許管理員在運行時修改內核參數.參數存在於/proc/sys/
虛擬進程文件系統裏.參數涉及到不少子模塊,例如:linux
內核(kernel)(常見前綴kernel.
)api
網絡(networking)(常見前綴net.
)安全
虛擬內存(virtual memory) (常見前綴 vm.
)bash
MDADM(常見前綴dev.
)cookie
sysctls分爲安全和非安全的.除了合理地劃分名稱空間外一個安全的sysctl必須在同一個節點上的pod間是隔離的.這就意味着爲一個pod設置安全的sysctl須要考慮如下:網絡
必須不能影響同一節點上的其它podtcp
必須不能危害節點的健康性能
必須不能獲取自身pod所限制之外的cpu或內存資源優化
截至目前,大部分名稱空間下的sysctls都不被認爲是安全的.如下列出被kubernetes安全支持:
kernel.shm_rmid_forced
net.ipv4.ip_local_port_range
net.ipv4.tcp_syncookies
若是往後kubelete支持更好的隔離機制,這份支持的安全列表將會擴展
全部安全sysctls默認被開啓
全部的非安全sysctls默認被關閉,管理員必須手動在pod級別啓動.包含非安全sysctls的pod仍然會被調度,可是將啓動失敗.
請牢記以上警告,集羣管理員能夠在特殊狀況下,好比爲了高性能或者時實應用系統優化,能夠啓動相應的sysctls.sysctl能夠經過kubelet
在節點級別啓動
即須要在想要開啓sysctl的節點上手動啓動.若是要在多個節點上啓動則須要分別進入相應的節點進行設置.
kubelet --allowed-unsafe-sysctls \ 'kernel.msg*,net.ipv4.route.min_pmtu' ...
對於minikube,則能夠經過extra-config
來配置
minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.ipv4.route.min_pmtu"...
僅有名稱空間的sysctls能夠經過這種方式開啓
Sysctls
一系列的sysctls被劃分在不一樣的名稱空間內.這意味着他們能夠爲節點上的pod單獨地設置.僅有名稱空間的sysctls能夠經過pod的securityContext
被設置
如下列出的是已知的有名稱空間的.在往後的linux內核版本中可能會改變
kernel.shm*,
kernel.msg*,
kernel.sem,
fs.mqueue.*,
net.*.
沒有名稱空間的systls被稱做節點級別sysctls.若是你須要設置它們,你必須在每一個節點的操做系統上手動設置,或者經過有特權的DaemonSet來設置
使用pod的安全上下文(securityContext)來設置有名稱空間的sysctls.安全上下文對pod內的全部容器都產生效果.
如下示例經過pod的安全上下文來設置一個安全的sysctl kernel.shm_rmid_forced
和兩個非安全的sysctls net.ipv4.route.min_pmtu
以及kernel.msgmax
.在pod的spec裏面,安全的sysctl和非安全的sysctl聲明並無區別
在生產環境中,僅僅在你明白了要設置的sysctl的功能時候才進行設置,以避免形成系統不穩定.
apiVersion: v1 kind: Pod metadata: name: sysctl-example spec: securityContext: sysctls: - name: kernel.shm_rmid_forced value: "0" - name: net.ipv4.route.min_pmtu value: "552" - name: kernel.msgmax value: "65536" ...
因爲非安全sysctls的非安全特徵,設置非安全sysctls產生的後果將由你自行承擔,可能產生的後果包含pod行爲異常,資源緊張或者節點徹底崩潰
你能夠經過設置pod安全策略裏的forbiddenSysctls
(和)或者allowedUnsafeSysctls
來進一步控制哪些sysctls能夠被設置.一個以*
結尾的sysctl,好比kernel.*
匹配其下面全部的sysctl
forbiddenSysctls
和allowedUnsafeSysctls
均是一系列的純字符串sysctl名稱或者sysctl模板(以*
結尾).*匹配全部的sysctl
forbiddenSysctls
將排除一系列sysctl.你能夠排除一系列安全和非安全的sysctls.若是想要禁止設置任何sysctls,可使用*
若是你在allowedUnsafeSysctls
字段設置了非安全sysctls,而且沒有出如今forbiddenSysctls
字段裏,則使用了此pod安全策略的pods可使用這個(些)(sysctls).若是想啓用全部的非安全sysctls,能夠設置*
警告,若是你經過pod安全策略的
allowedUnsafeSysctls
把非安全sysctl添加到白名單(便可以執行),可是若是節點級別沒有經過sysctl設置--allowed-unsafe-sysctls
,pod將啓動失敗.
如下示例容許以kernel.msg
開頭的sysctls被設置,可是禁止設置kernel.shm_rmid_forced
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: sysctl-psp spec: allowedUnsafeSysctls: - kernel.msg* forbiddenSysctls: - kernel.shm_rmid_forced ...