为什么linux系统在普通的docker中修改工作,而不是在kubernetes下?

在容器中运行的命令是:

echo never | tee /sys/kernel/mm/transparent_hugepage/enabled

这两个容器都作为特权运行。 但是在kubernetes docker容器中,命令失败,出现错误: tee: /sys/kernel/mm/transparent_hugepage/enabled: Read-only file system

并在普通的docker run -it --privileged alpine /bin/sh命令工作正常。

我已经在k8s和非k8s容器上使用docker docker inspect来validation特权状态,没有看到任何其他应该导致这个问题的列表 – 我已经在两个输出之间运行diff ,然后使用docker run进行修改以尝试重现在普通的docker问题,但失败(它保持工作)。 任何想法为什么kubernetes泊坞窗容器失败和普通docker容器成功?

这可以在这里重新定义:

 apiVersion: v1 kind: Pod metadata: name: sys-fs-edit spec: containers: - image: alpine command: - /bin/sh args: - -c - echo never | tee /sys/kernel/mm/transparent_hugepage/enabled && sysctl -w net.core.somaxconn=8192 vm.overcommit_memory=1 && sleep 9999999d imagePullPolicy: Always name: sysctl-buddy securityContext: privileged: true 

解决方法

虽然我仍然不知道差异的原因,但是可以通过将/ sys重新挂载为读写来缓解问题。

 apiVersion: v1 kind: Pod metadata: name: sys-fs-edit spec: containers: - image: alpine command: - /bin/sh args: - -c - echo never | tee /sys/kernel/mm/transparent_hugepage/enabled && sysctl -w net.core.somaxconn=8192 vm.overcommit_memory=1 && sleep 9999999d imagePullPolicy: Always name: sysctl-buddy securityContext: privileged: true volumeMounts: - mountPath: /sys name: sys readOnly: false volumes: - hostPath: path: /sys name: sys 

你试图设置的sysctl适用于整个主机,而不是一个容器。 无法将它设置在非特权容器中,这就是为什么您不能在Kubernetes内部执行它,但是可以在特权的Docker容器中执行此操作。

如果您需要此设置来运行特定的容器,则应将其设置在群集中所有节点的主机上,而不是容器或pod定义中。