在 Pod 中设置 net.ipv4.tcp_timestamps=0



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

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

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

在 Kubernetes 中,sysctl被分为safeunsafe

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

  • 不得对节点上的任何其他 Pod 产生任何影响
  • 不得允许损害节点的健康
  • 不得允许获取超出 Pod 资源限制的 CPU 或内存资源。

到目前为止,大多数命名空间的sysctls 不一定被认为是安全的安全设置支持以下系统:

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

只能以这种方式启用命名空间的sysctl。

这在启用不安全的 Sysctls k8s 文档中有所提及。

至于,为 Pod 设置 sysctls:

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

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

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

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

此示例使用 pod securityContext 设置一个安全 sysctlkernel.shm_rmid_forced和两个不安全的 sysctlnet.core.somaxconnkernel.msgmax。规范中没有安全和不安全系统之间的区别。

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禁用TCP时间戳的优缺点以及TCP时间戳带来什么好处的问题。

相关内容

最新更新