DevOps на турнике
539 subscribers
43 photos
4 videos
4 files
17 links
Просто DevOps без инфо-шума и понтов

Вопросы и предложения - devopsiron@gmail.com

Тренажер для подготовки к DevOps и SRE - @devops_iron_mentor_bot
Download Telegram
📦 Вот что реально могут спросить на собесе

Тема: PgBouncer и Connection Pooling

Пиши pgbouncer / postgres / pooling в комментариях, если работаешь с этим стеком 👇

---

## Почему Postgres не любит тысячи соединений

Многие думают, что проблема решается увеличением:
max_connections = 1000

Но это почти никогда не правильное решение.

Каждое новое подключение к PostgreSQL — это отдельный процесс операционной системы, а не поток.

На каждое соединение тратятся:

• создание процесса (`fork()`);
• аутентификация;
• собственная память (обычно 5–10 МБ);
• переключение контекста процессора.

Получается примерно так:
1000 клиентов


1000 процессов PostgreSQL


CPU ↑
RAM ↑
Context Switch ↑

Сервер начинает тратить ресурсы не на выполнение SQL-запросов, а на обслуживание тысяч процессов.

---

## 🚕 Что делает PgBouncer

Представь службу такси.

Есть:

- 1000 пассажиров (подключений приложения);
- всего 20 машин (реальных соединений с Postgres).

Каждый пассажир думает, что машина принадлежит только ему.

Но после поездки машина сразу возвращается обратно и используется следующим клиентом.

Получается:
1000 клиентов


PgBouncer


20 соединений


PostgreSQL

Именно поэтому база перестаёт захлёбываться под нагрузкой.

---

## 🔀 Три режима работы PgBouncer

### 1️⃣ Session mode
Client

Connection

Postgres

Соединение закрепляется за клиентом на всю сессию.

максимально совместим

экономия соединений небольшая

---

### 2️⃣ Transaction mode
Client

Transaction

Pool

Postgres

Соединение выдаётся только на время транзакции.

После COMMIT или ROLLBACK сразу возвращается обратно в пул.

лучший режим для большинства production-систем

максимальная экономия соединений

---

### 3️⃣ Statement mode
Каждый SQL-запрос

получает новое соединение

После каждого запроса соединение сразу возвращается в пул.

Максимальная производительность.

Но есть серьёзное ограничение:

транзакции работать не будут.

Используется крайне редко.

---

## 🪤 Любимая ловушка на собеседовании

Почему в Transaction Mode ломаются некоторые вещи?

Потому что после завершения транзакции клиент уже может получить совсем другое соединение.

Из-за этого возникают проблемы.

### Advisory Locks

Плохой вариант:
pg_advisory_lock(...)

Блокировка живёт на соединении.

Соединение ушло обратно в пул → логика ломается.

Используйте:
pg_advisory_xact_lock(...)

Он живёт внутри транзакции.

---

### LISTEN / NOTIFY

Подписка тоже существует только на конкретном соединении.

В Transaction Mode соединение постоянно меняется.

И уведомления перестают приходить.

---

### Prepared Statements

Раньше это тоже была большая проблема.

Начиная с PgBouncer 1.21+ появилась поддержка через:
max_prepared_statements

Поэтому этот вопрос сегодня уже встречается значительно реже.

---

## Что чаще всего спрашивают

Зачем нужен PgBouncer, если есть max_connections?

Чем отличаются Session, Transaction и Statement Mode?

Почему Transaction Mode ломает Advisory Locks?

Почему LISTEN / NOTIFY плохо работает через PgBouncer?

Как подобрать размер пула?

Что выбрать:

- PgBouncer
- или встроенный connection pool приложения?

---

💡 Главное, что стоит запомнить

PostgreSQL плохо масштабируется количеством соединений.

Он отлично масштабируется количеством запросов.

Поэтому задача PgBouncer - не ускорить базу, а не дать ей умереть от тысяч подключений.

Сохрани пост - этот вопрос встречается практически на каждом собеседовании уровня Middle/Senior.

#postgres #pgbouncer #database #devops #sre #backend
👍6🔥2
📦 Вот что реально могут спросить на собесе

Тема: процесс завис в D-state

Пиши dstate / wchan / iostat в комментариях, если сталкивался с таким на проде 👇

---

## 🔴 Задача с собеседования

У тебя завис процесс.

В top или htop он находится в состоянии D (Uninterruptible Sleep).

CPU почти не используется, но iostat показывает высокую нагрузку на диск.

Что делать?

---

## ⚠️ Главное, что нужно знать

Большинство кандидатов первым делом делают:


kill -9 <PID>


И удивляются, что ничего не произошло.

Почему?

Потому что процесс в D-state находится внутри операции ввода-вывода (I/O).

Пока ядро не получит ответ от диска или сетевого хранилища, процесс невозможно завершить даже через SIGKILL.

Именно поэтому kill -9 здесь не работает.

---

## 🔍 Шаг 1. Найти процессы в D-state


ps aux | awk '$8=="D"{print $2,$11}'

# или

top -b -n1 | grep " D "


Если процессов несколько, начинаем с тех, которые находятся в D-state дольше всего.

---

## 🔍 Шаг 2. Посмотреть, чего именно ждёт процесс

Самый полезный файл:


cat /proc/<PID>/wchan


Примеры:


io_schedule


➡️ ожидание дисковой операции


nfs_wait


➡️ ожидание NFS


futex_wait_queue


➡️ ожидание блокировки

Если нужно увидеть полный стек ядра:


cat /proc/<PID>/stack


Там можно встретить:


submit_bio
ext4_file_write_iter
blk_mq_get_tag


Это уже позволяет понять, где именно зависла операция.

---

## 🔍 Шаг 3. Узнать, с чем работает процесс

Какие файлы открыты:


lsof -p <PID>


Только обычные файлы и блочные устройства:


lsof -p <PID> | grep -E "REG|BLK"


Если процесс ещё выполняет системные вызовы:


strace -p <PID> \
-e trace=read,write,pread64,pwrite64 -T


Флаг:


-T


показывает время выполнения каждого вызова.

---

## 🔍 Шаг 4. Проверить диск

Общая нагрузка:


iostat -x 1


I/O конкретного процесса:


iotop -p <PID>


Статистика процесса:


cat /proc/<PID>/io


Смотри:

- количество чтений;
- количество записей;
- объём данных;
- скорость роста счётчиков.

---

## 🔍 Шаг 5. Если проблема в NFS

Проверяем подключённые файловые системы:


mount | grep nfs


Статистика клиента:


nfsstat -c


И снова смотрим:


cat /proc/<PID>/wchan


Если видишь:


nfs4_wait_bit_killable


Практически наверняка процесс ждёт ответа от NFS-сервера.

---

## 🪤 Любимая ловушка на собеседовании

Можно ли убить процесс в D-state?

Ответ:

Нет.

Пока операция ввода-вывода не завершится, ядро не обработает сигнал.

Обычно остаются только три варианта:

- дождаться завершения I/O;
- принудительно размонтировать проблемную файловую систему (если это возможно):


umount -f -l /mnt/storage


- либо перезагрузить сервер.

---

## Что чаще всего спрашивают

Чем D-state отличается от Sleeping и Running?

Почему kill -9 не работает?

Что показывает /proc/<PID>/wchan?

Как определить, диск это или NFS?

Какие команды используешь для диагностики?

---

## 💡 Главное правило

Если процесс находится в D-state, почти всегда проблема не в самом процессе.

Проблема ниже:

- диск;
- RAID;
- SAN;
- NFS;
- iSCSI;
- файловая система;
- драйвер;
- блочное устройство.

Именно их нужно искать в первую очередь.

Сохрани пост — вопрос про D-state регулярно встречается на собеседованиях Middle и Senior DevOps/SRE.

#linux #devops #sre #troubleshooting #kernel #interview
2👏2🐳2
📦 401, 403, 404, 500, 502, 503, 504...

Если ты DevOps, Backend или SRE, то эти коды ошибок видишь почти каждый день.

Но большинство знает только их названия. А вот что именно они означают и где искать проблему — уже вопрос.

Разбираемся.

---

## 🟢 2xx — Всё хорошо

200 OK — запрос успешно выполнен.

201 Created — ресурс создан.

204 No Content — операция успешна, но сервер ничего не возвращает.

---

## 🟠 4xx — Ошибка клиента

### 400 Bad Request

Неверный запрос.

Например:

- битый JSON;
- отсутствует обязательное поле;
- неверный формат данных.

---

### 401 Unauthorized

Сервер не знает, кто ты.

Причины:

- нет JWT;
- токен просрочен;
- отсутствует авторизация.

Запомнить просто:

> Сначала представься.

---

### 403 Forbidden

Сервер знает пользователя, но не разрешает доступ.

Например:


user → /admin





403 Forbidden


💡 Мнемоника:

401 — не знает.

403 — знает, но не пускает.

---

### 404 Not Found

Ресурс не найден.

---

### 405 Method Not Allowed

URL существует, но этот HTTP-метод запрещён.

---

### 409 Conflict

Конфликт данных.

Например, пользователь с таким email уже существует.

---

### 429 Too Many Requests

Сработал Rate Limit.

Часто встречается в:

- Nginx
- Cloudflare
- API Gateway
- Kubernetes Ingress

---

## 🔴 5xx — Ошибка сервера

### 500 Internal Server Error

Ошибка внутри приложения.

Ищем логи Backend.

---

### 502 Bad Gateway

Очень любят спрашивать на собеседованиях.

Схема:


Client

Nginx

Backend


Nginx смог подключиться к Backend.

Но получил некорректный ответ.

Поэтому вернул:


502 Bad Gateway


---

### 503 Service Unavailable

Сервис временно недоступен.

Причины:

- приложение выключено;
- deployment обновляется;
- maintenance;
- backend исключён из балансировки.

---

### 504 Gateway Timeout

Самая частая путаница с 502.

При 504 Backend вообще не успел ответить.

Причины:

- долгий SQL;
- блокировки;
- зависший API;
- перегруженный сервер.

---

## 💡 Как отличить 502 и 504

Очень простой способ.

Открой логи Backend.

👉 Есть запись о запросе?

Скорее всего 502.

👉 Запроса нет вообще?

Почти наверняка 504.

Тогда ищем:

- timeout;
- сеть;
- firewall;
- балансировщик;
- перегруженный upstream.

---

## 🧠 Шпаргалка


200 Всё хорошо

400 Неверный запрос

401 🔑 Не знает кто ты

403 🚫 Знает, но не пускает

404 🔍 Не найдено

405 Метод запрещён

409 Конфликт

429 🚦 Слишком много запросов

500 💥 Ошибка приложения

502 🔄 Backend ответил неправильно

503 🛠 Сервис недоступен

504 Backend не успел ответить


💬 Какой HTTP-код чаще всего встречается у тебя в работе?

#devops #backend #sre #nginx #http
🔥62👍1
🚨 GitLab CI может обманывать. И большинство узнаёт об этом только после падения продакшена.

Есть опасное заблуждение:

> Pipeline зелёный = релиз успешный.

К сожалению, это не так.

GitLab CI не знает, работает ли ваше приложение. Он знает только одно: все команды в Job завершились без ошибок.

И это две большие разницы.

---

## Самая распространённая ошибка

Вот обычный Job:


deploy:
stage: deploy
script:
- kubectl apply -f deployment.yaml


Pipeline станет зелёным, если команда выполнится успешно.

Но что будет дальше?

Возможны десятки сценариев:

Pod ушёл в CrashLoopBackOff

Образ не скачался (`ImagePullBackOff`)

Приложение не прошло Readiness Probe

Контейнер стартует 5 минут

Deployment завис во время rollout

GitLab этого не проверяет.

Он уже считает, что деплой успешен.

---

## Как делают новички


deploy:
script:
- kubectl apply -f app.yaml


Получают:


Pipeline Passed


И спокойно идут пить кофе.

Через пять минут приходит сообщение:

> Прод не работает.

---

## Как делают в production

После деплоя всегда ждут завершения rollout.


deploy:
stage: deploy
script:
- kubectl apply -f deployment.yaml
- kubectl rollout status deployment/my-app --timeout=300s


Теперь GitLab дождётся, пока Kubernetes действительно обновит приложение.

Если хотя бы один Pod не сможет подняться, Job завершится ошибкой.

Именно этого обычно и ждут на production.

---

## Ещё несколько причин, почему Pipeline зелёный, а приложение не работает

### 1. allow_failure


tests:
allow_failure: true


Тесты могут полностью упасть.

Pipeline всё равно останется зелёным.

Используйте только там, где падение действительно допустимо.

---

### 2. Ошибка скрыта


./deploy.sh || true


Или


set +e


Такие конструкции скрывают реальные ошибки.

GitLab считает, что всё прошло успешно.

---

### 3. Нет проверки готовности

Deployment создан.

Но приложение ещё не готово принимать трафик.

Если сразу завершить Job, пользователи могут получить ошибки, хотя Pipeline уже зелёный.

---

### 4. Используется старый образ

Очень частая проблема:


image: latest


или


kubectl set image ...


с тем же тегом.

Kubernetes может вообще не скачать новую версию.

Pipeline успешный.

Код старый.

---

### 5. Нет smoke-тестов

Deployment закончился.

Но никто не проверил:


curl https://service/health


Иногда один простой запрос после деплоя спасает больше, чем десятки тестов до него.

---

## Что чаще всего спрашивают на собеседовании

Что означает зелёный Pipeline?

Почему kubectl apply не гарантирует успешный релиз?

Для чего нужен kubectl rollout status?

Чем отличается успешный Job от успешного Deployment?

Какие проверки должны выполняться после деплоя?

---

## 💡 Главное правило

GitLab CI проверяет команды.

Production проверяет результат.

Поэтому хороший pipeline заканчивается не на:


kubectl apply


А на проверке того, что приложение действительно работает:


kubectl rollout status deployment/my-app


или


kubectl wait \
--for=condition=Ready \
pod \
-l app=my-app


или хотя бы


curl https://service/health


Именно эти несколько строк отличают учебный pipeline от production-ready CI/CD.

💬 А какие проверки после деплоя используете вы? Только rollout status или ещё добавляете smoke-тесты и проверки health endpoint?

#gitlab #gitlabci #devops #kubernetes #cicd #sre #linux
👍42
🐳 Docker - 15 вопросов, которые реально спрашивают на собеседованиях

Если готовишься на DevOps, SRE или Backend - эти вопросы стоит знать без запинки.

В видео разобрал:

Что такое образ и контейнер
Dockerfile и слои образов
CMD vs ENTRYPOINT
COPY vs ADD
bind mount, volume и tmpfs
bridge, host и overlay сети
Почему контейнер завершается сразу после запуска
Разница между docker stop и docker kill
Как уменьшить размер образа
Multi-stage build
Практические вопросы, которые действительно встречаются на собеседованиях

Без воды - только теория, практика и реальные вопросы.

🎬 Смотреть:
https://www.youtube.com/watch?v=pOGJ0Tlt3P4

💬 А какой вопрос по Docker на собеседовании был самым неожиданным для вас?

#docker #devops #kubernetes #linux #backend #sre #собеседование #it #programming #dockerfile
🔥6
🔥 Сохраняй, пригодится каждому, кто работает с Linux

Собрал компактную шпаргалку с командами, которые действительно используются каждый день.

Внутри:
• навигация по файловой системе;
• поиск файлов;
• права доступа;
• процессы;
• сеть;
• архивы;
• логи;
• диски;
• системная информация;
• полезные сочетания и лайфхаки.

Такую шпаргалку удобно держать под рукой во время подготовки к собеседованию или работы в терминале.

💾 Сохрани, чтобы не искать команды каждый раз.

#linux #devops #sysadmin #backend #docker #kubernetes #terminal #cheatsheet #собеседование
🔥71🫡1
TCP ПРОТИВ UDP: ЧТО РЕАЛЬНО СПРАШИВАЮТ🐸🐸

Видео грузится рывками, но никогда не виснет намертво. Файл либо скачался целиком, либо не скачался вообще. Это не совпадение, это два разных протокола под капотом

Пиши tcp/udp/handshake в комментариях, если работаешь с сетями 👇

1️⃣Тройное рукопожатие TCP

Перед передачей данных TCP устанавливает соединение. Клиент отправляет SYN, сервер отвечает SYN ACK, клиент подтверждает ACK. Только после этого стартует передача

2️⃣Надёжность и порядок

Каждый пакет TCP пронумерован. Пакет потерялся, получатель узнает и запросит его заново. Порядок всегда восстанавливается на приёмнике, даже если пакеты пришли вразнобой

3️⃣ Как работает UDP

Никакого рукопожатия. Отправитель просто шлёт пакеты. Потерялся пакет, никто его не пересылает

4️⃣ Кто что использует

Видеозвонок использует UDP, задержка важнее полноты. Скачивание файла использует TCP, там каждый байт обязан дойти

⚠️ Ловушка с собеса

У TCP есть контроль перегрузки сети, при перегрузке канала отправитель сам снижает скорость. У UDP такого контроля нет вообще

🍌 Заголовки: TCP примерно 20 байт, UDP всего 8 байт. Меньше служебных данных, меньше задержка


Практика: смотрим рукопожатие TCP вживую🥰

🔥Команда для перехвата трафика на порту 443, только флаги TCP, без данных:


tcpdump -i any -n 'tcp port 443' -c 20


Что увидишь в выводе:


IP client.54321 > server.443: Flags [S], seq 100
IP server.443 > client.54321: Flags [S.], seq 200, ack 101
IP client.54321 > server.443: Flags [.], ack 201


🔥Расшифровка флагов
[S] это SYN, [S.] это SYN ACK (точка после S как раз и означает ACK), [.] это чистый ACK без данных

Ровно три строки, ровно три пакета рукопожатия, prямо как в видео

Для сравнения, если перехватить UDP трафик:


tcpdump -i any -n 'udp port 53' -c 5


Там сразу пойдут пакеты с данными, без единого флага рукопожатия, потому что UDP его просто не делает
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Ну что ж, июль получился очень продуктивным. 🚀

За этот месяц мои ребята получили 5 офферов с зарплатами от 250 000 ₽ до 465 000 ₽ net.

Самое приятное - практически все уже нашли работу и вышли на новые позиции. Очень рад за каждого. 💪

В августе хочу взять в работу ещё 5 человек и помочь им подготовиться к собеседованиям, собрать сильную легенду, подтянуть техническую базу и получить свой оффер.

Если давно хотел сменить работу или выйти на новый уровень по зарплате - напиши «»в чате. Посмотрим, смогу ли помочь именно тебе.👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
БЕСПЛАТНО ВОЗЬМУ 10 ЧЕЛОВЕК И ДОВЕДУ ДО ОФФЕРА 🎁

Повелся? 😆
Каждый раз, когда открываю сообщения, вижу одно и то же:

“А есть что-нибудь бесплатное?”

“А можно сначала попробовать?”

“А подешевле есть?”

И знаешь, что самое интересное?

Очень часто именно эти люди через год снова пишут:

“Я всё ещё не могу найти работу.”

Совпадение?

Не думаю.

Проблема не в деньгах.

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

Давай посмотрим на это с другой стороны.

Что ты покупаешь на самом деле?

Не видеозаписи.

Не созвоны.

Не чат.

Ты покупаешь возможность выйти на новую зарплату.

Ты получаешь:

• понятный маршрут без бесконечных “что учить дальше”;

• практику на задачах, максимально похожих на реальные проекты;

• подготовку к техническим собеседованиям;

• ревью резюме;

• поддержку человека, который уже прошёл этот путь и знает, где обычно ошибаются.

Если после этого ты начинаешь получать даже на 100-200 тысяч рублей больше, то стоимость обучения становится просто инвестицией.

Есть ещё один момент.

Я не заинтересован просто продать обучение.

Большую часть оплаты я получаю только тогда, когда ты доходишь до результата и получаешь оффер.

Получается, у нас одна цель.

Мне выгодно, чтобы ты устроился как можно быстрее.

Поэтому главный вопрос вообще не в цене.

Вопрос в другом.

Ты действительно хочешь изменить свою карьеру?

Или продолжаешь искать место, где обещают результат бесплатно?

Если ты готов работать, а не искать волшебную таблетку, пора решаться и не искать бесплатную помощь


Набор открыт до 5-ого августа.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁71
SSH: ТЫ ЖМЁШЬ "YES" НА ПРЕДУПРЕЖДЕНИЕ, НЕ ПОНИМАЯ ЧТО ПРОИСХОДИТ 🍑

Заходишь на новый сервер. Терминал спрашивает про подлинность хоста. Ты жмёшь yes на автомате, как делают 99% инженеров

А зря. ⚡️Именно в этот момент SSH делает то, что защищает тебя от подмены сервера целиком

1️⃣ Как рождается общий секрет из воздуха

Клиент и сервер договариваются об общем секретном ключе по абсолютно незащищённому каналу. Каждая сторона независимо вычисляет одинаковый секрет. Подсмотревший обмен снаружи вычислить его физически не может

2️⃣ То самое предупреждение - не формальность


The authenticity of host '192.168.1.10' can't be established.
ED25519 key fingerprint is SHA256:xk3Jf9K7dQpL9mNc4Xr2vY8zQwEr...
Are you sure you want to continue connecting (yes/no)?


Это единственный момент, где ты доверяешь серверу наощупь. Отпечаток сохраняется здесь:


cat ~/.ssh/known_hosts


⚠️Ловушка с собеса

Если при повторном подключении отпечаток вдруг изменился, увидишь вот это:


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


Это не баг. Это SSH кричит, что кто-то мог подменить сервер между тобой и настоящей машиной

3️⃣ Почему пароль это вчерашний день


ssh-keygen -t ed25519 -C "твой_email@example.com"
ssh-copy-id user@server_ip


Приватный ключ никогда не покидает твою машину. Сервер присылает случайное число, ты подписываешь его приватным ключом, сервер сверяет подпись публичным. Ключ физически не передаётся по сети, а сервер точно знает, что он у тебя есть

4️⃣ Чтобы не вводить пароль от ключа каждый раз


eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519


Агент держит расшифрованный ключ в памяти и подписывает запросы сам, пока жива сессия

Что чаще всего спрашивают на собесе

1. Как SSH устанавливает общий секрет по незащищённому каналу
2. Зачем нужен отпечаток ключа хоста
3. Чем аутентификация по ключу отличается от пароля
4. Что защищает от атаки посредника
5. Как работает ssh-agent
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52🫡1
😵‍💫Твой телефон прямо сейчас может делить один IP-адрес с тысячами незнакомых людей.

Звучит странно? Если ты сидишь с мобильного интернета, вероятность очень высокая.
Большинство думает, что у каждого устройства есть свой уникальный IP-адрес. На самом деле это давно не так.
Представь обычную квартиру. Дома у тебя есть ноутбук, телефон и телевизор. Например:

💻 Ноутбук - 192.168.0.10

📱 Телефон - 192.168.0.15

📺 Телевизор - 192.168.0.20

Каждое устройство получает свой IP только внутри домашней сети.
Но как только они выходят в интернет, роутер делает NAT (Network Address Translation) - заменяет все внутренние адреса на один общий публичный IP.

Получается, что три разных устройства для всего интернета выглядят как одно.
Но возникает вопрос: как роутер понимает, кому вернуть ответ?
Очень просто. Он создаёт таблицу соответствий.

Например:


192.168.0.10:52341 → 95.25.143.18:41001

192.168.0.15:60124 → 95.25.143.18:41002

192.168.0.20:49812 → 95.25.143.18:41003


Когда сервер отвечает на адрес 95.25.143.18:41002, роутер понимает, что эти данные нужно отправить телефону, а не ноутбуку или телевизору.

🤯 А теперь самое интересное.

Домашний роутер это только начало.
Мобильные операторы используют технологию Carrier-Grade NAT (CGNAT).
Это означает, что тысячи людей могут одновременно выходить в интернет через один и тот же публичный IP-адрес.

Да, прямо сейчас человек, который стоит рядом с тобой в метро или сидит за соседним столиком в кафе, вполне может использовать тот же внешний IP, что и ты.

Поэтому один публичный IP совсем не означает одного пользователя.
Проверить это очень просто.

1️⃣Локальный IP:


ip addr

или


ipconfig


2️⃣Публичный IP:


curl ifconfig.me

или

curl ipinfo.io/ip


Если локальный адрес начинается с 192.168.x.x, 10.x.x.x или 172.16–172.31.x.x, а публичный IP совсем другой между тобой и интернетом работает NAT.
Именно из-за NAT иногда невозможно открыть порт, возникают проблемы с домашними серверами и VPN, а один IP может принадлежать сразу тысячам пользователей.

🔥 А ты знал, что мобильный оператор может выдать один публичный IP сразу тысячам людей?
Please open Telegram to view this post
VIEW IN TELEGRAM
5
🔫БАЗА ВСТАЛА ПОД НАГРУЗКОЙ: КАК НАЙТИ, КТО КОГО БЛОКИРУЕТ В POSTGRESQL

CPU свободен. Диск свободен. А база не отвечает

Знакомая ситуация: запросы вроде те же, что вчера, а сегодня всё стоит. База не работает, она ждёт — и если не знать, куда смотреть, диагностика превращается в гадание

Пиши postgres/locks/deadlock в комментариях, если сталкивался 👇

Главное, что нужно запомнить

Блокировка живёт не до конца запроса, а до конца транзакции. Взяла блокировку на строку, потом полминуты делала что-то ещё, ходила во внешний сервис — всё это время держит. Блокировки сами по себе быстрые, держат их долго именно длинные транзакции

1️⃣ Кто кого блокирует

Первое, что нужно узнать: кто на кого ждёт


SELECT pid,
pg_blocking_pids(pid) AS blocked_by,
wait_event_type,
query
FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0;


Слева процессы, которые ждут, справа те, кто им мешает. Один и тот же PID справа у многих строк — вот он, корень

Дальше смотрим, чем занят этот процесс:


SELECT pid,
now() - xact_start AS xact_age,
now() - query_start AS query_age,
state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE pid = <тот_самый_pid>;


Состояние объясняет, с какой из проблем ты столкнулся

2️⃣ Idle in transaction — самая обидная причина

Транзакция открыта, блокировки взяты, а процесс ничего не делает. Обычно приложение сделало BEGIN, выполнило пару запросов, и ушло куда-то не в базу: вызов внешнего API, обработка в коде, а то и вовсе застряло на ошибке без COMMIT

База при этом полностью здорова, просто ждёт, пока приложение вспомнит закрыть транзакцию. Признак железный: xact_age растёт, query_age нет

Лечится сужением транзакции. И есть страховка на сервере:


idle_in_transaction_session_timeout = '30s'


3️⃣ Долгая транзакция, которая реально работает

Здесь state = 'active', запрос честно выполняется, просто долго. Тяжёлый отчёт, миграция, аналитика на пол-таблицы

Классика, которая валит базы: кто-то запускает ALTER TABLE на большой таблице. DDL не может взять блокировку сразу, потому что таблицу читает долгая транзакция. Он встаёт в очередь. А за ним встают уже все остальные запросы к таблице, потому что новые не могут проскочить вперёд ожидающего DDL

Одна читающая транзакция плюс один ALTER парализуют весь доступ к таблице, хотя по отдельности ни то, ни другое базу бы не остановило

Лечится коротким таймаутом на захват блокировки для DDL:


SET lock_timeout = '2s';
ALTER TABLE orders ADD COLUMN note text;


Не взял блокировку за 2 секунды — упал с ошибкой, а не встал в очередь на полчаса

4️⃣Конкуренция за одни и те же строки

Ни забытых, ни особо длинных транзакций, просто много коротких дерутся за одну строку. Классика — счётчик, который инкрементят из сотни соединений разом:


UPDATE counters SET value = value + 1 WHERE id = 1;


Каждая транзакция быстрая, но выстраиваются в очередь, и под нагрузкой это становится узким местом. Диагностика другая — смотрим агрегированно:


SELECT wait_event_type, wait_event, count(*)
FROM pg_stat_activity
WHERE wait_event_type IS NOT NULL
GROUP BY 1, 2
ORDER BY 3 DESC;


Много Lock наверху — разносим горячие данные на несколько строк, суммируем при чтении

5️⃣ SELECT, который блокирует запись


SELECT * FROM orders WHERE id = 42 FOR UPDATE;


FOR UPDATE берёт блокировку, как будто строку уже обновляют. Ставят часто на всякий случай, а держится она до конца транзакции. Хуже, если попадает в запрос без LIMIT — залочит все возвращённые строки разом

Если строгая блокировка не нужна, есть более мягкий FOR SHARE. А часто оказывается, что блокировка вообще не нужна
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
KubeDiagrams - прикольная open source штука, которая сама рисует схемы k8s

На вход можно дать YAML, Helm, Helmfile, Kustomize или даже живой кластер. На выходе получаешь диаграмму

CRD понимает, экспортит в PNG/SVG/PDF/draw.io

Для доки, онбординга и быстрого разбора "что у вас тут происходит" выглядит полезно 🧃

https://github.com/philippemerle/KubeDiagrams
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Эйчары начали просить время рождения в резюме — чтобы составлять натальные карты кандидатов и оценить человека ещё до собеседования 😭
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡9👍4🖕1
DEVOPS В РОССИИ 2025: ЦИФРЫ, КОТОРЫЕ СТОИТ ЗНАТЬ 💳

Свежий опрос российских DevOps-инженеров. Разберём подробно, с цифрами, потому что за этими процентами реально видно, куда двигается индустрия.

1️⃣ Топовые команды оторвались от середняков

Доля Elite-команд выросла на 4%, High на 2%. Суммарно топ-профили прибавили 6% за год.

А вот что интересно: разрыв виден не только в релизах, но и в том, как разработчики оценивают свою же работу. Спросили инженеров, согласны ли они с утверждением "обратная связь оперативна, я всё ещё в контексте задачи":

Low — 70,0%
Medium — 80,8%
High — 83,3%
Elite — 85,1%

А с формулировкой "обратная связь информативна и помогает исправить ошибки":

Low — 76,4%
Elite — 89,6%

Разница в 13 процентных пунктов на одном и том же вопросе. Это не про мотивацию людей, это про то, как в команде устроены циклы обратной связи.

2️⃣ Инфобез это теперь часть пайплайна, а не отдельный отдел

75% инженеров используют метрики ИБ в работе, 40% говорят, что инструменты безопасности встроены прямо в CI/CD.

Но внедрение ИБ даётся не бесплатно. Топ проблем, с которыми сталкиваются команды:

45,5% — не хватает технической экспертизы у команды внедрения
42,3% — проблемы совместимости с текущими системами
41,0% — высокая стоимость
36,5% — обучение персонала
33,9% — избыточные алерты и ложные срабатывания
19,6% — vendor lock, зависимость от одного поставщика

Меньше всего боятся правовых и регуляторных требований (18%). Больше всего, буквально каждый второй, боится того, что команда просто не потянет внедрение технически.

3️⃣ ИИ используют 71,3%, но толку от него по-разному

Свой уровень в промпт-инжиниринге инженеры оценивают так:

Новичок — 21,8%
Любитель — 45,7%
Опытный — 27,8%
Гуру — 4,7%

Гуру, разумеется, меньшинство. Но именно они отмечают наибольший прирост личной и командной эффективности от ИИ. То есть навык работы с промптами буквально конвертируется в пользу, а не просто "у меня есть Copilot, стало быстрее".

Ловушка с собеса 🍑

Какие четыре метрики считаются мировым стандартом для оценки производительности DevOps-команды?

Deployment Frequency — частота деплоев
Lead Time for Changes — срок поставки изменений
Mean Time to Recovery — время восстановления после инцидента
Change Failure Rate — доля неудачных изменений

Это DORA-метрики. По ним, собственно, и делят команды на Low, Medium, High и Elite из первого пункта.

Индустрия взрослеет, а разрыв между теми, кто выстроил процессы, и теми, кто нет, увеличивается с каждым годом.

#devops #sre #dora #devopsинженер #ит #собес #ci_cd #backend #ии
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
ЧТО ДУМАЮТ О DEVOPS HR VS КАК ЭТО НА САМОМ ДЕЛЕ 🤔

Между тем, что пишет HR в вакансии, и тем, что реально происходит внутри компании, обычно пропасть в несколько этажей. Пройдёмся по всей воронке найма - от текста вакансии до оффера.

1️⃣ Текст вакансии

Кажется: ищут супергероя, который знает Kubernetes, Terraform, Ansible, Prometheus, три облака и Python на уровне синьора.

На самом деле: такую вакансию чаще всего пишет HR, который взял требования из трёх разных описаний и склеил их в одно, потому что не отличает DevOps от дата-инженера. Технический руководитель потом просто закрывает глаза на половину пунктов и смотрит на реальный опыт.

2️⃣ Отбор резюме

Кажется: резюме читает живой человек и оценивает опыт целиком.

На самом деле: в крупных компаниях первый фильтр — автоматическая система, которая ищет буквальные совпадения слов из вакансии. Если в вакансии написано «Kubernetes», а у тебя в резюме «k8s», система может тебя просто не увидеть.

Практический вывод: дублируй ключевые термины из вакансии дословно. Это не читерство, это работа с реальностью системы отбора.

3️⃣ Звонок с HR

Кажется: HR должен разбираться в том, что такое readinessProbe или Error Budget.

На самом деле: его задача — не техническая экспертиза, а проверка софт-скилов и базовых рамок: зарплата, формат работы, готовность к переезду. Если ты на этом звонке начинаешь спорить о деталях Kubernetes — просто теряешь время обоих.

4️⃣Техническое интервью

Кажется: чем больше лет опыта в резюме, тем сильнее кандидат.

На самом деле: технический интервьюер за десять минут разговора понимает реальный уровень, и цифра в резюме почти не влияет на решение. Видел кандидатов с пятью годами стажа, которые путают liveness и readiness probe. И видел человека с полутора годами опыта, который спокойно разбирает живой инцидент.

5️⃣Оффер и зарплата

Кажется: вилка в вакансии — это то, что ты гарантированно получишь.

На самом деле: вилка часто написана для привлечения откликов, а реальное число формируется по итогам технического интервью и иногда торга. Причём вилка может быть просто устаревшим шаблоном, который скопировали полгода назад и забыли обновить.

😵‍💫Отдельно про отказы

Отказ - это не приговор твоему уровню. Чаще всего это про несовпадение с конкретной командой прямо сейчас. Видел сильного кандидата, которого не взяли, потому что искали человека именно под легаси-зоопарк технологий, а не потому что он был плох.

Что реально решает на всех этапах 😵‍💫

Понятная история в резюме с ключевыми терминами из вакансии, чёткие ответы без воды на техническом интервью, и адекватность в общении. Все три вещи бесплатны и не требуют пятнадцати сертификатов.

А тебе попадались вакансии или отказы, которые явно писал не технарь?
#devops #hr #собес #devopsинженер #резюме #карьера #ит #трудоустройство
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
НАВЫКИ, КОТОРЫЕ РЕАЛЬНО ПРОДАЮТСЯ В DEVOPS В 2026 ГОДУ 🖐

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

Что умерло👌

Просто уметь Docker это уже не навык, а гигиенический минимум, как уметь пользоваться почтой.
Jenkins как основной инструмент в резюме сегодня скорее красный флаг, чем плюс - индустрия давно ушла в GitHub Actions и GitLab CI.
Пачка сертификатов без единой реальной истории за спиной впечатляет только того, кто их выдал.
А знание пятнадцати инструментов по верхам работает против тебя — на собесе такого человека раскалывают за три вопроса вглубь.

А что реально продаётся 👏

Kubernetes не на уровне туториала, а с пониманием, как он себя ведёт в проде. Сеть, хранилище, поведение под нагрузкой, апгрейд без даунтайма.

2️⃣ Observability. Не просто поставить Prometheus и Grafana, а собрать метрики так, чтобы по ним реально принимали решения, а не просто смотрели красивые дашборды.

3️⃣ GitOps. Компании физически устали от ручных деплоев через ssh и хотят декларативный подход через ArgoCD или Flux.

4️⃣ Terraform на серьёзном уровне - с модулями и нормальным управлением стейтом, а не один файл на триста строк.

5️⃣ Понимание надёжности: SLO, Error Budget, работа с постмортемами после инцидентов.

Показательный пример ☝️

Два кандидата с одинаковым стажем в три года.
Один пишет в резюме: знаю Docker, Kubernetes, Terraform, Ansible, Jenkins, Prometheus.
Второй пишет: снизил время деплоя с сорока минут до шести за счёт перехода на GitOps, и сократил количество инцидентов на треть после внедрения нормальных SLO.

Угадай, кого позовут на собес быстрее.
Дело не в списке технологий, а в том, что второй показал влияние на результат, а не просто перечислил стек.

Короче

Рынок устал от людей, которые всё попробовали, но ничего не довели до конца. Сейчас продаётся не ширина, а глубина плюс умение объяснить, что именно ты изменил.

А какой навык, по-твоему, уже потерял вес за последний год? Пиши в комментариях.


#devops #sre #kubernetes #gitops #devopsинженер #ит #собес #резюме #карьера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
😁3😢1🤨1😐1