31 марта 2023

Решение проблемы "sysctl: permission denied" при обновлении GitLab

У меня GitLab живёт в непривилегированном контейнере LXC и при очередной установке обновления появились ошибки связанные с отсутсвием прав менять настройки sysctl. Это ожидаемое поведение, т.к. на сервере много других контейнеров и я не хочу чтобы каждый из них мог крутить настройки ядра.

Ошибки выглядят пример так

  * gitlab_sysctl[kernel.sem] action create
    * directory[create /etc/sysctl.d for kernel.sem] action create (up to date)
    * file[create /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf kernel.sem] action create[2023-03-31T22:13:28+03:00] INFO: file[create /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf kernel.sem] backed up to /opt/gitlab/embedded/cookbooks/cache/backup/opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf.chef-20230331221328.890308
[2023-03-31T22:13:28+03:00] INFO: file[create /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf kernel.sem] updated file contents /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf

      - update content in file /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf from 09a346 to 3b0a60
      --- /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf    2017-06-21 13:47:53.000000000 +0300
      +++ /opt/gitlab/embedded/etc/.chef-90-omnibus-gitlab-kernel20230331-271264-19acez0.sem.conf       2023-03-31 22:13:28.886738600 +0300
      @@ -1 +1 @@
      -kernel.sem = 250 32000 32 262
      +kernel.sem = 250 32000 32 275
    * link[/etc/sysctl.d/90-omnibus-gitlab-kernel.sem.conf] action create (up to date)
    * execute[load sysctl conf kernel.sem] action nothing (skipped due to action :nothing)
[2023-03-31T22:13:28+03:00] INFO: file[create /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.sem.conf kernel.sem] sending run action to execute[load sysctl conf kernel.sem] (delayed)
    * execute[load sysctl conf kernel.sem] action run
      [execute] sysctl: permission denied on key "kernel.sem"

Чтобы избежать попыток "крутить" настройки ядра достаточно добавить параметр package['modify_kernel_parameters'] = false в /etc/gitlab/gitlab.rb и выполнить обновление конфигурации

$ cat <<_EOF_ | sudo tee -a /etc/gitlab/gitlab.rb
gitlab_kas['enable'] = false
_EOF_

$ sudo gitlab-ctl reconfigure

$ sudo gitlab-ctl restart

Перезапускать сервис не обязательно, но в моем случае часть сервисов оказались остановленными. Решение подсмотрел тут.


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

10 марта 2023

Мучение с no_proxy в hadoop-aws

Про боль с настройками прокси для разных приложений в своё время хорошо написали в блоге GitLab. Я лишь немного добавлю про комбинацию Docker, HTTP Proxy и Hadoop-AWS, который мы используем в Apache Spark для записи данных в объектное хранилище.

Ранее я уже писал про тестовое окружение в котором чтобы скачать что-либо за пределами VPC нужно использовать корпоративный прокси-сервер. На CI сервере прокси настроен в Docker и этого достаточно чтобы собирались образы. Настройки прокси пробрасываются внутрь контейнеров в виде переменных окружения (подробности тут). Чтобы прокси не использовался там где не нужно задана переменная окружения "no_proxy" в которой перечислены все исключения на сервисы тестируемого приложения, ядром которого является Apache Spark.

27 февраля 2023

Убрать начальный ноль из месяца, часа, минуты или секунды в date

В генераторе данных для нагрузочного тестирования ETL используется команда date чтобы получить часы, минуты и секунды. По-умолчанию они имеют "0" в качестве префикса что с свою очередь приведет к ошибкам в "математике" bash

$ echo $(( 60 - $(date +%S) ))
-bash: 60 - 09: value too great for base (error token is "09")

Можно использовать sed чтобы убрать начальный ноль

$ echo $(( 60 - $(date +%S | sed -e 's/^0//') ))

Но на StackOverflow нашлось более красивое решение - использовать padding modifiers в date

$ echo $(( 60 - $(date +%-S) ))

Полный список модификаторов есть в man date.


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

19 февраля 2023

Установка Prometheus Node Exporter на Raspberry PI 3 OpenELEC

Это пошаговое руководство описывает установку Prometheus Node Exporter v1.5.0 на Raspberry PI 3 с OpenELEC 9.2.8.

Скачиваем дистрибутив Prometheus Node Exporter для Linux с архитектурой armv7 (BCM2835 не поддерживает arm64) в /storage (в OpenELEC все пользовательские изменения должны сохраняться в /storage).

# cd /storage

# curl -fsSLO https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-armv7.tar.gz

# tar -xzf node_exporter-1.5.0.linux-armv7.tar.gz

# mkdir /storage/node_exporter/

# install -o root -m 755 node_exporter-1.5.0.linux-armv7/node_exporter /storage/node_exporter/node_exporter

# rm -fr /storage/node_exporter-1.5.0.linux-armv7 node_exporter-1.5.0.linux-armv7.tar.gz

16 февраля 2023

Генератор данных для нагрузочного тестирования ETL

На текущем проекте для нагрузочного тестирования ETL нужен постоянный поток данных от телекоммуникационного оборудования. Размер сетей, тип и объём данных в метриках (сети 3g/4g/5g, оборудование разных вендоров) различается от клиента к клиенту и пока сетевики занимаются организацией доступа в сеть заказчика нужно определить системные требования и посчитать стоимость ресурсов чтобы заложить бюджет. Далее будет развёртывание окружения под клиента и оценка надёжности его работы сверх ожидаемой нагрузки (чтобы был запас по прочности на случай если у заказчика метрик станет заметно больше, чем планировалось).

Для функционального тестирования достаточно загрузить тестовый набор данных от клиента (чтобы убедиться что ETL корректно разбирает данные метрик), но это не подходит для нагрузочного тестирования, когда нужно проверить какую максимальную нагрузку выдержит система прежде чем мы перестанем соответствовать SLO (Service Level Objective).

07 февраля 2023

Медленная сборка Docker образа

На прошлой неделе начались заметил очень медленную сборку Docker образов на базе Ubuntu. Скорость загрузки с archive.ubuntu.com / security.ubuntu.com была в районе 400kB/s и ping до этих хостов был в районе 250ms. Поскольку на аналогичную проблему жаловался и коллега, то маловероятно что проблема с моим подключением к Internet (тем более что speedtest.net не показал ничего криминального).

Решить эту проблему можно несколькими способами:

  1. Использовать местное зеркало Ubuntu (потребует редактирования Dockerfile)
  2. Использовать кеширующий прокси сервер в конфигурации APT (потребует редактирования Dockerfile)
  3. Использовать альтернативный DNS сервер, который будет резолвить archive.ubuntu.com/security.ubuntu.com на IP адрес зеркала (при условии что в sources не используется HTTPS)

Времени было мало и потому пошёл путём наименьшего сопротивления - использовал аргумент --add-host для команды docker build

$ docker build --add-host=archive.ubuntu.com:<IP> \
               --add-host=security.ubuntu.com:<IP> -t image-name .

Пакеты всё ещё скачивает из Internet, но зато подходит для большинства случаев и не требует дополнительных сервисов.


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.

02 февраля 2023

YAML грабли

Есть мнение что YAML это простой и дружелюбный формат (этакий JSON с комментами), противоположное мнение тоже существует.

Сегодня наступил на грабли с Helm в котором функция toYaml теряет кавычки из значений и таким образом меняет тип данных. Этот баг завели еще 4 года назад, но закрыли без решения проблемы. Каждый выкручивается как может - мне пришлось заменить

{{- with .Values.extraEnvVars }}
{{- toYaml . | nindent 10 }}
{{- end }}

на вариант с range

{{- range .Values.extraEnvVars }}
- name: {{ .name }}
  value: {{ .value | quote }}
{{- end }}

В других случаях (вроде аннотаций) будут свои особенности.


Вы можете следить за обновлениями блога с помощью Atom/RSS и Telegram.