установите net .ipv4.tcp_timestamps = 0 в Pod - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел бы установить net.ipv4.tcp_timestamps=0 в модулях моего кластера k8s, однако это выдает ошибку:

sysctl: невозможно stat / proc / sys / net / ipv4 / tcp_timestamps: нет таких файл или каталог "

Та же проблема с контейнером, непосредственно созданным с помощью команды docker run. В любом случае, чтобы установить параметр в container / Pod? Спасибо.

1 Ответ

0 голосов
/ 10 февраля 2020

В Куберне sysctl были сгруппированы в safe и unsafe.

В дополнение к правильному пространству имен, sysctl safe должен быть правильно изолирован между модулями на одном узле. Это означает, что установка safe sysctl для одного модуля

  • не должна иметь никакого влияния на другие модули на узле
  • не должна позволять вредить узлу работоспособность
  • не должна позволять получать ресурсы ЦП или памяти вне пределов ресурсов модуля.

На сегодняшний день большинство пространств имен sysctl не являются обязательно считается безопасным . В наборе safe поддерживаются следующие sysctl:

  • 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"...

Только пространство имен sysctls может быть включено таким образом.

Это упоминается в Включение небезопасных Sysctls k8s документации.

Что касается Настройка Sysctls для Pod :

Количество sysctl в пространстве имен в современных Linux ядрах. Это означает, что они могут быть установлены независимо для каждого модуля на узле. С помощью модуля pod securityContext в Kubernetes можно настроить только sysctl с пространством имен.

Известно, что следующие sysctl являются пространством имен. Этот список может измениться в будущих версиях ядра Linux. - kernel.shm*, - kernel.msg*, - kernel.sem, - fs.mqueue.*, - Параметры в net.*, которые можно установить в пространстве имен сети контейнера. Однако существуют исключения (например, net.netfilter.nf_conntrack_max и net.netfilter.nf_conntrack_expect_max могут быть установлены в пространстве имен сети контейнера, но они не имеют пространства имен).

Sysctl без пространства имен называются уровень узла sysctls , Если вам нужно установить их, вы должны вручную настроить их в операционной системе каждого узла или с помощью DaemonSet с привилегированными контейнерами.

Используйте pod securityContext для настройки sysctls в пространстве имен. SecurityContext применяется ко всем контейнерам в одном модуле.

В этом примере используется модуль pod securityContext для установки безопасного sysctl kernel.shm_rmid_forced и двух небезопасных sysctl net.core.somaxconn и kernel.msgmax. В спецификации нет различия между safe и unsafe * sysctls.

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? .

...