2016-12-22 3 views
2

я пытаюсь установить ElasticSearch (последний) на узлах кластера на Google Container Engine, но ElasticSearch нуждается в переменной: vm.max_map_count быть> = 262144.Набор vm.max_map_count на узлах кластера

Если я SSH к каждому узлов и Я вручную запускаю:

sysctl -w vm.max_map_count=262144 

Все идет хорошо, но любой новый узел не будет иметь указанную конфигурацию.

Так мои вопросы это:

Есть ли способ, чтобы загрузить конфигурацию системы на каждые узлы во время загрузки? Deamon Set не будет хорошим решением, потому что внутри контейнера докеров системные переменные доступны только для чтения.

Я использую новый созданный кластер с изображением узла gci.

+1

Почему DaemonSet не работает? Вы можете запустить pod в привилегированном режиме, чтобы иметь права на корневой эквивалент для каждого хоста. –

+0

Да, я думал, что если это решение в последнее время, и я собираюсь проверить его. – Romain

ответ

2

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

Для примера того, как это сделать, см https://github.com/kubernetes/contrib/tree/master/startup-script

+0

Я, наконец, обновил изображение elasticsearch, чтобы запустить команду: 'sysctl -w vm.max_map_count = 262144' И я запускаю этот контейнер в привилегированном режиме. Это не самый безопасный вариант, но он работает. Я думаю, что лучшее решение ваше, потому что оно предотвращает запуск контейнера elasticsearch в привилегированном режиме. – Romain

4

Я нашел другое решение, глядя на this repository.

Он основан на использовании an init container, плюс сторона в том, что только контейнер инициализации выполняется с привилегиями:

annotations: 
    pod.beta.kubernetes.io/init-containers: '[ 
     { 
     "name": "sysctl", 
     "image": "busybox", 
     "imagePullPolicy": "IfNotPresent", 
     "command": ["sysctl", "-w", "vm.max_map_count=262144"], 
     "securityContext": { 
      "privileged": true 
     } 
     } 
    ]' 

Существует новый синтаксис доступен с Kubernetes 1.6, который по-прежнему работает на 1.7. Начиная с 1.8 требуется новый синтаксис. Декларация инициализации контейнеров перемещается в spec:

- name: init-sysctl 
    image: busybox 
    command: 
    - sysctl 
    - -w 
    - vm.max_map_count=262144 
    imagePullPolicy: IfNotPresent 
    securityContext: 
     privileged: true 
2

Как Роберт отметил, DaemonSet может работать в качестве сценария запуска. К сожалению, GKE разрешит вам запускать DaemonSet с параметром restartPolicy как всегда.

Так, чтобы предотвратить постоянный перезапуск контейнера k8 после запуска sysctl, он должен спать после настройки и предпочтительно просто запускать на выбранных узлах. Это не изящное решение, но оно по крайней мере эластично.

Пример:

es-host-setup Dockerfile:

FROM alpine 
CMD sysctl -w vm.max_map_count=262144; sleep 365d 

DaemonSet файл ресурсов:

apiVersion: extensions/v1beta1 
kind: DaemonSet 
metadata: 
    name: es-host-setup 
spec: 
    template: 
    metadata: 
     labels: 
     name: es-host-setup 
    spec: 
     containers: 
     - name: es-host-setup 
     image: es-host-setup 
     securityContext: 
      privileged: true 
     restartPolicy: Always 
     nodeSelector: 
     pool: elasticsearch 
+0

Это то, что я сделал: установите vm-max, а затем спать очень долго: 'команда: [" sh "," -c "," sysctl -w vm.max_map_count = 262144 && sleep 2147483647 "]' – Romain

+1

На Kubernetes 1.6 или новее вы можете использовать initContainers как на диаграмме поиска elailsearch: https://github.com/kubernetes/charts/blob/master/incubator/elasticsearch/templates/client-deployment.yaml#L44 – gmiretti

Смежные вопросы