Как исполнить кубелет из ГКЕ
В моем кластере 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.