DevOps | Вопросы собесов
5.51K subscribers
33 photos
1.32K links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.me/+2P7cpjeyfDVlZjcy
Вакансии t.me/+i5KFWEWJ21hhYWEy
Download Telegram
🤔 Как посмотреть, с какими файлами работает программа на Linux в данный момент?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊9
🤔 Какая компонента запускает под на ноде, какая отвечает за сеть?

В Kubernetes разные компоненты отвечают за запуск подов и сетевые настройки.

🚩Какая компонента запускает под на ноде? (`kubelet`)

Получает команды от kube-scheduler (назначение подов)
Запускает контейнеры через Container Runtime (Docker, containerd, CRI-O)
Следит за состоянием подов и перезапускает их при сбоях
systemctl status kubelet


Посмотреть логи kubelet
journalctl -u kubelet -f


🚩Какая компонента отвечает за сеть? (CNI)

Назначает IP-адреса подам
Организует маршрутизацию трафика между подами и нодами
Настраивает Network Policies (безопасность сети)
Проверить работающие сетевые плагины
kubectl get pods -n kube-system


Вывод (если CNI работает нормально)
NAME               READY   STATUS    RESTARTS   AGE
calico-node-xyz 1/1 Running 2 3d


Если CNI не работает, поды могут застрять в ContainerCreating
kubectl get pods

NAME          READY   STATUS              RESTARTS   AGE
web-server 0/1 ContainerCreating 0 10m


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое SNS и что делает?

SNS (Simple Notification Service) — это сервис для рассылки уведомлений и сообщений. Поддерживает два типа взаимодействия:
- Публикация/подписка (Pub/Sub) — рассылает сообщения на подписчиков (SQS, email, HTTP endpoints).
- Push-уведомления — на мобильные устройства.
Используется для оповещений, триггеров автоматизации и системных событий.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Как бы организовал хранение и доступ к секретам?

В DevOps и Kubernetes важно безопасно хранить секретные данные (пароли, API-ключи, токены). Нельзя хранить их в коде, в Git, в .env файлах без шифрования.

🚩HashiCorp Vault (лучший вариант для масштабных проектов)

Полностью управляемое решение для хранения и динамической ротации секретов.
Шифрование с поддержкой KMS.
API-доступ и интеграция с CI/CD.
Как получить секрет через CLI?
vault kv put secret/db password="SuperSecret123"
vault kv get secret/db


Как использовать в Jenkins?
withVault([vaultSecrets: [[path: 'secret/db', secretValues: [['envVar': 'DB_PASS', 'vaultKey': 'password']]]]]) {
sh 'echo $DB_PASS' # Переменная доступна только внутри блока
}


🚩Kubernetes Secrets (если приложение в K8s)

Интеграция с Kubernetes, управление через kubectl.
Доступ через переменные окружения или монтирование в файл.
Можно использовать Sealed Secrets или SOPS для шифрования.
Как создать секрет?
kubectl create secret generic db-secret --from-literal=password='SuperSecret123'


Как использовать в Deployment?
env:
- name: DB_PASS
valueFrom:
secretKeyRef:
name: db-secret
key: password


🚩AWS Secrets Manager / Azure Key Vault / GCP Secret Manager

Интеграция с облачными сервисами (IAM, Lambda, RDS).
Автоматическая ротация ключей.
Как получить секрет в AWS?
aws secretsmanager get-secret-value --secret-id my-secret


Как подключить к Kubernetes?
Используем External Secrets Operator:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
secretStoreRef:
name: aws-secrets
kind: SecretStore
target:
name: db-secret
data:
- secretKey: password
remoteRef:
key: my-db-password


🚩SOPS + GitOps (для хранения в Git, но зашифрованно)

Позволяет хранить секреты в Git без утечек.
Работает с KMS, PGP, age.
Как зашифровать секрет?
sops --encrypt --age YOUR_PUBLIC_KEY secrets.yaml > secrets.enc.yaml


Как расшифровать?
sops --decrypt secrets.enc.yaml


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как ставить Kubernetes на bare metal и в облако?

На bare metal — чаще всего через kubeadm, k3s, Rancher, MicroK8s, либо с помощью Ansible (kubespray). В облаке — через сервисы провайдеров (EKS, GKE, AKS) или вручную на облачные ВМ, с теми же инструментами. Отличие — в настройках сети, балансировке и подключении хранилищ.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие микросервисы можно масштабировать горизонтально?

Горизонтальное масштабирование – это добавление новых экземпляров (реплик) сервиса для увеличения производительности. Оно хорошо работает для статeless (без состояния) микросервисов, где нет привязки к конкретному серверу.

🚩Какие микросервисы можно масштабировать горизонтально?

🟠Веб-серверы и API-шлюзы
Примеры: Nginx, Traefik, Kong, API Gateway (AWS, GCP)
Почему можно масштабировать?
- Обрабатывают независимые запросы
- Не требуют сохранения состояния между запросами
- Легко распределяются через Load Balancer
yaml  
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
spec:
replicas: 5
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: api-container
image: my-api:latest



🟠Backend-сервисы (Stateless)
Примеры: REST API (FastAPI, Express, Spring Boot), gRPC-сервисы
Почему можно масштабировать?
Каждый запрос обрабатывается независимо
Нет привязки к конкретному серверу
Можно использовать Load Balancer (например, AWS ALB, Nginx)
nginx  
upstream backend {
server backend1:5000;
server backend2:5000;
server backend3:5000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}



🟠Очереди сообщений и брокеры событий
Примеры: RabbitMQ, Kafka, NATS, Redis Streams
Почему можно масштабировать?
Сообщения разбираются разными нодами
Можно увеличивать число консьюмеров
Поддерживают partitioning (разделение нагрузки)
python  
from kafka import KafkaConsumer
consumer = KafkaConsumer('my_topic', group_id='workers', bootstrap_servers='kafka:9092')
for message in consumer:
process_message(message)



🟠Кэш-сервисы (Stateless)
Примеры: Redis (в режиме Cluster), Memcached
Почему можно масштабировать?
Каждый узел хранит часть данных
Можно распределять кэш по нескольким инстансам
Redis поддерживает Sharding (разбиение данных на ноды)
sh  
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1



🚩Какие микросервисы **нельзя просто так масштабировать горизонтально?**

Некоторые сервисы сохраняют состояние (stateful) и сложны в горизонтальном масштабировании:
Базы данных → MySQL, PostgreSQL (нужны реплики или шардирование)
Сервисы с сессиями → Например, если пользователь всегда должен попасть на тот же сервер
Хранилища файлов → Например, локальное хранение логов на сервере

Ставь 👍 и забирай 📚 Базу знаний
👍1💊1
🤔 Как свалидировать ошибку заранее и предупредить разработчиков до того, как приложение упадёт на проде?

Для этого используются статический анализ кода, линтеры, pre-commit хуки, юнит- и интеграционные тесты, а также stage/test окружения с автотестами. Также помогают CI-пайплайны, которые запрещают мердж без прохождения всех проверок


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какой самый большой минус Ansible?

Ansible – мощный инструмент для автоматизации, но у него есть серьезные недостатки, особенно при масштабировании.

🚩Основной минус – Медленная работа на больших инфраструктурах

🟠Нет агентов
каждый раз Ansible подключается по SSH и выполняет задачи без предварительного кеширования
что замедляет процесс.

🟠Ограничения Python на удаленных хостах
если целевой сервер слабый или без Python, выполнение плейбуков будет медленным.

🟠Последовательное выполнение
по умолчанию Ansible выполняет задачи последовательно, что дольше, чем параллельные методы (например, в SaltStack).
yaml  
- name: Установка Nginx
hosts: all
tasks:
- name: Установить Nginx
apt:
name: nginx
state: present


Запуск задач параллельно (-f 50)
sh  
ansible-playbook playbook.yml -f 50


🚩Другие минусы Ansible

🟠Высокая нагрузка на управляющий узел
Если 1000+ серверов, главный Ansible-узел может быстро перегрузиться.

🟠Сложное управление зависимостями
Роли могут конфликтовать, если версии не совпадают. Ansible Galaxy не такой удобный, как Terraform Registry

🟠Ограниченная идемпотентность
Некоторые модули (особенно shell и command) не всегда понимают, применялась ли конфигурация раньше.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Как сделать так, чтобы клиенты отдавали метрики в Prometheus?

На клиенте должен быть установлен экспортёр, который поднимает HTTP endpoint. Prometheus опрашивает этот endpoint по расписанию и сохраняет данные в своей TSDB (базе данных временных рядов).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что сделать если зависает ssh?

Если SSH завис, не стоит сразу закрывать терминал. Есть несколько причин и решений.

🚩Проверить, можно ли выйти без разрыва сессии
Если SSH завис, но сессия не разорвана, попробуйте выйти без закрытия терминала:
~.


Переключение в режим управления SSH
~Ctrl+Z


🚩Проверить соединение с сервером

Если SSH завис, причина может быть в разрыве соединения. Проверьте:

Работает ли пинг до сервера:
ping server_ip

🔹 Открыт ли SSH-порт (22):
nc -zv server_ip 22


🚩Перезапустить SSH-клиент

Если только один SSH-клиент завис, попробуйте:
pkill -9 ssh


или
killall -9 ssh


Затем переподключитесь
ssh user@server_ip


🚩Проверить SSH-сервер

Если сервер доступен, но SSH зависает, войдите через консоль или другой метод (например, VNC, IPMI).

Если SSH не отвечает, перезапустите его:
sudo systemctl restart ssh


или
service ssh restart


🚩Отключить TCP KeepAlive или изменить таймауты

Иногда SSH зависает из-за разрыва соединения на роутере или файрволе.

Добавьте в ~/.ssh/config на клиенте
Host *
ServerAliveInterval 60
ServerAliveCountMax 5


Или в /etc/ssh/sshd_config на сервере
ClientAliveInterval 60
ClientAliveCountMax 5


Затем перезапустите SSH
sudo systemctl restart ssh


🚩Убить зависшую SSH-сессию на сервере

Если осталось зависшее подключение, найдите его и завершите:
who  # Показывает активные пользователи
ps aux | grep ssh # Показывает процессы SSH
pkill -9 -u username # Завершает все сессии пользователя


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как посмотреть активные сессии других пользователей сервера?

Для этого есть команды, показывающие детальную информацию о сессиях: кто подключён, откуда, чем занят и как долго. В системах с systemd можно использовать специальные утилиты для отображения сессий.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊17
🤔 Какие процессы убивает 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 &


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как разделять элементы CI и CD в Jenkins?

• CI (Continuous Integration): Включает сборку, тестирование и статический анализ кода. Это выполняется при каждом коммите или пулл-запросе.
• CD (Continuous Deployment/Delivery): Включает развертывание на staging или в продакшн после успешного прохождения всех этапов CI. Для CD используются отдельные пайплайны или этапы в одном пайплайне.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как в 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


Ставь 👍 и забирай 📚 Базу знаний
🤔 Везде ли нужен IaC и почему?

Не везде, но:
- Нужен в средах, где важны повторяемость, масштабируемость, DevOps;
- Для одиночных серверов или стартапов IaC может быть избыточен;
- Он экономит время на масштабировании, развёртывании, восстановлении после сбоя


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2👍1
🤔 Как оптимизировать имедж?

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

🟠Используйте минимальную базовую ОС
Почему: Базовый образ сильно влияет на размер. Например, alpine занимает ~5 МБ, в то время как ubuntu или debian могут превышать сотни мегабайт.
Как: Замените базовый образ:
FROM alpine:latest


🟠Удаляйте ненужные файлы
Почему: Временные файлы, кэш или артефакты сборки занимают место.
Как: Добавьте команды для очистки временных данных:
RUN apt-get update && apt-get install -y curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*


🟠Используйте многоэтапную сборку (multi-stage builds)
Почему: Стадия сборки может содержать инструменты, которые не нужны в финальном образе.
Как
# Стадия сборки
FROM golang:1.20 as builder
WORKDIR /app
COPY . .
RUN go build -o app .

# Финальный образ
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/app .
CMD ["./app"]


🟠Минимизируйте количество слоёв
Почему: Каждый RUN, COPY, ADD создаёт новый слой. Слишком много слоёв увеличивают размер образа.
Как: Объединяйте команды:
RUN apt-get update && apt-get install -y curl wget \
&& apt-get clean && rm -rf /var/lib/apt/lists/*


🟠Не сохраняйте секреты
Почему: Переменные окружения с паролями или токенами могут быть случайно унаследованы.
Как: Используйте Docker secrets или .env-файлы и исключайте их из COPY
ENV APP_ENV=production


🟠Кэшируйте зависимости
Почему: Частое скачивание зависимостей замедляет сборку.
Как: Переносите команды загрузки зависимостей ближе к началу:
COPY go.mod go.sum ./
RUN go mod download


🟠Проверяйте зависимости
Почему: Устаревшие или ненужные зависимости увеличивают размер и могут содержать уязвимости.
Как: Используйте сканеры вроде Trivy или Docker Scan для анализа.
trivy image myimage:latest


🚩Пример полного Dockerfile

# 1. Используем минимальный базовый образ
FROM node:20-alpine as builder

# 2. Устанавливаем зависимости
WORKDIR /app
COPY package*.json ./
RUN npm install

# 3. Копируем код
COPY . .

# 4. Собираем проект
RUN npm run build

# Финальный минимальный образ
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как организовать кластеры?

Зависит от целей, но базово:
- Dev / Staging / Prod — разделение по средам.
- По географии — например, кластер в каждом регионе.
- По продуктам или командам — если изоляция важна.
- Мультикластер — если нужно федеративное управление или глобальный сервис discovery.
Важно: централизованное управление (ArgoCD, Flux), единая CI/CD-платформа, policy enforcement (OPA Gatekeeper, Kyverno).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊4👍1
🤔 Что внутри директории Linux: /proc?

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

🚩Основное назначение `/proc`

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

🚩Ключевые элементы внутри `/proc`

🟠Каталоги с идентификаторами процессов (`/proc/[PID]`)
Каждый процесс в системе имеет каталог в /proc, название которого соответствует его PID (Process ID). В этих каталогах содержится информация о конкретном процессе:
/proc/[PID]/cmdline: Команда, запустившая процесс.
/proc/[PID]/cwd: Символическая ссылка на текущую рабочую директорию процесса.
/proc/[PID]/exe: Символическая ссылка на исполняемый файл процесса.
/proc/[PID]/fd: Директория с открытыми файловыми дескрипторами.
/proc/[PID]/status: Детализированная информация о состоянии процесса (UID, GID, память и т.д.).

🟠Файлы системы
/proc/cpuinfo
Информация о процессоре (модель, частота, количество ядер).
cat /proc/cpuinfo


/proc/meminfo
Информация о памяти (доступная память, кэш, использованная память).
cat /proc/meminfo


/proc/diskstats: Статистика ввода-вывода для дисков.
/proc/uptime: Время работы системы с момента загрузки.
/proc/loadavg: Средняя нагрузка на систему за последние 1, 5 и 15 минут.

🟠Конфигурационные файлы ядра
/proc/sys: Содержит настраиваемые параметры ядра. Например, можно изменить значение максимального количества открытых файлов:
echo 100000 > /proc/sys/fs/file-max


Некоторые популярные настройки
/proc/sys/net/ipv4/ip_forward: Управление пересылкой IPv4-пакетов.
/proc/sys/kernel/pid_max: Максимальный PID, который может быть назначен процессу.

🟠Сетевые интерфейсы
/proc/net:
Информация о сетевых соединениях и интерфейсах.
Примеры:
/proc/net/dev: Статистика сетевых интерфейсов.
/proc/net/tcp: Состояние TCP-соединений.

🟠Информация об устройствах
/proc/devices: Список всех зарегистрированных устройств (символьных и блочных).
/proc/partitions: Информация о разделах жесткого диска.

Ставь 👍 и забирай 📚 Базу знаний
💊2🔥1
🤔 Как написать shell-скрипт, чтобы он всегда выполнялся от рута?

В начале скрипта делается проверка пользователя, и если это не root, скрипт завершает выполнение или перезапускает себя с sudo. Это предотвращает ошибки доступа к системным файлам.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что касается безопасности где хранить переменные секреты?

Хранение секретных переменных, таких как пароли, ключи API, токены доступа и прочие конфиденциальные данные, требует особого подхода для обеспечения безопасности. Ниже описаны рекомендуемые методы и инструменты для безопасного хранения секретных переменных в различных средах разработки и производства.

🟠Использование специализированных хранилищ секретов
HashiCorp Vault:
Это инструмент для управления секретами и защиты данных. Он позволяет централизованно хранить, доступ к которым строго контролируется, и динамически создавать секреты.
Преимущества: Поддержка динамических секретов, интеграция с большинством сред и технологий, высокий уровень безопасности.
AWS Secrets Manager и Azure Key Vault:
Эти облачные сервисы предоставляют управляемые решения для безопасного хранения и управления доступом к секретным данным, включая автоматическое обновление секретов.
Преимущества: Интеграция с облачными сервисами, упрощение ротации секретов, мониторинг и логирование доступа.

🟠Инкапсуляция секретов в среде выполнения
Docker Secrets и Kubernetes Secrets:
Предлагают встроенные механизмы для безопасного хранения секретов, которые используются контейнерами во время выполнения.
Преимущества: Локальная интеграция с системами оркестрации контейнеров, базовое шифрование на диске и управление доступом.

🟠Секреты в контролируемом CI/CD
Платформы CI/CD, такие как GitLab и GitHub, предоставляют возможности для безопасного хранения переменных среды и секретов, которые могут быть использованы в процессах автоматизации без разглашения.
Преимущества: Простота использования, интеграция с процессами разработки, защита от внешнего доступа.

🟠Шифрование секретов
Инструменты шифрования: Использование инструментов, таких как GnuPG (GPG), для шифрования секретов перед их сохранением в системах контроля версий или конфигурационных файлах.
Преимущества: Высокий уровень безопасности, контроль доступа к секретам на уровне пользователя.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое blackhole?

Blackhole (чёрная дыра) — это сетевая конфигурация, при которой пакеты сбрасываются, не уведомляя отправителя. Применяется для отказа от трафика, DDoS-защиты или маршрутизации нежелательного трафика.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2