У меня уже есть стек 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, но это тоже не помогло.
Буду признателен за помощь в этом вопросе.