Как исполнить кубелет из ГКЕ

В моем кластере Kubernetes, когда я пытаюсь вызвать модуль, я вижу следующую ошибку:

Pod forbidden sysctl: “***” not whitelisted

Из документации мне нужно запустить kubelet --experimental-allowed-unsafe-sysctls:***,

Я работаю в Google Kubernetes Engine, так как я могу запустить это? Я пытался использовать консоль, но я не вижу, как выполнить эту команду.

1 ответ

Решение

Поле security.alpha.kubernetes.io/sysctls допускает только те sysctl, которые работают в пространствах имен cgroup, поэтому изменение параметра не влияет на несвязанные модули.

Как вы и предлагали, решение по умолчанию в Kubernetes k8s - добавить --experimental-allowed-unsafe-sysctls флаг при запуске kubelet, однако добавить флаги kubelet в GKE невозможно, поскольку они недоступны.

Вы можете обойти это, изменив файл / etc / default / kubelet на одном из узлов, чтобы включить экспериментальный флаг, а затем попытаться добавить к нему модули. Однако это может работать только как временное решение, поскольку оно будет перезаписано мастером. Даже если вы отредактируете файл kubelet, мастер через некоторое время восстановит настройки конфигурации по умолчанию.

Невозможно изменить это поведение в GKE, однако есть несколько обходных путей. Вы можете выбрать одно из двух решений ниже. Обратите внимание, что вам придется заменить <ctl name> с модулем sysctl, к которому вы хотели бы получить доступ.

Решение:

1) Первый вариант - дать привилегию контейнеру для чтения / записи, затем добавить командную строку sysctl -w [<ctl name> operation] внизу.

Файл pod yaml будет выглядеть так:

kind: Pod
metadata:
  name: sample
  labels:
    app: gpdb
spec:
  hostname: sample
  containers:
  - name: gpdb
    image: ubuntu
    securityContext:
       privileged: true
    command:
    - /bin/sh
    - -c
    - |
    sysctl -w [<ctl name> operation] && sleep 5000

2) Второй вариант - создать DaemonSet, который запускает команду sysctl вручную. Вы можете сделать это с DockerFile следующим образом:

Dockerfile sysctl-change

FROM alpine
CMD sysctl -w [<ctl name> operation]  ; sleep 365d

Файл ресурса DaemonSet

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: sysctl-change
spec:
  template:
    metadata:
      labels:
        name: sysctl-change
    spec:
      containers:
      - name: sysctl-change
        image: sysctl-change  # remember to set this correctly. It is the Docker image
        securityContext:
          privileged: true
      restartPolicy: Always
      nodeSelector:              # update this appropriately to the nodes 
        pool: elasticsearch

В приведенном выше примере убедитесь, что для nodeSelector задано подходящее значение (все узлы, для которых вы хотите установить sysctl) и что имя изображения соответствует.

Для более подробного обсуждения этой проблемы вы можете обратиться к следующей странице Stackru.

Другие вопросы по тегам