kubernetes高級之集羣中使用sysctls

系列目錄html

在linux系統裏,sysctls 接口容許管理員在運行時修改內核參數.參數存在於/proc/sys/虛擬進程文件系統裏.參數涉及到不少子模塊,例如:linux

  • 內核(kernel)(常見前綴kernel.)api

  • 網絡(networking)(常見前綴net.)安全

  • 虛擬內存(virtual memory) (常見前綴 vm.)bash

  • MDADM(常見前綴dev.)cookie

啓用非安全sysctls

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能夠經過這種方式開啓

爲pod設置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安全策略(PodSecurityPolicy)

你能夠經過設置pod安全策略裏的forbiddenSysctls(和)或者allowedUnsafeSysctls來進一步控制哪些sysctls能夠被設置.一個以*結尾的sysctl,好比kernel.*匹配其下面全部的sysctl

forbiddenSysctlsallowedUnsafeSysctls均是一系列的純字符串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
 ...
相關文章
相關標籤/搜索