【问题标题】:set net.ipv4.tcp_timestamps=0 in Pod在 Pod 中设置 net.ipv4.tcp_timestamps=0
【发布时间】:2020-05-24 21:59:29
【问题描述】:

我想在我的 k8s 集群的 Pod 中设置 net.ipv4.tcp_timestamps=0,但是它给了我错误:

sysctl: 无法统计 /proc/sys/net/ipv4/tcp_timestamps: 没有这样的文件或目录”

使用docker run 命令直接创建的容器也存在同样的问题。无论如何要在容器/Pod 中设置参数?谢谢。

【问题讨论】:

  • 我唯一的猜测是您使用的图像由于某种原因没有安装/proc/sys/。您可以尝试运行 vannilla ubuntu 映像 (docker run -t -i --name testUbuntu ubuntu:bionic bash -i) 并查看提到的文件是否存在?
  • 首先,向我们展示您运行时使用的真实 kubernetes yaml 代码。其次,请确保您正确关注此网址kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/…

标签: kubernetes kernel sysctl


【解决方案1】:

在 Kubernetes 中,sysctl 被分为safeunsafe

除了正确的命名空间之外,safe sysctl 必须在同一节点上的 pod 之间正确隔离。这意味着为一个 pod 设置 safe sysctl

  • 不得对节点上的任何其他 pod 产生任何影响
  • 不得损害节点的健康
  • 不得在 Pod 的资源限制之外获得 CPU 或内存资源。

到目前为止,大多数 命名空间 sysctl 不一定被认为是安全safe 集中支持以下 sysctl:

  • kernel.shm_rmid_forced,
  • net.ipv4.ip_local_port_range,
  • net.ipv4.tcp_syncookies

默认情况下,所有safe sysctls 都默认启用。 所有unsafe sysctls 都被禁用,需要集群管理员在每个节点上手动允许。

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

只有 namespaced sysctl 可以通过这种方式启用。

Enabling Unsafe Sysctlsk8s 文档中提到了这一点。

至于,Setting Sysctls for a Pod

许多 sysctl 在当今的 Linux 内核中是命名空间的。这意味着可以为节点上的每个 pod 独立设置它们。只有命名空间的 sysctl 可以通过 Kubernetes 中的 pod securityContext 进行配置。

已知以下 sysctl 具有命名空间。此列表可能会在 Linux 内核的未来版本中发生变化。 -kernel.shm*, -kernel.msg*, -kernel.sem, -fs.mqueue.*, - net.* 下的参数可以在容器网络命名空间中设置。但是,也有例外(例如,net.netfilter.nf_conntrack_maxnet.netfilter.nf_conntrack_expect_max 可以在容器网络命名空间中设置,但它们没有命名空间)。

没有命名空间的 Sysctl 称为 节点级 sysctls。如果您需要设置它们,您必须在每个节点的操作系统上手动配置它们,或者使用带有特权容器的 DaemonSet。

使用 pod securityContext 来配置命名空间的 sysctls。 securityContext 适用于同一个 pod 中的所有容器。

本示例使用 pod securityContext 设置一个安全 sysctl kernel.shm_rmid_forced 和两个不安全 sysctl net.core.somaxconnkernel.msgmax。规范中对 safeunsafe 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"
  ...

您可能有兴趣阅读 StackOverflow Pros and cons of disabling TCP timestampsWhat benefit is conferred by TCP timestamp? 上的以下问题。

【讨论】:

  • 你好 Crou,我检查了 kubernetes.io 的文档,似乎是 docker 的问题。基本上,我想关闭任何 Pod 中的 tcp_timestamp 参数,当我在执行到 pod 后运行“sysctl -w net.ipv4.tcp_timestamps=0”命令时失败
  • 您不能在 pod 内执行此操作。您需要设置规范以便启用它。
猜你喜欢
  • 2015-09-27
  • 2015-11-23
  • 1970-01-01
  • 2022-07-18
  • 2015-08-19
  • 2019-05-29
  • 2019-02-16
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多