目前剃袍,在 Linux 內(nèi)核中,有許多的 sysctl 參數(shù)都是 有命名空間的 捎谨。 這就意味著可以為節(jié)點(diǎn)上的每個 Pod 分別去設(shè)置它們的 sysctl 參數(shù)民效。 在 Kubernetes 中,只有那些有命名空間的 sysctl 參數(shù)可以通過 Pod 的 securityContext 對其進(jìn)行配置涛救。
以下列出有命名空間的 sysctl 參數(shù)畏邢,在未來的 Linux 內(nèi)核版本中,此列表可能會發(fā)生變化检吆。
- kernel.shm*,
- kernel.msg*,
- kernel.sem,
- fs.mqueue.,
- net.(內(nèi)核中可以在容器命名空間里被更改的網(wǎng)絡(luò)配置項(xiàng)相關(guān)參數(shù))舒萎。然而也有一些特例 (例如,net.netfilter.nf_conntrack_max 和 net.netfilter.nf_conntrack_expect_max 可以在容器命名空間里被更改蹭沛,但它們是非命名空間的)臂寝。
沒有命名空間的 sysctl 參數(shù)稱為 節(jié)點(diǎn)級別的 sysctl 參數(shù)章鲤。 如果需要對其進(jìn)行設(shè)置,則必須在每個節(jié)點(diǎn)的操作系統(tǒng)上手動地去配置它們咆贬, 或者通過在 DaemonSet 中運(yùn)行特權(quán)模式容器來配置败徊。
可使用 Pod 的 securityContext 來配置有命名空間的 sysctl 參數(shù), securityContext 應(yīng)用于同一個 Pod 中的所有容器素征。
在運(yùn)行一個容器時集嵌,有時候需要使用sysctl修改內(nèi)核參數(shù),比如net.御毅、vm.根欧、kernel等,sysctl需要容器擁有超級權(quán)限端蛆,容器啟動時加上--privileged參數(shù)即可凤粗。那么,在k8s中是如何使用的呢今豆?
使用sysctl
sysctl -a可以獲取sysctl所有參數(shù)列表嫌拣。
從v1.4開始,kubernetes將sysctl分為safe和unsafe呆躲,其對safe的sysctl定義如下:
- 不會影響該節(jié)點(diǎn)的其他pod
- 不會影響節(jié)點(diǎn)的正常運(yùn)行
- 不會獲取超出resource limits范圍的CPU和內(nèi)存資源
目前屬于safe sysctl的有:
- kernel.shm_rmid_forced
- net.ipv4.ip_local_port_range
- net.ipv4.tcp_syncookies
其余的都是unsafe sysctl异逐,當(dāng)kubelet支持更好的隔離機(jī)制時,safe sysctl列表將在未來的Kubernetes版本中擴(kuò)展插掂。
如果日后kubelete支持更好的隔離機(jī)制,這份支持的安全列表將會擴(kuò)展灰瞻, 所有安全sysctls默認(rèn)被開啟。
所有的非安全sysctls默認(rèn)被關(guān)閉,管理員必須手動在pod級別啟動.包含非安全sysctls的pod仍然會被調(diào)度,但是將啟動失敗辅甥。請牢記以上警告,集群管理員可以在特殊情況下,比如為了高性能或者時實(shí)應(yīng)用系統(tǒng)優(yōu)化,可以啟動相應(yīng)的sysctls.sysctl可以通過kubelet在節(jié)點(diǎn)級別啟動
即需要在想要開啟sysctl的節(jié)點(diǎn)上手動啟動.如果要在多個節(jié)點(diǎn)上啟動則需要分別進(jìn)入相應(yīng)的節(jié)點(diǎn)進(jìn)行設(shè)置.
·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設(shè)置Sysctls
一系列的sysctls被劃分在不同的名稱空間內(nèi).這意味著他們可以為節(jié)點(diǎn)上的pod單獨(dú)地設(shè)置.僅有名稱空間的sysctls可以通過pod的securityContext被設(shè)置
以下列出的是已知的有名稱空間的.在日后的linux內(nèi)核版本中可能會改變
- kernel.shm*,
- kernel.msg*,
- kernel.sem,
- fs.mqueue.*,
- net.*.
沒有名稱空間的systls被稱作節(jié)點(diǎn)級別sysctls.如果你需要設(shè)置它們,你必須在每個節(jié)點(diǎn)的操作系統(tǒng)上手動設(shè)置,或者通過有特權(quán)的DaemonSet來設(shè)置
使用pod的安全上下文(securityContext)來設(shè)置有名稱空間的sysctls.安全上下文對pod內(nèi)的所有容器都產(chǎn)生效果.
以下示例通過pod的安全上下文來設(shè)置一個安全的sysctl kernel.shm_rmid_forced和兩個非安全的sysctls net.ipv4.route.min_pmtu以及kernel.msgmax .在pod的spec里面,安全的sysctl和非安全的sysctl聲明并沒有區(qū)別
在生產(chǎn)環(huán)境中,僅僅在你明白了要設(shè)置的sysctl的功能時候才進(jìn)行設(shè)置,以免造成系統(tǒng)不穩(wěn)定.
POD Spec
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的非安全特征,設(shè)置非安全sysctls產(chǎn)生的后果將由你自行承擔(dān),可能產(chǎn)生的后果包含pod行為異常,資源緊張或者節(jié)點(diǎn)完全崩潰\
使用 pod 的 initContainers:
initContainers:
- command:
- sysctl
- -w
- net.ipv4.tcp_keepalive_time=180
image: busybox:1.27
name: init-sysctl
securityContext:
privileged: true
或者
initContainers:
- command:
- /bin/sh
- -c
- |
ulimit -n 65536
mount -o remount rw /sys
echo never > /sys/kernel/mm/transparent_hugepage/enabled
mount -o remount rw /proc/sys
echo 2000 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/vm/overcommit_memory
image: registry.cn-beijing.aliyuncs.com/acs/busybox:v1.29.2
imagePullPolicy: IfNotPresent
name: init-redis
resources: {}
securityContext:
privileged: true
procMount: Default
pod安全策略(PodSecurityPolicy)
你可以通過設(shè)置pod安全策略里的forbiddenSysctls(和)或者allowedUnsafeSysctls來進(jìn)一步控制哪些sysctls可以被設(shè)置.一個以結(jié)尾的sysctl,比如kernel.匹配其下面所有的sysctl
- forbiddenSysctls和allowedUnsafeSysctls均是一系列的純字符串sysctl名稱或者sysctl模板(以結(jié)尾).匹配所有的sysctl
- forbiddenSysctls將排除一系列sysctl.你可以排除一系列安全和非安全的sysctls.如果想要禁止設(shè)置任何sysctls,可以使用*
- 如果你在allowedUnsafeSysctls字段設(shè)置了非安全sysctls,并且沒有出現(xiàn)在forbiddenSysctls字段里,則使用了此pod安全策略的pods可以使用這個(些)(sysctls).如果想啟用所有的非安全sysctls,可以設(shè)置*
警告,如果你通過pod安全策略的allowedUnsafeSysctls把非安全sysctl添加到白名單(即可以執(zhí)行),但是如果節(jié)點(diǎn)級別沒有通過sysctl設(shè)置--allowed-unsafe-sysctls,pod將啟動失敗.
以下示例允許以kernel.msg開頭的sysctls被設(shè)置,但是禁止設(shè)置kernel.shm_rmid_forced
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: sysctl-psp
spec:
allowedUnsafeSysctls:
- kernel.msg*
forbiddenSysctls:
- kernel.shm_rmid_forced
...