我想在我的 k8s 集群的 Pod 中设置net.ipv4.tcp_timestamps=0
,但是它给了我错误:
sysctl:无法统计/proc/sys/net/ipv4/tcp_timestamps:没有这样的文件或目录"
使用docker run
命令直接创建的容器存在相同的问题。无论如何要在容器/Pod 中设置参数?谢谢。
在 Kubernetes 中,sysctl
被分为safe
和unsafe
。
除了正确的命名空间之外,还必须在同一节点上的 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_max
和net.netfilter.nf_conntrack_expect_max
,但它们是无命名空间的(。没有命名空间的系统称为节点级系统。如果需要设置它们,则必须在每个节点的操作系统上手动配置它们,或者使用具有特权容器的 DaemonSet 来配置它们。
使用 pod securityContext 来配置命名空间的 sysctl。securityContext 适用于同一 Pod 中的所有容器。
此示例使用 pod securityContext 设置一个安全 sysctl
kernel.shm_rmid_forced
和两个不安全的 sysctlnet.core.somaxconn
和kernel.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时间戳带来什么好处的问题。