Почему memory_limiter ставят перед batch
В OpenTelemetry Collector порядок processors влияет на то, куда вернётся отказ при нехватке памяти. README рекомендует
Фрагмент списка processors в своём pipeline:
Оба processor нужно отдельно объявить в конфигурации. Проверьте их наличие в своей версии и сборке Collector.
При превышении soft limit limiter отказывает новым данным с повторяемой, non-permanent ошибкой. Выше hard limit дополнительно вызывает GC. Soft limit =
Receiver должен корректно повторить отправку. Без retry данные теряются, а бесконечно повторять он тоже не сможет. Между проверками память успевает вырасти, поэтому limiter не гарантирует защиту от OOM.
Memory Limiter Processor
#архитектура_на_салфетке
В OpenTelemetry Collector порядок processors влияет на то, куда вернётся отказ при нехватке памяти. README рекомендует
memory_limiter первым, чтобы backpressure дошёл до receiver.Фрагмент списка processors в своём pipeline:
processors: [memory_limiter, batch]
Оба processor нужно отдельно объявить в конфигурации. Проверьте их наличие в своей версии и сборке Collector.
При превышении soft limit limiter отказывает новым данным с повторяемой, non-permanent ошибкой. Выше hard limit дополнительно вызывает GC. Soft limit =
limit_mib − spike_limit_mib. Например, 4000 − 800 = 3200 MiB. Это пример из README, а не размер для любого контейнера.Receiver должен корректно повторить отправку. Без retry данные теряются, а бесконечно повторять он тоже не сможет. Между проверками память успевает вырасти, поэтому limiter не гарантирует защиту от OOM.
Memory Limiter Processor
#архитектура_на_салфетке
🔐 Высокий score systemd — повод открыть настройки сервиса
У
Подставьте свой service unit и проверьте поддержку команды в установленной версии. Она читает конфигурацию, ничего не меняет. Нужен доступ к system manager.
В ответе будет таблица ограничений и overall exposure от 0.0 до 10.0. Высокое число означает, что применено мало учитываемых ограничений.
Но это не сканер уязвимостей. Оценка не учитывает всю защиту приложения и, например, не даёт полного анализа доступа через IPC. Плохой score не доказывает уязвимость, хороший не доказывает безопасность.
Не включайте все ограничения ради красивого числа. Сначала выясните, какие файлы, сеть и привилегии действительно нужны сервису, затем проверяйте выбранные настройки.
Документация systemd-analyze
#root_prompt
У
systemd-analyze есть проверка sandboxing-настроек unit. Для Linux с systemd и установленным nginx:systemd-analyze security --no-pager nginx.service
Подставьте свой service unit и проверьте поддержку команды в установленной версии. Она читает конфигурацию, ничего не меняет. Нужен доступ к system manager.
В ответе будет таблица ограничений и overall exposure от 0.0 до 10.0. Высокое число означает, что применено мало учитываемых ограничений.
Но это не сканер уязвимостей. Оценка не учитывает всю защиту приложения и, например, не даёт полного анализа доступа через IPC. Плохой score не доказывает уязвимость, хороший не доказывает безопасность.
Не включайте все ограничения ради красивого числа. Сначала выясните, какие файлы, сеть и привилегии действительно нужны сервису, затем проверяйте выбранные настройки.
Документация systemd-analyze
#root_prompt
👍2👏1
Lockfile с ноутбука может не покрывать Linux runner
Если provider впервые установили из mirror, в
В каталоге корневого модуля Terraform 0.14+ можно заранее добавить суммы для целевых платформ:
Нужны сеть до исходного registry и право записи lockfile. Выберите платформы, которые поддерживает ваш provider.
Команда получает и проверяет пакеты, обновляет локальный файл, инфраструктуру не меняет. Проверьте источник подписей, signer и diff, затем сохраните lockfile в Git. Удалять его ради исчезновения ошибки checksum — плохое лечение.
Этот файл фиксирует зависимости providers. Версии remote modules и state в нём не хранятся.
Dependency lock file
#арсенал_инженера
Если provider впервые установили из mirror, в
.terraform.lock.hcl могут остаться checksums только текущей платформы. На другой архитектуре проверка пакета тогда не сойдётся. Это возможный сценарий, не обязательный сбой любого macOS → Linux.В каталоге корневого модуля Terraform 0.14+ можно заранее добавить суммы для целевых платформ:
terraform providers lock \
-platform=linux_amd64 \
-platform=linux_arm64
Нужны сеть до исходного registry и право записи lockfile. Выберите платформы, которые поддерживает ваш provider.
Команда получает и проверяет пакеты, обновляет локальный файл, инфраструктуру не меняет. Проверьте источник подписей, signer и diff, затем сохраните lockfile в Git. Удалять его ради исчезновения ошибки checksum — плохое лечение.
Этот файл фиксирует зависимости providers. Версии remote modules и state в нём не хранятся.
Dependency lock file
#арсенал_инженера
Pod уже удаляется, а serving всё ещё true
У endpoint в EndpointSlice есть три условия:
Поэтому сочетание serving=true, terminating=true возможно. Значение ready при этом false: оно означает «обслуживает и не завершается». Исключение — Service с
Service-прокси обычно исключают завершающиеся endpoints. Если все доступные endpoints завершаются, они могут направлять трафик на те, у которых serving=true. Поведение зависит от потребителя EndpointSlice. Эти флаги сами по себе не гарантируют бесшовный drain.
Условия EndpointSlice
#архитектура_на_салфетке
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
У endpoint в EndpointSlice есть три условия:
serving, terminating и ready. Для Pod поле serving отражает его Ready. Значение terminating становится true, когда Pod получает deletion timestamp, обычно ещё до остановки контейнеров.Поэтому сочетание serving=true, terminating=true возможно. Значение ready при этом false: оно означает «обслуживает и не завершается». Исключение — Service с
publishNotReadyAddresses=true, у него ready всегда true.Service-прокси обычно исключают завершающиеся endpoints. Если все доступные endpoints завершаются, они могут направлять трафик на те, у которых serving=true. Поведение зависит от потребителя EndpointSlice. Эти флаги сами по себе не гарантируют бесшовный drain.
Условия EndpointSlice
#архитектура_на_салфетке
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
❤1👍1
Проверяем HTTPS на другом IP
Локальный стенд на карточке: TLS-сервер на 127.0.0.1:8443, сертификат с SAN app.test, тестовый CA в ca.pem. Команда выполнена в zsh на macOS с curl 8.7.1. Сервер получил SNI app.test и Host app.test:8443. Запрос к IP с Host: app.test завершился ошибкой сертификата, код 60.
Everything curl
#root_prompt
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
curl --resolve подменяет адрес только для заданной пары hostname:port. Имя из URL остаётся в SNI и используется для проверки сертификата. Одного заголовка Host для этого недостаточно.Локальный стенд на карточке: TLS-сервер на 127.0.0.1:8443, сертификат с SAN app.test, тестовый CA в ca.pem. Команда выполнена в zsh на macOS с curl 8.7.1. Сервер получил SNI app.test и Host app.test:8443. Запрос к IP с Host: app.test завершился ошибкой сертификата, код 60.
--noproxy отключает прокси в этом примере, --cacert указывает файл тестового CA. Проверка сертификата включена. Для обычного HTTPS без явного порта в URL пара в --resolve должна содержать 443.Everything curl
#root_prompt
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Куда положить pod name в Loki
Имена Pod и process ID дают много уникальных значений. Если сделать их индексными labels в Loki, растёт кардинальность индекса. Structured metadata позволяет прикрепить такие поля к записи без индексации и без добавления в текст лога.
Поля возвращаются с результатами запроса, по ним можно фильтровать. Для этого нужны индекс
Объём metadata учитывается в ingestion rate limit. Есть отдельные ограничения на размер и число полей у записи. Перенос из labels не делает хранение и обработку бесплатными.
Structured metadata в Loki
#архитектура_на_салфетке
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Имена Pod и process ID дают много уникальных значений. Если сделать их индексными labels в Loki, растёт кардинальность индекса. Structured metadata позволяет прикрепить такие поля к записи без индексации и без добавления в текст лога.
Поля возвращаются с результатами запроса, по ним можно фильтровать. Для этого нужны индекс
tsdb, schema ≥13, chunk format V4 и включённый allow_structured_metadata. Старый boltdb-shipper не поддерживается.Объём metadata учитывается в ingestion rate limit. Есть отдельные ограничения на размер и число полей у записи. Перенос из labels не делает хранение и обработку бесплатными.
Structured metadata в Loki
#архитектура_на_салфетке
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Опечатку в matrix можно поймать до запуска CI
В матрице workflow объявлен
В примере на карточке actionlint 1.7.12 для macOS arm64 вернул exit 1 с диагностикой про arch. После единственной замены matrix.arch на matrix.os тот же вызов вернул exit 0 без сообщений. Использован официальный бинарник, checksum архива совпал с указанным в релизе.
Флаги
Репозиторий actionlint
#арсенал_инженера
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
В матрице workflow объявлен
os, а в runs-on указан matrix.arch. actionlint замечает отсутствующее свойство локально, без отправки workflow на GitHub.В примере на карточке actionlint 1.7.12 для macOS arm64 вернул exit 1 с диагностикой про arch. После единственной замены matrix.arch на matrix.os тот же вызов вернул exit 0 без сообщений. Использован официальный бинарник, checksum архива совпал с указанным в релизе.
Флаги
-shellcheck= -pyflakes= отключают внешние ShellCheck и pyflakes. В этом примере проверяется ссылка на свойство матрицы. Успешный lint не подтверждает работу скриптов, секретов или удалённого CI.Репозиторий actionlint
#арсенал_инженера
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Запись создана. Почему DNS ещё отвечает NXDOMAIN?
Рекурсивный резолвер мог получить NXDOMAIN ещё до создания записи и сохранить отрицательный ответ. Изменение авторитетной зоны само по себе не стирает этот кэш.
По RFC 2308 TTL такого ответа берут как минимум из SOA.MINIMUM и TTL самой SOA. Пока ответ хранится в кэше, TTL отсчитывается вниз. После нуля использовать этот кэшированный ответ нельзя.
На схеме условный пример: минимум из 900 и 300 секунд — 300. Если запись создать через минуту после NXDOMAIN, в этом кэше может оставаться ещё 240 секунд. Это иллюстрация механизма, а не обещание точного ожидания у любого резолвера.
NXDOMAIN, NODATA и SERVFAIL — разные ответы. Формулу отрицательного TTL нельзя переносить на любую ошибку DNS.
RFC 2308, разделы 3 и 5
#архитектура_на_салфетке
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Рекурсивный резолвер мог получить NXDOMAIN ещё до создания записи и сохранить отрицательный ответ. Изменение авторитетной зоны само по себе не стирает этот кэш.
По RFC 2308 TTL такого ответа берут как минимум из SOA.MINIMUM и TTL самой SOA. Пока ответ хранится в кэше, TTL отсчитывается вниз. После нуля использовать этот кэшированный ответ нельзя.
На схеме условный пример: минимум из 900 и 300 секунд — 300. Если запись создать через минуту после NXDOMAIN, в этом кэше может оставаться ещё 240 секунд. Это иллюстрация механизма, а не обещание точного ожидания у любого резолвера.
NXDOMAIN, NODATA и SERVFAIL — разные ответы. Формулу отрицательного TTL нельзя переносить на любую ошибку DNS.
RFC 2308, разделы 3 и 5
#архитектура_на_салфетке
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Ротация токена не сбрасывает кэш BuildKit
Содержимое build-secret не входит в ключ кэша Docker BuildKit. Если заменить только токен, закэшированный шаг может сохраниться.
Secret ID и путь монтирования участвуют в cache checksum. Их изменение инвалидирует кэш.
Если после ротации нужно выполнить шаг заново, Docker предлагает менять build argument этого шага с произвольной несекретной ревизией. Сам токен передают через secret mount. Его значение нельзя помещать в ARG или ENV.
Повторный запуск шага не гарантирует свежесть скачанного артефакта.
Build cache invalidation
#арсенал_инженера
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Содержимое build-secret не входит в ключ кэша Docker BuildKit. Если заменить только токен, закэшированный шаг может сохраниться.
Secret ID и путь монтирования участвуют в cache checksum. Их изменение инвалидирует кэш.
Если после ротации нужно выполнить шаг заново, Docker предлагает менять build argument этого шага с произвольной несекретной ревизией. Сам токен передают через secret mount. Его значение нельзя помещать в ARG или ENV.
Повторный запуск шага не гарантирует свежесть скачанного артефакта.
Build cache invalidation
#арсенал_инженера
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Stern читает логи в двух режимах
Stern собирает логи нескольких Pod и контейнеров Kubernetes. В режиме живого слежения он подхватывает новые подходящие Pod. Но перед широким запросом стоит проверить
Без
С
Namespace, selector и фильтр контейнера сужают выборку до увеличения лимита. Нужны доступ к кластеру и права на чтение Pod и их логов. Stern читает доступные логи, долговременное хранилище он не создаёт.
README Stern
#арсенал_инженера
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
Stern собирает логи нескольких Pod и контейнеров Kubernetes. В режиме живого слежения он подхватывает новые подходящие Pod. Но перед широким запросом стоит проверить
--max-log-requests.Без
--no-follow значение по умолчанию — 50. При достижении лимита одновременных запросов Stern завершается с ошибкой.С
--no-follow значение по умолчанию — 5: оно ограничивает число параллельных чтений. После вывода всех выбранных логов программа завершится. Это не ограничение «показать только пять Pod».Namespace, selector и фильтр контейнера сужают выборку до увеличения лимита. Нужны доступ к кластеру и права на чтение Pod и их логов. Stern читает доступные логи, долговременное хранилище он не создаёт.
README Stern
#арсенал_инженера
📍 Вакансии • Задачи • Собесы
Библиотека devops'a
PreSync-миграция должна выдерживать повторный запуск
При полном sync в Argo CD hook может запуститься снова из-за изменения, не связанного с БД. Поэтому миграционный скрипт должен учитывать уже выполненные шаги и безопасно переносить повторный запуск.
Пароль тоже зависит от порядка фаз.
Успешный Job подтверждает завершение hook, но не нужное состояние внешней БД. Проверку результата миграции нужно предусмотреть отдельно.
При selective sync hooks не запускаются.
Документация Argo CD, снимок master
#архитектура_на_салфетке
При полном sync в Argo CD hook может запуститься снова из-за изменения, не связанного с БД. Поэтому миграционный скрипт должен учитывать уже выполненные шаги и безопасно переносить повторный запуск.
Пароль тоже зависит от порядка фаз.
PreSync идёт раньше обычного Secret из того же Application. Hook получит старое значение или не запустится, если Secret ещё нет. Варианты из документации: вынести credentials за пределы Application либо сделать Secret тоже PreSync-hook с меньшей sync-wave.Успешный Job подтверждает завершение hook, но не нужное состояние внешней БД. Проверку результата миграции нужно предусмотреть отдельно.
При selective sync hooks не запускаются.
Документация Argo CD, снимок master
#архитектура_на_салфетке
Quadlet: ищите исходник, если сервис не появился
Файл
Если сервис не найден, проверьте каталог исходника и контекст systemd: rootless работает с пользовательскими units, rootful — с системными. Затем проверьте вывод генератора в режиме dry-run. Ошибка синтаксиса или опция из более новой версии Podman могут помешать созданию сервиса.
Автозапуск задаётся в
Quadlet требует cgroup v2. Проверяйте и имя: сгенерированный сервис может заменить одноимённый vendor unit.
Документация Quadlet, latest
#арсенал_инженера
Файл
.container ещё не systemd-сервис. При загрузке и перечитывании конфигурации генератор Quadlet превращает его в .service.Если сервис не найден, проверьте каталог исходника и контекст systemd: rootless работает с пользовательскими units, rootful — с системными. Затем проверьте вывод генератора в режиме dry-run. Ошибка синтаксиса или опция из более новой версии Podman могут помешать созданию сервиса.
Автозапуск задаётся в
[Install] исходного Quadlet. Сгенерированный unit считается transient, включать его как обычный постоянный сервис нельзя.Quadlet требует cgroup v2. Проверяйте и имя: сгенерированный сервис может заменить одноимённый vendor unit.
Документация Quadlet, latest
#арсенал_инженера