Рейтинг:0

Проблема с запуском модулей kubernetes elasticsearch из-за отказа в доступе в elasticsearch.keystore

флаг ai

У меня уже есть стек EFK в кластере kubernetes в AWS EKS, и я намерен добавить функцию ведения журнала s3 для модулей elasticsearch в es-statefulset. Для этого я создал собственный образ elasticseach, в который я добавил плагин репозитория-s3, а затем добавил init-контейнер для хранения учетных данных AWS в файле yaml es-statefulset. Но при применении изменений часть эластичных модулей es statefulset завершается с ошибкой.

Конфигурация statefulset выглядит следующим образом:

apiVersion: apps/v1 # Версия API kubernetes, в которой доступен `StatefulSet`. Для Kubernetes 1.8.7 его apps/v1beta1
kind: StatefulSet # Тип ресурса, который мы создаем
metadata: # Содержит метаданные для этого ресурса
  name: es # Имя этого ресурса
  пространство имен: kube-loging
  labels: # Дополнительные метаданные идут внутри меток. Это для ресурса с состоянием
    компонент: elasticsearch # Просто метаданные, которые мы добавляем
spec: # Содержит спецификацию этого ресурса
  replicas: 5 # Отвечает за поддержание заданного количества реплик
  селектор:
    метки соответствия:
      компонент: эластичный поиск
  serviceName: elasticsearch # Имя службы, требуемое statefulset
  template: # Шаблон содержит спецификацию пода, который будет создан и поддерживаться statefulset
    metadata: # Содержит метаданные для модуля
      labels: # Дополнительные метаданные идут внутри меток. Это для стручка
        component: elasticsearch # Просто метаданные для пода
    spec: # Содержит спецификацию пода
      initContainers: # всегда будет инициализироваться перед другими контейнерами в поде
      - name: init-sysctl # Имя init-контейнера
        image: busybox # Изображение, которое будет развернуто в этом контейнере
        imagePullPolicy: IfNotPresent # Устанавливает политику, которая извлекает изображение из реестра только в том случае, если оно недоступно локально
        command: ["sysctl", "-w", "vm.max_map_count=262144"] # Устанавливает системную переменную в контейнере, это значение требуется для ES
        securityContext: # Контекст безопасности содержит любые специальные разрешения, данные этому контейнеру
          привилегированный: true # Этот контейнер получает право работать в привилегированном режиме
      - имя: добавить-aws-ключи
        изображение: xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
        среда:
        - имя: AWS_ACCESS_KEY_ID
          значениеОт:
            секретная ссылка:
              имя: aws-s3-keys
              ключ: идентификатор ключа доступа
        - имя: AWS_SECRET_ACCESS_KEY
          значениеОт:
            секретная ссылка:
              имя: aws-s3-keys
              ключ: секретный ключ доступа
        команда:
        - ш
        - -с
        - |
          эхо $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore добавить --stdin --force s3.client.default.access_key
          эхо $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore добавить --stdin --force s3.client.default.secret_key
      containers: # Содержит список и конфиги обычных контейнеров в поде
      - name: es # Имя первого контейнера
        securityContext: # Контекст безопасности содержит любые специальные разрешения, данные этому контейнеру
          Возможности: # Контейнер будет иметь возможность блокировки IPC, может блокировать память, чтобы ее нельзя было выгрузить.
            Добавлять:
              - IPC_LOCK
        изображение: xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2 
        env: # этому изображению передается массив переменных окружения со значениями
        - имя: KUBERNETES_CA_CERTIFICATE_FILE
          значение: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        - имя: ПРОСТРАНСТВО ИМЕН
          значениеОт:
            fieldRef:
              fieldPath: метаданные.имяпространство
        - название: "CLUSTER_NAME"
          значение: "myesdb1"
        - название: "DISCOVERY_SERVICE"
          значение: "эластичный поиск"
        - имя: NETWORK_HOST 
          значение: "_eth0_"
        - name: ES_JAVA_OPTS #Укажите размер кучи
          значение: -Xms1536m -Xmx1536m
        ports: # Порты, которые будет открывать этот модуль
        - контейнерПорт: 9200
          имя: http
          протокол: TCP
        - контейнерПорт: 9300
          Название: транспорт
          протокол: TCP
        volumeMounts: # Путь, по которому будет смонтирован том.
        - путь монтирования: /данные
          name: storage # Имя данного монтирования
  обновлениеСтратегия:
    тип: RollingUpdate
  volumeClaimTemplates: # Обеспечивает стабильное хранилище с использованием PersistentVolumes, предоставленных PersistentVolume Provisioner.
  - метаданные: # Метаданные, предоставленные этому ресурсу (заявка на постоянный объем)
      name: storage # Имя этого ресурса
    spec: # Спецификация этого PVC (заявка на постоянный объем)
      storageClassName: gp2 # Класс хранилища, используемый для предоставления этого PVC
      accessModes: [ReadWriteOnce] # Режим доступа к тому
      resources: # Содержит список ресурсов
        запросы: # Запросы, отправленные классу хранилища
          хранилище: 100Gi 

Модуль описания дает следующее:

$ kubectl описать pod/es-0 -n kube-loging
Имя: es-0
Пространство имен: kube-loging
Приоритет: 0
Узел: ip-xxxxxxxxxxxx.ap-southeast-1.compute.internal/xxxxxxxxx
Время начала: Чт, 19 августа 2021 г., 16:23:44 +0000
Ярлыки: компонент = эластичный поиск
              хэш-ревизия контроллера = es-7dc4b7477c
              statefulset.kubernetes.io/pod-name=es-0
Аннотации: kubernetes.io/psp: eks.privived
Статус: Работает
IP: ххххххххххх
IP-адреса:
  IP: хххххххххххх
Управляется: StatefulSet/es
Инициальные контейнеры:
  инициализация-sysctl:
    Идентификатор контейнера: docker://291ab715d302d7f505925168685955ad20c529e4db3371c3385e911614d60179
    Изображение: Busybox
    Идентификатор изображения: docker-pullable://busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
    Порт: <нет>
    Хост-порт: <нет>
    Команда:
      sysctl
      -w
      vm.max_map_count=262144
    Состояние: прекращено
      Причина: Завершено
      Код выхода: 0
      Начато: Чт, 19 Авг 2021 16:23:50 +0000
      Завершено: Чт, 19 Авг 2021 16:23:50 +0000
    Готово: Верно
    Количество перезапусков: 0
    Среда: <нет>
    Маунты:
      /var/run/secrets/kubernetes.io/serviceaccount из default-token-9nv96 (ro)
  добавить aws-ключи:
    Идентификатор контейнера: docker://23e3335b99c8a5bf144f2f2a52c1bbd357a667205ce335ead5e0627ecdf403e9
    Изображение: xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
    Идентификатор изображения: docker-pullable://xxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes@sha256:c09d586a4bdc7149c41ff74783bae0138f68c4779f03315b197e7dda1c4332c6
    Порт: <нет>
    Хост-порт: <нет>
    Команда:
      ш
      -с
      эхо $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore добавить --stdin --force s3.client.default.access_key
      эхо $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore добавить --stdin --force s3.client.default.secret_key
      
    Состояние: прекращено
      Причина: Завершено
      Код выхода: 0
      Начато: Чт, 19 Авг 2021 16:23:50 +0000
      Завершено: Чт, 19 Авг 2021 16:23:53 +0000
    Готово: Верно
    Количество перезапусков: 0
    Среда:
      AWS_ACCESS_KEY_ID: <установлено для ключа 'access-key-id' в секрете 'aws-s3-keys'> Необязательно: false
      AWS_SECRET_ACCESS_KEY: <установить ключ «access-secret-key» в секрете «aws-s3-keys»> Необязательно: false
    Маунты:
      /var/run/secrets/kubernetes.io/serviceaccount из default-token-9nv96 (ro)
Контейнеры:
  Эс:
    Идентификатор контейнера: docker://a26a4cf4ed98f0f6dd535069e8a5c54dbf39746a04e8a14fbacb0c51ff4684ec
    Изображение: xxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
    Идентификатор изображения: docker-pullable://xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes@sha256:c09d586a4bdc7149c41ff74783bae0138f68c4779f03315b197e7dda1c4332c6
    Порты: 9200/TCP, 9300/TCP
    Хост-порты: 0/TCP, 0/TCP
    Состояние: Ожидание
      Причина: CrashLoopBackOff <<<<<<<<<<<
    Последнее состояние: завершено <<<<<<<<<<<<<<<<<<<
      Причина: ошибка
      Код выхода: 1
      Начато: Чт, 19 Авг 2021 16:50:16 +0000
      Завершено: Чт, 19 Авг 2021 16:50:17 +0000
    Готово: Ложь
    Количество перезапусков: 10
    Среда:
      KUBERNETES_CA_CERTIFICATE_FILE: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      ПРОСТРАНСТВО ИМЕН: kube-logging (v1:metadata.namespace)
      ИМЯ_КЛАСТЕРА: myesdb1
      DISCOVERY_SERVICE: эластичный поиск
      NETWORK_HOST: _eth0_
      ES_JAVA_OPTS: -Xms1536m -Xmx1536m
    Маунты:
      /данные из хранилища (rw)
      /var/run/secrets/kubernetes.io/serviceaccount из default-token-9nv96 (ro)
Условия:
  Тип Статус
  Инициализировано Истинно 
  Готов Ложь 
  ContainersReady False 
  PodScheduled True 
Объемы:
  место хранения:
    Тип: PersistentVolumeClaim (ссылка на PersistentVolumeClaim в том же пространстве имен)
    ClaimName: хранилище-es-0
    Только для чтения: ложь
  токен по умолчанию-9nv96:
    Тип: секрет (том, заполненный секретом)
    Имя секрета: токен по умолчанию-9nv96
    Необязательно: ложь
Класс QoS: BestEffort
Селекторы узлов: <нет>
Допуски: node.kubernetes.io/not-ready:NoExecute для 300 с.
                 node.kubernetes.io/unreachable:NoExecute для 300 сек.
События:
  Тип Причина Возраст от сообщения
  ---- ------ ---- ---- -------
  Обычный Запланировано 29 минут, планировщик по умолчанию Успешно назначен kube-logging/es-0 на ip-xxxxxxx.ap-southeast-1.compute.internal
  Обычный SuccessfulAttachVolume 29m attachdetach-controller AttachVolume.Attach успешно выполнен для тома "pvc-2abce33a-7193-4070-b4da-74486e72d568"
  Нормальный Извлеченный 29-метровый kubelet Образ контейнера «busybox» уже присутствует на машине
  Обычный Создан 29-метровый кублет Создан контейнер init-sysctl
  Обычный Запущен 29-метровый kubelet Запущен контейнер init-sysctl
  Обычный Извлеченный 29-мегапиксельный образ контейнера kubelet "xxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2" уже присутствует на машине
  Обычный Создан 29-метровый кублет Создан контейнер add-aws-keys
  Нормально Запущено 29m kubelet Запущен контейнер add-aws-keys
  Обычный Создан 29 м (x4 более 29 м) kubelet Создан контейнер es
  Обычный Started 29м (x4 более 29м) kubelet Started container es
  Обычный Извлеченный 28 м (x5 на 29 м) kubelet Образ контейнера "xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2" уже присутствует на машине
  Предупреждение BackOff 4m46s (x115 over 29m) kubelet Back-off перезапуск контейнера с ошибкой

Журналы модуля выдают следующую ошибку, связанную с AccessDeniedException: /elasticsearch/config/elasticsearch.keystore:

$ kubectl регистрирует pod/es-0 -n kube-logging
Запуск Elasticsearch 6.4.2
Исключение в потоке «основной» org.elasticsearch.bootstrap.BootstrapException: java.nio.file.AccessDeniedException: /elasticsearch/config/elasticsearch.keystore
Вероятная основная причина: java.nio.file.AccessDeniedException: /elasticsearch/config/elasticsearch.keystore <<<<<<<<<<<<
    в sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    в sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    в sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    на sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
    в java.nio.file.Files.newByteChannel(Files.java:361)
    в java.nio.file.Files.newByteChannel(Files.java:407)
    в org.apache.lucene.store.SimpleFSDirectory.openInput(SimpleFSDirectory.java:77)
    на org.elasticsearch.common.settings.KeyStoreWrapper.load(KeyStoreWrapper.java:215)
    в org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:226)
    в org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:291)
    в org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136)
    в org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)
    в org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
    в org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
    на org.elasticsearch.cli.Command.main(Command.java:90)
    на org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)
    на org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)
Подробные сведения об ошибке см. в журнале.

Дальнейшие исследования по этому вопросу, я нашел несколько ссылок по этой проблеме, которые указывают на проблему с расположением хранилища ключей в контейнере elasticsearch и некоторым форматированием ключа в gcp: https://github.com/elastic/cloud-on-k8s/issues/4124 https://discuss.elastic.co/t/access-denied-error-on-keystore-when-using-eck/276297

но я не уверен, как решить эту проблему, как в AWS, более того, когда я попытался добавить учетные данные непосредственно при создании пользовательского образа, он был успешно добавлен без каких-либо ошибок (проверено путем запуска контейнера из пользовательского образа, созданного с помощью Dockerfile):

...
Шаг 6/8: ЗАПУСК эхо $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore добавить --stdin --force s3.client.default.access_key
 ---> Работает в 42f5231573a7
Создано хранилище ключей elasticsearch в /elasticsearch/config
Снятие промежуточного контейнера 42f5231573a7
 ---> 3b202f355a8b
Шаг 7/8: ЗАПУСК эхо $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore добавить --stdin --force s3.client.default.secret_key
 ---> Работает в 644e555f2362
Снятие промежуточного контейнера 644e555f2362
 ---> d08abcc761ce
Шаг 8/8: ЗАПУСК bin/elasticsearch-plugin install --batch relay-s3
 ---> Работает в d21d7d4fbb7b
-> Загрузка репозитория-s3 из эластичного
[================================================= ] 100%   
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@
@ ВНИМАНИЕ: плагин требует дополнительных разрешений @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.reflect.ReflectPermission подавляет проверку доступа
* java.net.SocketPermission * подключение, разрешение
* java.util.PropertyPermission es.allow_insecure_settings чтение, запись
См. http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html.
для описания того, что позволяют эти разрешения, и связанных с ними рисков.
-> Установленный репозиторий-s3
Снятие промежуточного контейнера d21d7d4fbb7b
 ---> 19f4588f1f7f
Успешно построен 19f4588f1f7f
Успешно помечен xxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2

Также обратите внимание, что я попытался изменить разрешение /elasticsearch/config/elasticsearch.keystore на 777, но это тоже не помогло.

Буду признателен за помощь в этом вопросе.

Aditya Agarwal avatar
флаг ai
Эта проблема была решена после того, как я перезапустил все узлы, на которых был настроен кластер kubernetes. Я не уверен, как это очистило устаревшие записи, поскольку модули использовали постоянный том, который оставался бы прежним даже после перезагрузки.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.