DevOps | Вопросы собесов
5.35K subscribers
30 photos
1K links
Download Telegram
🤔 Сервис типа кластер P со значением nan, что это значит?

Если в системе мониторинга или логах кластерный сервис (Cluster P) показывает значение NaN (Not a Number), это означает, что данные недоступны или не определены.

🚩Возможные причины NaN в кластере

🟠Нет данных от сервиса (сбой мониторинга)
Метрика не обновляется из-за сбоя Prometheus, Zabbix или Grafana.
Датчики или агенты не отправляют данные.
Посмотреть логи агента

  journalctl -u node_exporter --no-pager | tail -20


Проверить доступность сервиса

  curl -s https://service-ip:port/metrics


🟠Ошибка в коде (деление на 0, пустой запрос)
Если метрика рассчитывается (X / Y), но Y = 0, результат будет NaN.
SQL-запрос возвращает пустой результат. Если используется PromQL, попробуйте запросить сырые данные:

  rate(http_requests_total[5m])


Проверить SQL-запрос, если данные идут из базы:

  SELECT AVG(value) FROM metrics WHERE time > now() - interval '1 hour';


🟠Проблема с кластером (узлы не отвечают)
Один или несколько узлов в кластере недоступны. DNS или балансировщик не может найти сервис.
Посмотреть статус узлов:

  kubectl get nodes


Проверить доступность сервиса в кластере:

  kubectl get pods -n monitoring


🟠Проблема с сетью (файрвол, маршрутизация)
Запросы блокируются файрволом (iptables, firewalld). Метрика приходит с другого узла, но между ними нет связи.
Проверить сетевые правила:

  iptables -L -n | grep DROP


Проверить соединение между узлами:

  nc -zv service-ip port


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊4🔥1
🤔 Разница между SQS и MSK в AWS?

- SQS (Simple Queue Service) — очередь сообщений, проста в использовании, полностью управляется AWS. Поддерживает:
- FIFO и стандартные очереди.
- Не гарантирует точно один раз доставку в стандартном режиме.
- MSK (Managed Streaming for Apache Kafka) — стриминговая платформа, аналог Kafka:
- Позволяет обрабатывать большие потоки данных.
- Сложнее, но более гибко.
SQS — простота, MSK — мощность и контроль.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Поды висят в pending, в чем проблема?

Pod в Pending означает, что он не может быть запущен, потому что Kubernetes не может его назначить (schedule) на ноду.
Нет свободных ресурсов на нодах (CPU, RAM)
Неподходящие nodeSelector, affinity или taints
Нет доступных узлов (все NotReady)
Проблемы с PersistentVolume (PVC не привязан)
Ошибки в CNI (сеть Kubernetes)

🚩Проверяем статус подов (`kubectl get pods`)

Команда
kubectl get pods -A


🚩Нет свободных ресурсов на нодах

Команда:
kubectl describe pod my-app-1


🚩Проблема с `nodeSelector`, `affinity`, `taints`

Если под настроен только на определенные ноды, он может не найти подходящую.
kubectl describe pod my-app-1


Вывод:
0/3 nodes are available: 3 node(s) didn't match pod affinity/selector.


🚩Все ноды в состоянии `NotReady`

Проверяем статус нод
kubectl get nodes


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем разница Deployment и DaemonSet?

`Deployment` в Kubernetes управляет развертыванием приложений, гарантируя наличие определенного количества реплик контейнеров в кластере, их обновление и масштабирование. `DaemonSet`, напротив, гарантирует, что на каждом узле кластера будет запущена ровно одна копия пода, что полезно для запуска системных служб, таких как агенты мониторинга. `Deployment` используется для управления приложениями, требующими масштабирования, а `DaemonSet` — для процессов, которые должны работать на каждом узле.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Зачем нужен стейт в Terraform?

Файл terraform.tfstate хранит текущее состояние инфраструктуры. Он нужен, чтобы Terraform знал, какие ресурсы уже существуют, и мог правильно управлять изменениями.

🟠Отслеживание ресурсов
Terraform использует tfstate, чтобы сопоставлять код с реальными ресурсами.
В коде создаем виртуальную машину
hcl  
resource "aws_instance" "example" {
ami = "ami-123456"
instance_type = "t2.micro"
}



Запускаем terraform apply, создается сервер в AWS
В terraform.tfstate записывается информация об этом ресурсе
При следующем terraform apply Terraform сверяет tfstate с реальными ресурсами и вносит только изменения

🟠Управление зависимостями
Когда ресурсы связаны (например, сервер и security group), Terraform понимает связи через tfstate и удаляет ресурсы в правильном порядке

🟠Работа в команде (`remote state`)
Когда несколько разработчиков работают с Terraform, tfstate должен храниться в общем месте, например
- S3 + DynamoDB (AWS)
- Terraform Cloud
- GCS + Firestore (GCP)
- Azure Storage + CosmosDB (Azure)
hcl  
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие бывают сервисы, как они на низком уровне работают?

Типы в Kubernetes:
- ClusterIP — доступен только внутри кластера.
- NodePort — доступ снаружи через IP:порт узла.
- LoadBalancer — работает через облачного провайдера.
- Headless Service — без IP, для StatefulSet и DNS.
На низком уровне: kube-proxy проксирует трафик через iptables или IPVS.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как в docker compose вместо yaml файла использовать json файл?

Docker Compose поддерживает использование JSON-файлов вместо стандартного YAML-файла. Формат JSON полностью совместим с YAML, так как YAML является надмножеством JSON. Для этого достаточно создать JSON-файл с описанием конфигурации контейнеров и передать его с помощью опции -f.

🚩Шаги по использованию

🟠Создайте JSON-файл конфигурации
Файл должен содержать описание сервисов в формате JSON. Например, вместо YAML
version: "3.9"
services:
web:
image: nginx
ports:
- "80:80"


В формате JSON будет так
{
"version": "3.9",
"services": {
"web": {
"image": "nginx",
"ports": ["80:80"]
}
}
}


🟠Запустите Docker Compose с этим файлом
Используйте флаг -f, чтобы указать Docker Compose, какой файл использовать
docker-compose -f docker-compose.json up


🟠Проверка работы
Вы можете проверить статус контейнеров, как обычно:
docker-compose -f docker-compose.json ps


🚩Почему использовать JSON?

🟠Совместимость
JSON часто используется в API, CI/CD-пайплайнах и других инструментах, которые могут генерировать конфигурации автоматически.
🟠Простота обработки
JSON легко парсить программно, что может быть полезно в скриптах и интеграциях.
🟠Стандартизация
Некоторые команды и проекты могут предпочитать JSON как более строгий и распространенный формат.

🚩Пример использования

1⃣Создайте файл docker-compose.json
{
"version": "3.8",
"services": {
"app": {
"image": "python:3.9",
"volumes": ["./app:/app"],
"working_dir": "/app",
"command": "python app.py"
}
}
}


2⃣Запустите
docker-compose -f docker-compose.json up


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как сделать донастройку контейнера?

Способы:
- docker exec — вручную изменить файл/установить пакеты.
- ENTRYPOINT + скрипт — настроить в момент запуска.
- Volume или конфиг-файл — монтировать на нужный путь.
- Создать Dockerfile, унаследованный от базового, и внести изменения.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3
🤔 Как настраивать графики на панели графаны?

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

1⃣Создание новой панели (Panel)
Откройте существующий дашборд или создайте новый: Перейдите в раздел Dashboards → New Dashboard.
Нажмите Add new panel для добавления панели.

2⃣Выбор источника данных
В интерфейсе панели в разделе Query выберите источник данных (Data Source) из выпадающего списка. Например, Prometheus, InfluxDB, MySQL, Elasticsearch. Подключение источника данных настраивается через Configuration → Data Sources.

3⃣Написание запроса для графика
Каждый источник данных имеет свой язык запросов. Примеры:
Prometheus
rate(http_requests_total[5m])


MySQL
SELECT time, value FROM metrics WHERE time > NOW() - INTERVAL 1 HOUR;


Elasticsearch: Используйте Lucene или Elasticsearch Query DSL.

4⃣Настройка визуализации
В разделе Visualization выберите тип графика: Time series (график по времени). Bar chart (столбчатая диаграмма). Gauge (гейдж/индикатор). Table (таблица). Pie chart (круговая диаграмма, доступна через плагин).
Настройте параметры визуализации: Линии, точки, области (lines, points, fill). Цвета линий, область графика. Подписи данных.

5⃣Форматирование данных
В разделе Transform: Преобразуйте данные (группировка, сортировка, вычисления). Добавьте фильтры или агрегируйте данные. В разделе Overrides: Настройте специфичные параметры для отдельных рядов данных (цвета, форматы отображения).

6⃣Настройка временного интервала
Выберите временной диапазон панели в правом верхнем углу дашборда: Например, последние 5 минут, 1 час, 24 часа. Установите параметры временного сдвига, если нужно отображать данные за конкретный период.

7⃣Настройка подписей и описаний
В разделе Panel settings: Укажите название панели. Добавьте описание для контекста.

8⃣Сохранение дашборда
Нажмите Save dashboard. Укажите имя дашборда и добавьте теги (опционально) для удобного поиска.

🚩Полезные фишки

🟠Панели Variables
Позволяют создавать динамические фильтры. Например, добавьте переменную для выбора имени хоста:
label_values(node_cpu_seconds_total, instance)


🟠Плагины визуализации
Установите дополнительные плагины из Grafana Marketplace (например, Pie Chart, Worldmap Panel).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Чем отличается CMD от ENTRYPOINT в DockerFile?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Зачем нужны теги в Ansible?

Теги в Ansible позволяют запускать только определенные задачи или роли, а не весь плейбук. Это ускоряет выполнение и упрощает управление конфигурацией.

🚩Когда использовать теги?

🟠Запуск только нужных задач
если плейбук содержит много шагов, можно выполнить только нужные.
🟠Разделение задач по категориям
например, отдельно установка, обновление, настройка сервиса.
🟠Оптимизация CI/CD
ускорение развертывания, выполняя только измененные задачи.

🚩Как использовать теги?

🟠Теги в задачах (`tasks`)
Простой пример – установка и перезапуск Nginx
yaml  
- name: Установить Nginx
apt:
name: nginx
state: present
tags: install

- name: Перезапустить Nginx
service:
name: nginx
state: restarted
tags: restart



Запуск только установки (install)
sh  
ansible-playbook playbook.yml --tags install



Запуск только перезапуска (restart)
sh  
ansible-playbook playbook.yml --tags restart



🟠Теги в ролях (`roles`)
Если у вас несколько ролей, можно запускать только нужную:
yaml  
- hosts: all
roles:
- { role: nginx, tags: web }
- { role: database, tags: db }



Запуск только роли database
sh  
ansible-playbook playbook.yml --tags db



🟠Исключение тегов (`--skip-tags`)
Можно пропустить выполнение определенных задач
sh  
ansible-playbook playbook.yml --skip-tags restart


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🤔 Каково ваше видение идеального workflow CI/CD?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊2🤔1
🤔 Что такое наследование, зачем оно?

Наследование – это механизм ООП, который позволяет создавать новый класс на основе существующего, перенимая его свойства и методы.

🚩Главная идея

🟠Родительский (базовый) класс
содержит общие свойства и методы.
🟠Дочерний (производный) класс
наследует их и может добавлять новые или переопределять старые.

🚩Зачем нужно наследование?

Код становится повторно используемым → меньше дублирования.
Логически группируем сущности → удобная архитектура.
Можно дополнять и изменять поведение без изменения базового класса.

🚩Пример наследования в Python

Базовый (родительский) класс
class Animal:
def __init__(self, name):
self.name = name

def make_sound(self):
return "Какой-то звук"


Дочерний класс (наследует Animal)
class Dog(Animal):
def make_sound(self):
return "Гав-гав"


Использование наследования
dog = Dog("Шарик")
print(dog.name) # Шарик (унаследовано от Animal)
print(dog.make_sound()) # Гав-гав (переопределено в Dog)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1💊1
🤔 Task удаляет файл, при первом запуске он удален, что должно быть при втором?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какие процессы убивает long killer?

Это системный механизм в Astra Linux (и некоторых других дистрибутивах на базе Debian), который убивает "долгоиграющие" процессы, потребляющие слишком много ресурсов. Он предотвращает зависания системы и защищает от неэффективного использования вычислительных мощностей.

🚩Какие процессы убивает Long Killer?

Long Killer анализирует процессы и завершает те, которые:
Запущены от обычного пользователя (не root).
Работают слишком долго (по умолчанию >10 минут).
Потребляют много CPU (по умолчанию >90% CPU).
Используют много памяти (если система близка к OOM – Out of Memory).
Не имеют активности (зависли, например, ожидание ввода).

Он не убивает root-процессы.
Системные службы (например, sshd, systemd) остаются нетронутыми.
Если процесс выполняется интерактивно (например, работа в vim или nano), он обычно не трогает его.

🚩Как проверить, что процесс убит Long Killer?

Если подозреваете, что ваш процесс завершился из-за Long Killer, посмотрите логи
journalctl -u long-killer.service --no-pager | tail -n 20


Также можно проверить dmesg
dmesg | grep "killed by Long Killer"


🚩Как отключить или настроить Long Killer?

Файл конфигурации находится здесь
/etc/long-killer.conf


Пример настроек
MAX_CPU_USAGE=90     # Максимальная загрузка CPU (%)
MAX_EXEC_TIME=600 # Максимальное время выполнения (секунды)
EXCLUDE_USERS=root # Не убивать процессы от root


После изменения перезапустите сервис
systemctl restart long-killer.service


Чтобы полностью отключить Long Killer
systemctl stop long-killer.service
systemctl disable long-killer.service


🚩Как избежать убийства процессов?

Запуск от root (если это безопасно):
sudo my_long_process

Снижение приоритета процесса (nice/renice)
nice -n 10 my_process
renice -n 10 -p <PID>

Использование nohup или screen для фоновых задач
nohup my_script.sh &


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое маска подсетей и зачем она нужна?

Маска подсети определяет, какая часть IP-адреса — это сеть, а какая — узел (host).
Например, маска
255.255.255.0 говорит: первые 3 октета — сеть, последний — устройства в ней.
Используется для разделения сети на подсети, маршрутизации и управления доступом.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔1
🤔 В каком файле по дефолту будет хранится инормация об ОС, версии в линуксе?

В Linux информация о версии дистрибутива и ядра хранится в нескольких файлах.

🟠Основной файл — `/etc/os-release`
Этот файл есть во всех современных дистрибутивах (Debian, Ubuntu, RHEL, CentOS, Fedora).
cat /etc/os-release


Пример содержимого /etc/os-release
NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
HOME_URL="https://www.ubuntu.com/"


🟠Альтернативный файл — `/etc/issue`
Некоторые дистрибутивы используют /etc/issue.
cat /etc/issue


Вывод
Ubuntu 22.04.3 LTS \n \l


🟠Информация о ядре — `/proc/version`
Этот файл содержит версию ядра и информацию о компиляции.
cat /proc/version


Вывод
Linux version 5.15.0-84-generic (buildd@lcy02-amd64-016) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0) #93-Ubuntu SMP


🟠Команды для проверки версии ОС
Проверить версию через lsb_release
lsb_release -a


Вывод
Distributor ID: Ubuntu  
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy


Проверить ядро через uname
uname -r


Вывод
5.15.0-84-generic


Можно также вывести полную информацию:
uname -a


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Что такое сквош (squash)?

Squash — это процесс объединения нескольких коммитов в один перед слиянием ветки. Применяется для:
- очистки истории;
- упрощения отката;
- группировки связанных изменений;
- подготовки "чистого" pull request'а.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Что такое маска подсетей, Зачем она нужна?

Маска подсети (subnet mask) — это число, которое определяет, какая часть IP-адреса относится к сети, а какая — к хостам внутри этой сети.
Пример:
IP-адрес: 192.168.1.10
Маска подсети: 255.255.255.0

В двоичном виде
IP:    11000000.10101000.00000001.00001010  (192.168.1.10)
Маска: 11111111.11111111.11111111.00000000 (255.255.255.0)


🚩 Зачем нужна маска подсети?

Разделять сеть на логические сегменты (разделение на подсети). Определять, находятся ли два устройства в одной сети или им нужен маршрутизатор. Экономить IP-адреса, разбивая сеть на нужное количество хостов.

🚩Как это работает?

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

🚩CIDR-нотация

Вместо маски 255.255.255.0 можно записать /24.
Пример: 192.168.1.10/24 (означает, что первые 24 бита — это сеть).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
🤔 Какие существуют типы Docker Runner?

В GitLab существуют следующие типы Runner:
- Shared Runner — общий для всех проектов;
- Specific Runner — закреплён за конкретным проектом;
- Group Runner — доступен для всех проектов в группе; Также Runner может быть Shell, Docker, Docker+Machine, Kubernetes и другие — по способу исполнения задач.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍4