Kubernetes 在Kubernetes集群中使用sysctl

2022-06-07 11:58 更新

在 Kubernetes 集群中使用 sysctl

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ù)。

在開(kāi)始之前

你必須擁有一個(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)。

獲取 Sysctl 的參數(shù)列表

在 Linux 中,管理員可以通過(guò) sysctl 接口修改內(nèi)核運(yùn)行時(shí)的參數(shù)。在 ?/proc/sys/? 虛擬文件系統(tǒng)下存放許多內(nèi)核參數(shù)。這些參數(shù)涉及了多個(gè)內(nèi)核子系統(tǒng),如:

  • 內(nèi)核子系統(tǒng)(通常前綴為: ?kernel.?)
  • 網(wǎng)絡(luò)子系統(tǒng)(通常前綴為: ?net.?)
  • 虛擬內(nèi)存子系統(tǒng)(通常前綴為: ?vm.?)
  • MDADM 子系統(tǒng)(通常前綴為: ?dev.?)
  • 更多子系統(tǒng)請(qǐng)參見(jiàn)內(nèi)核文檔

若要獲取完整的參數(shù)列表,請(qǐng)執(zhí)行以下命令

sudo sysctl -a

啟用非安全的 Sysctl 參數(shù) 

sysctl 參數(shù)分為 安全 和 非安全的。 安全 sysctl 參數(shù)除了需要設(shè)置恰當(dāng)?shù)拿臻g外,在同一 node 上的不同 Pod 之間也必須是 相互隔離的。這意味著在 Pod 上設(shè)置 安全 sysctl 參數(shù)

  • 必須不能影響到節(jié)點(diǎn)上的其他 Pod
  • 必須不能損害節(jié)點(diǎn)的健康
  • 必須不允許使用超出 Pod 的資源限制的 CPU 或內(nèi)存資源。

至今為止,大多數(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ò)該方式啟用。

設(shè)置 Pod 的 Sysctl 參數(shù)

目前,在 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)之上。

PodSecurityPolicy

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
 ...


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)