Команда, выполняемая внутри контейнеров:
echo never | tee /sys/kernel/mm/transparent_hugepage/enabled
Оба контейнера работают как привилегированные. Но в контейнере докеров kubernetes команда завершается с ошибкой: tee: /sys/kernel/mm/transparent_hugepage/enabled: Read-only file system
и под просто docker run -it --privileged alpine /bin/sh
команда работает нормально.
я использовал docker inspect
на контейнерах как k8s, так и не k8s, чтобы проверить привилегированный статус и не видеть в списке ничего другого, что должно вызвать эту проблему - я запустил diff
между обоими выходами, а затем используется docker run
с модификациями, чтобы попытаться воспроизвести проблему в обычном докере, но не удалось (он продолжает работать). Есть идеи, почему контейнер докеров kubernetes выходит из строя, а простой контейнер докеров преуспевает?
Это можно воспроизвести с помощью определения модуля здесь:
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.
Если вам нужен этот параметр для запуска определенных контейнеров, вы должны установить его на хостах всех узлов в кластере, а не в определениях контейнеров или модулей.