barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 8 апреля 2024 г.

Установка дополнений в OpenLens вручную

Иногда невозможно воспользоваться автоматической установкой дополнений в OpenLens, например, если из OpenLens нет доступа в интернет. Тогда можно сделать следующее (в примере я устанавливаю дополнение @alebcay/openlens-node-pod-menu):

npm pack @alebcay/openlens-node-pod-menu

В папке появится tgz-архив, и вот его уже можно установить через выбор файла вручную в меню Extensions в OpenLens.

понедельник, 10 июля 2023 г.

initialDelaySeconds в Kubernetes Probes

В Kubernetes для probes (например, readinessProbe) есть параметр initialDelaySeconds, предназначенный для того, чтобы дать контейнеру некоторое время на инициализацию, прежде чем Kubernetes начнет выполнять ту или иную probe.

Можно подумать, что этот параметр буквально задает "отсрочку" для начала выполнения той или иной probe. Т.е., к примеру, в такой конфигурации:

          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: http
              scheme: HTTP
            initialDelaySeconds: 20
            timeoutSeconds: 5
            periodSeconds: 15
            successThreshold: 1
            failureThreshold: 5

можно ожидать, что первый раз probe будет выполнен через 20 сек после запуска контейнера, потому что в initialDelaySeconds указано 20. 

Однако, это не так. Отсчет периодов для выполнения probe начинается в момент запуска контейнера вне зависимости от того, установлен ли initialDelaySeconds или нет. Т.е. probe будет запланирован на запуск в 0сек, 15сек, 30сек, 45сек и т.д. начиная от момента запуска контейнера. То, что initialDelaySeconds равен 20, приведет лишь к тому, что те попытки выполнить probe, которые попадут в эти первые 20сек, будут пропущены:

Таким образом, первый раз readiness probe сработает не через 20 сек после запуска контейнера, а через 30 сек. 

пятница, 5 мая 2023 г.

Ubuntu 20.04 + Podman: error "potentially insufficient UIDs or GIDs available in user namespace" when trying to run a container

Проблема

При попытке запустить контейнер с помощью Podman появляется ошибка:

Error: writing blob: adding layer with blob "sha256:...": Error processing tar file(exit status 1): potentially insufficient UIDs or GIDs available in user namespace (requested 110779:100 for /usr/local/lib/node_modules/@stoplight/spectral/node_modules/optionator/CHANGELOG.md): Check /etc/subuid and /etc/subgid: lchown /usr/local/lib/node_modules/@stoplight/spectral/node_modules/optionator/CHANGELOG.md: invalid argument

Причина

На эту тему есть отличная статья https://www.redhat.com/sysadmin/rootless-podman, в двух словах - причина в том, что UID 110779, используемый в docker-образе, не может быть смапплен в хост-ОС из-за того, что он больше, чем 65536.

Решение

Правим на хост-ОС файл /etc/subuid, заменяя для пользователя, из-под которого запускается podman, ограничение 65536 на другое, большее чем UID, фигурирующий в ошибке, например:

aspirinspb:100000:165536

Podman: WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers

Проблема

При старте Podman появляется warning:

WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers

Решение

sudo mount --make-rshared /

(необходимо выполнять после каждого перезапуска ОС либо добавить в какой-то из startup-скриптов) 

WSL2 + Cisco VPN: чиним доступность сети в гостевой ОС

Проблема

Хост-машина с Windows 10 + Cisco AnyConnect VPN, заворачивающим весь траффик в туннель. Под WSL1 в гостевой ОС (Ubuntu 20.04) все ок, но после миграции на WSL2 пропадает есть.

Решение

В моем случае причина была в том, что трафик заворачивался в неверный сетевой интерфейс (не в VPN), и решилась установкой для VPN-интерфейса более высокого значения метрики командой в PowerShell из-под администратора:

Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000

(имя интерфейса "Cisco AnyConnect" возможно придется заменить на актуальное имя сетевого интерфейса VPN-соединения). Команду нужно выполнять после каждой перезагрузки хост-машины либо реконнекта VPN.

вторник, 4 апреля 2023 г.

Spring Boot 3: micrometer-tracing не работает в @SpringBootTest

Проблема

Есть приложение на Spring Boot 3, использующее для трейсинга micrometer-tracing-bridge-brave и zipkin-reporter-brave. Есть @SpringBootTest, который, в числе прочего, проверяет пропагирование трейс-информации (а именно, заголовка "b3") из входящих http-запросов в исходящие http-запросы. Однако тест падает - в исходящие запросы заголовок "b3" не добавляется. Хотя если запустить приложение и выполнить "ручную" проверку - заголовок "b3" в исходящих запросах есть.

Решение

Observability-функциональность по-умолчанию отключена для @SpringBootTest. Включается аннотацией @AutoConfigureObservability на тест-классе.

понедельник, 27 марта 2023 г.

Grafana Loki: фильтрация по полю из JSON

 Если в Grafana Loki необходимо выполнить поиск по одному из полей JSON-лога, то делается это следдующим образом:

Сначала достаем поле из JSON и делаем из него лэйбл, затем добавляем фильтрацию по этому лэйблу.