ru
Feedback
DevOps | Вопросы собесов

DevOps | Вопросы собесов

Открыть в Telegram
5 507
Подписчики
-124 часа
-57 дней
-130 день
Архив постов
🤔 Как определить опции запуска пайплайна при редактировании определенных ресурсов в гите? При работе с CI/CD (GitHub Actions, GitLab CI, Jenkins) часто нужно запускать пайплайн только при изменении определенных файлов. Это помогает оптимизировать сборку, экономить ресурсы и время. 🚩В GitHub Actions (on: push, paths) В GitHub Actions можно указать файлы, изменения в которых запустят пайплайн.
name: Infra Pipeline
on:
  push:
    paths:
      - 'infra/**'
      - 'k8s/**'
  pull_request:
    paths:
      - 'infra/**'
      - 'k8s/**'
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Deploy Infrastructure
        run: ./deploy.sh
🚩В GitLab CI/CD (only: changes) В GitLab можно настроить запуск пайплайна по изменению файлов с помощью only: changes.
stages:
  - deploy

terraform:
  stage: deploy
  script:
    - terraform apply -auto-approve
  only:
    changes:
      - terraform/**
🚩В Jenkins (when { changes }) В Jenkins Declarative Pipeline можно использовать when { changes } для проверки измененных файлов.
pipeline {
    agent any
    stages {
        stage('Deploy Ansible') {
            when { changes path: 'ansible/**' }
            steps {
                sh './deploy_ansible.sh'
            }
        }
        stage('Deploy Helm') {
            when { changes path: 'helm/**' }
            steps {
                sh './deploy_helm.sh'
            }
        }
    }
}
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Что касается безопасности где хранить переменные секреты? Хранение секретных переменных, таких как пароли, ключи API, токены доступа и прочие конфиденциальные данные, требует особого подхода для обеспечения безопасности. Ниже описаны рекомендуемые методы и инструменты для безопасного хранения секретных переменных в различных средах разработки и производства. 🟠Использование специализированных хранилищ секретов HashiCorp Vault: Это инструмент для управления секретами и защиты данных. Он позволяет централизованно хранить, доступ к которым строго контролируется, и динамически создавать секреты. Преимущества: Поддержка динамических секретов, интеграция с большинством сред и технологий, высокий уровень безопасности. AWS Secrets Manager и Azure Key Vault: Эти облачные сервисы предоставляют управляемые решения для безопасного хранения и управления доступом к секретным данным, включая автоматическое обновление секретов. Преимущества: Интеграция с облачными сервисами, упрощение ротации секретов, мониторинг и логирование доступа. 🟠Инкапсуляция секретов в среде выполнения Docker Secrets и Kubernetes Secrets: Предлагают встроенные механизмы для безопасного хранения секретов, которые используются контейнерами во время выполнения. Преимущества: Локальная интеграция с системами оркестрации контейнеров, базовое шифрование на диске и управление доступом. 🟠Секреты в контролируемом CI/CD Платформы CI/CD, такие как GitLab и GitHub, предоставляют возможности для безопасного хранения переменных среды и секретов, которые могут быть использованы в процессах автоматизации без разглашения. Преимущества: Простота использования, интеграция с процессами разработки, защита от внешнего доступа. 🟠Шифрование секретов Инструменты шифрования: Использование инструментов, таких как GnuPG (GPG), для шифрования секретов перед их сохранением в системах контроля версий или конфигурационных файлах. Преимущества: Высокий уровень безопасности, контроль доступа к секретам на уровне пользователя. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как написать shell-скрипт, чтобы он всегда выполнялся от рута? В начале скрипта делается проверка пользователя, и если это не root, скрипт завершает выполнение или перезапускает себя с sudo. Это предотвращает ошибки доступа к системным файлам. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что внутри директории 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: Информация о разделах жесткого диска. Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Как оптимизировать имедж? Оптимизация 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;"]
Ставь 👍 и забирай 📚 Базу знаний

🤔 Везде ли нужен IaC и почему? Не везде, но: - Нужен в средах, где важны повторяемость, масштабируемость, DevOps; - Для одиночных серверов или стартапов IaC может быть избыточен; - Он экономит время на масштабировании, развёртывании, восстановлении после сбоя Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как в 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
Ставь 👍 и забирай 📚 Базу знаний

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

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

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

🤔 Что сделать если зависает 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  # Завершает все сессии пользователя
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как сделать так, чтобы клиенты отдавали метрики в Prometheus? На клиенте должен быть установлен экспортёр, который поднимает HTTP endpoint. Prometheus опрашивает этот endpoint по расписанию и сохраняет данные в своей TSDB (базе данных временных рядов). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какой самый большой минус 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) не всегда понимают, применялась ли конфигурация раньше. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как свалидировать ошибку заранее и предупредить разработчиков до того, как приложение упадёт на проде? Для этого используются статический анализ кода, линтеры, pre-commit хуки, юнит- и интеграционные тесты, а также stage/test окружения с автотестами. Также помогают CI-пайплайны, которые запрещают мердж без прохождения всех проверок Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Стажировки и вакансии для DevOps - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_d
Стажировки и вакансии для DevOps - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram 👉 @jobs_devops 🤖 ML & DS 👩‍💻 DevOps 👨‍✈️ ИБ & OSINT 👣 Go 👩‍💻 Mobile 👩‍💻 C# 👩‍💻 Node.js 👩‍💻 Python 🔎 QA 👩‍💻 Java 👩‍💻 UX/UI 👩‍💻 Frontend 🖼️ PHP 📋 Analyst 💼 1C 🖥 SQL 👩‍💻 IT HR Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.

🤔 Какие микросервисы можно масштабировать горизонтально? Горизонтальное масштабирование – это добавление новых экземпляров (реплик) сервиса для увеличения производительности. Оно хорошо работает для стат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 (нужны реплики или шардирование) Сервисы с сессиями → Например, если пользователь всегда должен попасть на тот же сервер Хранилища файлов → Например, локальное хранение логов на сервере Ставь 👍 и забирай 📚 Базу знаний

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

🤔 Как бы организовал хранение и доступ к секретам? В 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
Ставь 👍 и забирай 📚 Базу знаний