Назад | Перейти на главную страницу

Почему модификация linux sys fs работает в обычном докере, но не в кубернетах?

Команда, выполняемая внутри контейнеров:

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.

Если вам нужен этот параметр для запуска определенных контейнеров, вы должны установить его на хостах всех узлов в кластере, а не в определениях контейнеров или модулей.