W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
FEATURE STATE: Kubernetes v1.21 [stable]
本文檔介紹如何通過(guò) sysctl 接口在 Kubernetes 集群中配置和使用內(nèi)核參數(shù)。
Note: 從 Kubernetes 1.23 版本開(kāi)始,kubelet 支持使用 / 或 . 作為 sysctl 參數(shù)的分隔符。 例如,你可以使用點(diǎn)或者斜線作為分隔符表示相同的 sysctl 參數(shù),以點(diǎn)作為分隔符表示為: ?
kernel.shm_rmid_forced
?, 或者以斜線作為分隔符表示為:?kernel/shm_rmid_forced
?。 更多 sysctl 參數(shù)轉(zhuǎn)換方法詳情請(qǐng)參考 Linux man-pages sysctl.d(5) 。 設(shè)置 Pod 的 Sysctl 參數(shù) 和 PodSecurityPolicy 功能尚不支持設(shè)置包含斜線的 Sysctl 參數(shù)。
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
對(duì)一些步驟,你需要能夠重新配置在你的集群里運(yùn)行的 kubelet 命令行的選項(xiàng)。
在 Linux 中,管理員可以通過(guò) sysctl 接口修改內(nèi)核運(yùn)行時(shí)的參數(shù)。在 ?/proc/sys/
? 虛擬文件系統(tǒng)下存放許多內(nèi)核參數(shù)。這些參數(shù)涉及了多個(gè)內(nèi)核子系統(tǒng),如:
kernel.
?)
net.
?)
vm.
?)
dev.
?)
若要獲取完整的參數(shù)列表,請(qǐng)執(zhí)行以下命令
sudo sysctl -a
sysctl 參數(shù)分為 安全 和 非安全的。 安全 sysctl 參數(shù)除了需要設(shè)置恰當(dāng)?shù)拿臻g外,在同一 node 上的不同 Pod 之間也必須是 相互隔離的。這意味著在 Pod 上設(shè)置 安全 sysctl 參數(shù)
至今為止,大多數(shù) 有命名空間的 sysctl 參數(shù)不一定被認(rèn)為是 安全 的。 以下幾種 sysctl 參數(shù)是 安全的:
kernel.shm_rmid_forced
?net.ipv4.ip_local_port_range
?net.ipv4.tcp_syncookies
?net.ipv4.ping_group_range
? (從 Kubernetes 1.18 開(kāi)始)
net.ipv4.ip_unprivileged_port_start
? (從 Kubernetes 1.22 開(kāi)始)Note: 示例中的 ?
net.ipv4.tcp_syncookies
? 在Linux 內(nèi)核 4.4 或更低的版本中是無(wú)命名空間的。
在未來(lái)的 Kubernetes 版本中,若 kubelet 支持更好的隔離機(jī)制,則上述列表中將會(huì) 列出更多 安全的 sysctl 參數(shù)。
所有 安全的 sysctl 參數(shù)都默認(rèn)啟用。
所有 非安全的 sysctl 參數(shù)都默認(rèn)禁用,且必須由集群管理員在每個(gè)節(jié)點(diǎn)上手動(dòng)開(kāi)啟。 那些設(shè)置了不安全 sysctl 參數(shù)的 Pod 仍會(huì)被調(diào)度,但無(wú)法正常啟動(dòng)。
參考上述警告,集群管理員只有在一些非常特殊的情況下(如:高可用或?qū)崟r(shí)應(yīng)用調(diào)整), 才可以啟用特定的 非安全的 sysctl 參數(shù)。 如需啟用 非安全的 sysctl 參數(shù),請(qǐng)你在每個(gè)節(jié)點(diǎn)上分別設(shè)置 kubelet 命令行參數(shù),例如:
kubelet --allowed-unsafe-sysctls \
'kernel.msg*,net.core.somaxconn' ...
如果你使用 Minikube,可以通過(guò) ?extra-config
? 參數(shù)來(lái)配置:
minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.core.somaxconn"...
只有 有命名空間的 sysctl 參數(shù)可以通過(guò)該方式啟用。
目前,在 Linux 內(nèi)核中,有許多的 sysctl 參數(shù)都是 有命名空間的 。 這就意味著可以為節(jié)點(diǎn)上的每個(gè) Pod 分別去設(shè)置它們的 sysctl 參數(shù)。 在 Kubernetes 中,只有那些有命名空間的 sysctl 參數(shù)可以通過(guò) Pod 的 securityContext 對(duì)其進(jìn)行配置。
以下列出有命名空間的 sysctl 參數(shù),在未來(lái)的 Linux 內(nèi)核版本中,此列表可能會(huì)發(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
? 可以在容器命名空間里被更改,但它們是非命名空間的)沒(méi)有命名空間的 sysctl 參數(shù)稱(chēng)為 節(jié)點(diǎn)級(jí)別的 sysctl 參數(shù)。 如果需要對(duì)其進(jìn)行設(shè)置,則必須在每個(gè)節(jié)點(diǎn)的操作系統(tǒng)上手動(dòng)地去配置它們, 或者通過(guò)在 DaemonSet 中運(yùn)行特權(quán)模式容器來(lái)配置。
可使用 Pod 的 securityContext 來(lái)配置有命名空間的 sysctl 參數(shù), securityContext 應(yīng)用于同一個(gè) Pod 中的所有容器。
此示例中,使用 Pod SecurityContext 來(lái)對(duì)一個(gè)安全的 sysctl 參數(shù) ?kernel.shm_rmid_forced
? 以及兩個(gè)非安全的 sysctl 參數(shù) ?net.core.somaxconn
? 和 ?kernel.msgmax
? 進(jìn)行設(shè)置。 在 Pod 規(guī)約中對(duì) 安全的 和 非安全的 sysctl 參數(shù)不做區(qū)分。
Warning: 為了避免破壞操作系統(tǒng)的穩(wěn)定性,請(qǐng)你在了解變更后果之后再修改 sysctl 參數(shù)。
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
securityContext:
sysctls:
- name: kernel.shm_rmid_forced
value: "0"
- name: net.core.somaxconn
value: "1024"
- name: kernel.msgmax
value: "65536"
...
Warning: 由于 非安全的 sysctl 參數(shù)其本身具有不穩(wěn)定性,在使用 非安全的 sysctl 參數(shù) 時(shí)可能會(huì)導(dǎo)致一些嚴(yán)重問(wèn)題,如容器的錯(cuò)誤行為、機(jī)器資源不足或節(jié)點(diǎn)被完全破壞, 用戶(hù)需自行承擔(dān)風(fēng)險(xiǎn)。
最佳實(shí)踐方案是將集群中具有特殊 sysctl 設(shè)置的節(jié)點(diǎn)視為 有污點(diǎn)的,并且只調(diào)度 需要使用到特殊 sysctl 設(shè)置的 Pod 到這些節(jié)點(diǎn)上。 建議使用 Kubernetes 的 污點(diǎn)和容忍度特性 來(lái)實(shí)現(xiàn)它。
設(shè)置了 非安全的 sysctl 參數(shù)的 Pod 在禁用了這兩種 非安全的 sysctl 參數(shù)配置 的節(jié)點(diǎn)上啟動(dòng)都會(huì)失敗。與 節(jié)點(diǎn)級(jí)別的 sysctl 一樣,建議開(kāi)啟 污點(diǎn)和容忍度特性 或 為節(jié)點(diǎn)配置污點(diǎn) 以便將 Pod 調(diào)度到正確的節(jié)點(diǎn)之上。
FEATURE STATE: Kubernetes v1.21 [deprecated]
你可以通過(guò)在 PodSecurityPolicy 的 ?forbiddenSysctls
? 或 ?allowedUnsafeSysctls
?字段中,指定 sysctl 或填寫(xiě) sysctl 匹配模式來(lái)進(jìn)一步為 Pod 設(shè)置 sysctl 參數(shù)。 sysctl 參數(shù)匹配模式以 ?*
? 字符結(jié)尾,如 ?kernel.*
?。 單獨(dú)的 ?*
? 字符匹配所有 sysctl 參數(shù)。
所有 安全的 sysctl 參數(shù)都默認(rèn)啟用。
?forbiddenSysctls
?和 ?allowedUnsafeSysctls
?的值都是字符串列表類(lèi)型, 可以添加 sysctl 參數(shù)名稱(chēng),也可以添加 sysctl 參數(shù)匹配模式(以*結(jié)尾)。 只填寫(xiě) ?*
? 則匹配所有的 sysctl 參數(shù)。
?forbiddenSysctls
?字段用于禁用特定的 sysctl 參數(shù)。 你可以在列表中禁用安全和非安全的 sysctl 參數(shù)的組合。 要禁用所有的 sysctl 參數(shù),請(qǐng)?jiān)O(shè)置為 ?*
?。
如果要在 ?allowedUnsafeSysctls
?字段中指定一個(gè)非安全的 sysctl 參數(shù), 并且它在 ?forbiddenSysctls
?字段中未被禁用,則可以在 Pod 中通過(guò) PodSecurityPolicy 啟用該 sysctl 參數(shù)。 若要在 PodSecurityPolicy 中開(kāi)啟所有非安全的 sysctl 參數(shù), 請(qǐng)?jiān)O(shè) ?allowedUnsafeSysctls
?字段值為 ?*
?。
?allowedUnsafeSysctls
?與 ?forbiddenSysctls
?兩字段的配置不能重疊, 否則這就意味著存在某個(gè) sysctl 參數(shù)既被啟用又被禁用。
Warning: 如果你通過(guò) PodSecurityPolicy 中的 ?
allowedUnsafeSysctls
?字段將非安全的 sysctl 參數(shù)列入白名單,但該 sysctl 參數(shù)未通過(guò) kubelet 命令行參數(shù) ?--allowed-unsafe-sysctls
? 在節(jié)點(diǎn)上將其列入白名單,則設(shè)置了這個(gè) sysctl 參數(shù)的 Pod 將會(huì)啟動(dòng)失敗。
以下示例設(shè)置啟用了以 ?kernel.msg
? 為前綴的非安全的 sysctl 參數(shù),同時(shí)禁用了 sysctl 參數(shù) ?kernel.shm_rmid_forced
?。
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: sysctl-psp
spec:
allowedUnsafeSysctls:
- kernel.msg*
forbiddenSysctls:
- kernel.shm_rmid_forced
...
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: