树叶云kubernetes教程:Kubernetes 在Kubernetes集群中使用sysctl

在 Kubernetes 集群中使用 sysctl

FEATURE STATE: Kubernetes v1.21 [stable]

本文档介绍如何通过 sysctl 接口在 Kubernetes 集群中配置和使用内核参数。

Note: 从 Kubernetes 1.23 版本开始,kubelet 支持使用 / 或 . 作为 sysctl 参数的分隔符。 例如,你可以使用点或者斜线作为分隔符表示相同的 sysctl 参数,以点作为分隔符表示为: ​kernel.shm_rmid_forced​, 或者以斜线作为分隔符表示为:​kernel/shm_rmid_forced​。 更多 sysctl 参数转换方法详情请参考 Linux man-pages sysctl.d(5) 。 设置 Pod 的 Sysctl 参数 和 PodSecurityPolicy 功能尚不支持设置包含斜线的 Sysctl 参数。

在开始之前

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

  • Katacoda
  • 玩转 Kubernetes

对一些步骤,你需要能够重新配置在你的集群里运行的 kubelet 命令行的选项。

获取 Sysctl 的参数列表

在 Linux 中,管理员可以通过 sysctl 接口修改内核运行时的参数。在 ​/proc/sys/​ 虚拟文件系统下存放许多内核参数。这些参数涉及了多个内核子系统,如:

  • 内核子系统(通常前缀为: ​kernel.​)
  • 网络子系统(通常前缀为: ​net.​)
  • 虚拟内存子系统(通常前缀为: ​vm.​)
  • MDADM 子系统(通常前缀为: ​dev.​)
  • 更多子系统请参见内核文档

若要获取完整的参数列表,请执行以下命令

sudo sysctl -a

启用非安全的 Sysctl 参数 

sysctl 参数分为 安全 和 非安全的。 安全 sysctl 参数除了需要设置恰当的命名空间外,在同一 node 上的不同 Pod 之间也必须是 相互隔离的。这意味着在 Pod 上设置 安全 sysctl 参数

  • 必须不能影响到节点上的其他 Pod
  • 必须不能损害节点的健康
  • 必须不允许使用超出 Pod 的资源限制的 CPU 或内存资源。

至今为止,大多数 有命名空间的 sysctl 参数不一定被认为是 安全 的。 以下几种 sysctl 参数是 安全的:

  • kernel.shm_rmid_forced
  • net.ipv4.ip_local_port_range
  • net.ipv4.tcp_syncookies
  • net.ipv4.ping_group_range​ (从 Kubernetes 1.18 开始)
  • net.ipv4.ip_unprivileged_port_start​ (从 Kubernetes 1.22 开始)

Note: 示例中的 ​net.ipv4.tcp_syncookies​ 在Linux 内核 4.4 或更低的版本中是无命名空间的。

在未来的 Kubernetes 版本中,若 kubelet 支持更好的隔离机制,则上述列表中将会 列出更多 安全的 sysctl 参数。

所有 安全的 sysctl 参数都默认启用。

所有 非安全的 sysctl 参数都默认禁用,且必须由集群管理员在每个节点上手动开启。 那些设置了不安全 sysctl 参数的 Pod 仍会被调度,但无法正常启动。

参考上述警告,集群管理员只有在一些非常特殊的情况下(如:高可用或实时应用调整), 才可以启用特定的 非安全的 sysctl 参数。 如需启用 非安全的 sysctl 参数,请你在每个节点上分别设置 kubelet 命令行参数,例如:

kubelet --allowed-unsafe-sysctls \
  'kernel.msg*,net.core.somaxconn' ...

如果你使用 Minikube,可以通过 ​extra-config​ 参数来配置:

minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.core.somaxconn"...

只有 有命名空间的 sysctl 参数可以通过该方式启用。

设置 Pod 的 Sysctl 参数

目前,在 Linux 内核中,有许多的 sysctl 参数都是 有命名空间的 。 这就意味着可以为节点上的每个 Pod 分别去设置它们的 sysctl 参数。 在 Kubernetes 中,只有那些有命名空间的 sysctl 参数可以通过 Pod 的 securityContext 对其进行配置。

以下列出有命名空间的 sysctl 参数,在未来的 Linux 内核版本中,此列表可能会发生变化。

  • kernel.shm*
  • kernel.msg*
  • kernel.sem
  • fs.mqueue.*
  • net.*​(内核中可以在容器命名空间里被更改的网络配置项相关参数)。然而也有一些特例 (例如,​net.netfilter.nf_conntrack_max​ 和 ​net.netfilter.nf_conntrack_expect_max​ 可以在容器命名空间里被更改,但它们是非命名空间的)

没有命名空间的 sysctl 参数称为 节点级别的 sysctl 参数。 如果需要对其进行设置,则必须在每个节点的操作系统上手动地去配置它们, 或者通过在 DaemonSet 中运行特权模式容器来配置。

可使用 Pod 的 securityContext 来配置有命名空间的 sysctl 参数, securityContext 应用于同一个 Pod 中的所有容器。

此示例中,使用 Pod SecurityContext 来对一个安全的 sysctl 参数 ​kernel.shm_rmid_forced​ 以及两个非安全的 sysctl 参数 ​net.core.somaxconn​ 和 ​kernel.msgmax​ 进行设置。 在 Pod 规约中对 安全的 和 非安全的 sysctl 参数不做区分。

Warning: 为了避免破坏操作系统的稳定性,请你在了解变更后果之后再修改 sysctl 参数。

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 参数其本身具有不稳定性,在使用 非安全的 sysctl 参数 时可能会导致一些严重问题,如容器的错误行为、机器资源不足或节点被完全破坏, 用户需自行承担风险。

最佳实践方案是将集群中具有特殊 sysctl 设置的节点视为 有污点的,并且只调度 需要使用到特殊 sysctl 设置的 Pod 到这些节点上。 建议使用 Kubernetes 的 污点和容忍度特性 来实现它。

设置了 非安全的 sysctl 参数的 Pod 在禁用了这两种 非安全的 sysctl 参数配置 的节点上启动都会失败。与 节点级别的 sysctl 一样,建议开启 污点和容忍度特性 或 为节点配置污点 以便将 Pod 调度到正确的节点之上。

PodSecurityPolicy

FEATURE STATE: Kubernetes v1.21 [deprecated]

你可以通过在 PodSecurityPolicy 的 ​forbiddenSysctls​ 或 ​allowedUnsafeSysctls ​字段中,指定 sysctl 或填写 sysctl 匹配模式来进一步为 Pod 设置 sysctl 参数。 sysctl 参数匹配模式以 ​*​ 字符结尾,如 ​kernel.*​。 单独的 ​*​ 字符匹配所有 sysctl 参数。

所有 安全的 sysctl 参数都默认启用。

forbiddenSysctls ​和 ​allowedUnsafeSysctls ​的值都是字符串列表类型, 可以添加 sysctl 参数名称,也可以添加 sysctl 参数匹配模式(以*结尾)。 只填写 ​*​ 则匹配所有的 sysctl 参数。

forbiddenSysctls ​字段用于禁用特定的 sysctl 参数。 你可以在列表中禁用安全和非安全的 sysctl 参数的组合。 要禁用所有的 sysctl 参数,请设置为 ​*​。

如果要在 ​allowedUnsafeSysctls ​字段中指定一个非安全的 sysctl 参数, 并且它在 ​forbiddenSysctls ​字段中未被禁用,则可以在 Pod 中通过 PodSecurityPolicy 启用该 sysctl 参数。 若要在 PodSecurityPolicy 中开启所有非安全的 sysctl 参数, 请设 ​allowedUnsafeSysctls ​字段值为 ​*​。

allowedUnsafeSysctls ​与 ​forbiddenSysctls ​两字段的配置不能重叠, 否则这就意味着存在某个 sysctl 参数既被启用又被禁用。

Warning: 如果你通过 PodSecurityPolicy 中的 ​allowedUnsafeSysctls ​字段将非安全的 sysctl 参数列入白名单,但该 sysctl 参数未通过 kubelet 命令行参数 ​--allowed-unsafe-sysctls​ 在节点上将其列入白名单,则设置了这个 sysctl 参数的 Pod 将会启动失败。

以下示例设置启用了以 ​kernel.msg​ 为前缀的非安全的 sysctl 参数,同时禁用了 sysctl 参数 ​kernel.shm_rmid_forced​。

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: sysctl-psp
spec:
  allowedUnsafeSysctls:
  - kernel.msg*
  forbiddenSysctls:
  - kernel.shm_rmid_forced
 ...

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/162952.html<

(0)
管理的头像管理
上一篇2025-03-18 22:28
下一篇 2025-03-18 22:30

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注