Por que a modificação do linux sys fs funciona na janela de encaixe simples, mas não no kubernetes?

2

O comando que está sendo executado dentro dos contêineres é:

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

Ambos os contêineres são executados como privilegiados. Mas no container docker do kubernetes o comando falha com erro: tee: /sys/kernel/mm/transparent_hugepage/enabled: Read-only file system

e sob apenas docker run -it --privileged alpine /bin/sh o comando funciona bem.

Eu usei docker inspect em contêineres k8s e não-k8s para verificar o status privilegiado e não vejo mais nada listado que possa causar esse problema - executei diff entre as duas saídas e usei docker run com modificações para tentar reproduzir o problema na janela de encaixe simples, mas falhou (ele continua funcionando). Alguma idéia de por que o contêiner docker do kubernetes falha e o contêiner do docker simples é bem-sucedido?

Isso é reproduzível com a definição da vagem aqui:

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

Solução alternativa

Embora eu ainda não saiba a causa da discrepância, o problema pode ser atenuado remontando / sys como leitura-gravação.

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
    
por chrishiestand 25.08.2016 / 04:01

1 resposta

0

O sysctl que você está tentando definir se aplica ao host inteiro, não a um único contêiner. Não é possível configurá-lo em um contêiner sem privilégios, e é por isso que você não pode fazê-lo no Kubernetes, mas pode fazê-lo em um contêiner do Docker privilegiado.

Se você precisar dessa configuração para executar contêineres específicos, deverá defini-lo nos hosts de todos os nós no cluster, não nas definições de contêiner ou de agrupamento.

    
por 25.08.2016 / 04:10