DevOps | Вопросы собесов
5.33K subscribers
30 photos
963 links
Download Telegram
🤔 Почему мы используем Deployment над ReplicaSet, а не напрямую?

Deployment предоставляет более высокий уровень абстракции и автоматизирует обновления, масштабирование, откаты и ведение истории. ReplicaSet только поддерживает нужное количество подов, но не управляет версионированием и обновлениями. С использованием Deployment всё это делается проще и безопаснее.


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

Это понятия из Kubernetes, которые используются для управления хранилищем данных (storage). Они решают задачу обеспечения долгоживущего хранилища для приложений, которое сохраняется независимо от жизненного цикла подов (Pods).

🚩Persistent Volume (PV)

Это объект Kubernetes, который представляет физическое хранилище, доступное в кластере. Это может быть локальное хранилище, сетевой диск (например, NFS), или облачный сервис хранения (например, Amazon EBS, Google Persistent Disk, Azure Disk).

PV создается администратором или автоматически через StorageClass. Это ресурс хранилища, выделенный для использования в кластере. Независим от подов, что позволяет хранить данные, даже если под был удален или перезапущен.

apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/data"


🚩Persistent Volume Claim (PVC)

Это запрос на использование хранилища (PV) со стороны пользователя или приложения. Это как "заявка" на нужное количество места и определенный тип хранилища.

PVC создается разработчиком или приложением. PVC связывается с подходящим PV, который соответствует запросу. Если подходящий PV найден, он "привязывается" к PVC.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi


🚩Как работают PV и PVC вместе?

🟠Создание PV
Администратор или динамическое создание выделяет хранилище (например, сетевой диск).

🟠Создание PVC
Приложение запрашивает хранилище с помощью PVC.

🟠Привязка
Kubernetes автоматически находит подходящий PV, который соответствует запросу PVC (по размерам, режимам доступа и другим параметрам). После этого PVC "связывается" с PV.

🟠Использование в поде
PVC указывается в поде как volume, что позволяет контейнерам работать с данным хранилищем.

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- mountPath: "/data"
name: my-storage
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc


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

Селектор (label selector) используется для выбора ресурсов по меткам. Например, Deployment использует селектор, чтобы знать, какие Pods ему управлять.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой командой можно показать все работающие процессы на Linux?

Для отображения всех работающих процессов в Linux можно использовать несколько команд. Самые популярные из них: ps, top, htop и pgrep. Каждая из них имеет свои особенности.

🚩Команда `ps`

ps выводит снимок (snapshot) текущих процессов в момент выполнения команды.
🟠`ps aux`
Показывает все процессы, запущенные в системе, включая пользователей и системные демоны.
ps aux


🟠`ps -ef`
Альтернативный стиль вывода всех процессов с более детальной информацией.
ps -ef


🚩Команда `top`

top — интерактивная утилита для отображения всех запущенных процессов в реальном времени. Вывод обновляется автоматически.

Запуск
top


🚩Команда `htop`

htop — более современная и удобная версия top. Требуется предварительная установка:
sudo apt install htop  # Для Ubuntu/Debian
sudo yum install htop # Для CentOS/RHEL


Запуск
htop


🚩Команда `pgrep`

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

Пример
pgrep -a ""


🚩Команда `systemctl` (для сервисов)

Если вы хотите посмотреть системные службы
systemctl list-units --type=service


🚩Какую команду выбрать?

🟠Для быстрого снимка
ps aux.
🟠Для мониторинга в реальном времени
top или htop.
🟠Для поиска конкретного процесса
pgrep <имя процесса>.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Когда методы REST используются?

REST-методы применяются при работе с веб-API. Выбор метода зависит от задачи:
- GET — при запросе информации;
- POST — при создании данных (регистрация, форма);
- PUT — при обновлении ресурса полностью;
- PATCH — для изменения конкретных полей;
- DELETE — при удалении данных.


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

Образ (Image) – это шаблон, из которого создаются контейнеры.
Контейнер (Container) – это запущенный экземпляр образа.

🚩Что такое образ (Image)?

Образ – это неизменяемый шаблон с установленным ПО
Содержит все файлы, библиотеки и зависимости
Может храниться в реестре (Docker Hub, GitHub Container Registry, ECR)
docker pull nginx:latest



Пример списка образов
docker images


Пример создания образа через Dockerfile
FROM ubuntu:latest
RUN apt update && apt install -y nginx
CMD ["nginx", "-g", "daemon off;"]

docker build -t my-nginx .



🚩Что такое контейнер (Container)?

Контейнер – это запущенный экземпляр образа
Может изменять файлы и состояние, но это не сохраняется в образе
Изолирован, но использует ядро ОС хоста
docker run -d --name web -p 80:80 nginx


Пример списка контейнеров
docker ps


Пример остановки контейнера
docker stop web


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

С помощью команды:
helm rollback <release-name> <revision-number>
Можно также узнать список доступных ревизий через:
helm history <release-name>
Это позволяет быстро вернуться к рабочей версии, если обновление прошло неудачно.


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

Это команда в системе контроля версий Git, которая позволяет выбрать отдельные коммиты из одной ветки и применить их к другой ветке. Это полезно, когда вы хотите перенести конкретные изменения (коммиты) в текущую ветку, не выполняя слияние всей ветки.

🚩Когда используется

🟠Применение отдельных изменений
Когда нужно перенести конкретные исправления или функции из одной ветки в другую, не сливая все изменения из исходной ветки.
🟠Быстрое исправление ошибок
Когда найденное исправление в одной ветке нужно срочно применить в другой, например, из ветки разработки в ветку релиза.
🟠Избежание сложного слияния
Когда слияние всей ветки может привести к конфликтам или нежелательным изменениям, cherry-pick позволяет аккуратно перенести только нужные коммиты.

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

🟠Простого `cherry-pick`
Перенос одного коммита из другой ветки.
# Переключитесь на ветку, куда вы хотите применить изменения
git checkout target-branch

# Выполните cherry-pick коммита
git cherry-pick <commit-hash>


🟠Применения нескольких коммитов
Перенос нескольких коммитов из другой ветки.
# Переключитесь на ветку, куда вы хотите применить изменения
git checkout target-branch

# Выполните cherry-pick нескольких коммитов
git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3>


🟠Применения диапазона коммитов
Перенос диапазона коммитов из другой ветки.
# Переключитесь на ветку, куда вы хотите применить изменения
git checkout target-branch

# Выполните cherry-pick диапазона коммитов
git cherry-pick <start-commit-hash>..<end-commit-hash>


🚩Разрешение конфликтов

1⃣Разрешите конфликты в файлах.

2⃣Добавьте изменения в индекс
git add <filename>   


3⃣Завершите процесс cherry-pick
git cherry-pick --continue   


🚩Прерывание

Если вы хотите прервать процесс cherry-pick, можно использовать команду
git cherry-pick --abort


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

Мидл (middle engineer) — это разработчик, который уже не нуждается в постоянном менторстве, но ещё не руководит другими. Он уверенно решает задачи, понимает архитектуру и знает best practices.


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

В реляционных базах данных, операции объединения (JOIN) позволяют объединить строки из двух или более таблиц на основе связанных между собой столбцов. Существует несколько типов JOIN, каждый из которых имеет свои особенности и применим для разных ситуаций. Рассмотрим основные типы JOIN:

🟠INNER JOIN
Объединяет строки из обеих таблиц, если они удовлетворяют условию объединения. Когда необходимо выбрать только те строки, которые имеют соответствующие значения в обеих таблицах.
SELECT *
FROM таблица1
INNER JOIN таблица2
ON таблица1.ключ = таблица2.ключ;


🟠LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если соответствующей строки в правой таблице нет, в результирующем наборе данных для столбцов правой таблицы будут значения NULL. Когда необходимо выбрать все строки из одной таблицы и соответствующие данные из другой таблицы, если они существуют.
SELECT *
FROM таблица1
LEFT JOIN таблица2
ON таблица1.ключ = таблица2.ключ;


🟠RIGHT JOIN (или RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если соответствующей строки в левой таблице нет, в результирующем наборе данных для столбцов левой таблицы будут значения NULL. Когда необходимо выбрать все строки из одной таблицы (правой) и соответствующие данные из другой таблицы (левой), если они существуют.
SELECT *
FROM таблица1
RIGHT JOIN таблица2
ON таблица1.ключ = таблица2.ключ;


🟠FULL JOIN (или FULL OUTER JOIN)
Возвращает все строки, когда есть совпадения либо в левой, либо в правой таблице. Если строки не соответствуют в одной из таблиц, для этой таблицы будут значения NULL. Когда необходимо выбрать все строки из обеих таблиц, независимо от того, есть ли соответствующие строки в другой таблице.
SELECT *
FROM таблица1
FULL JOIN таблица2
ON таблица1.ключ = таблица2.ключ;


🟠CROSS JOIN
Возвращает декартово произведение двух таблиц, то есть все возможные комбинации строк из обеих таблиц. Когда необходимо создать комбинации всех строк из обеих таблиц. Используется редко и с осторожностью, так как может привести к очень большому количеству строк.
SELECT *
FROM таблица1
CROSS JOIN таблица2;


🟠SELF JOIN
Применяется для объединения таблицы самой с собой. Обычно используется для сравнения строк внутри одной и той же таблицы. Когда необходимо сопоставить строки одной таблицы друг с другом, например, для анализа иерархий или поиска парных записей.
SELECT A.*
FROM таблица A, таблица B
WHERE A.ключ = B.ключ;


🟠NATURAL JOIN
Автоматически объединяет таблицы по всем столбцам с одинаковыми именами и типами данных. Когда у таблиц есть столбцы с одинаковыми именами, и нужно объединить их без явного указания условий объединения.
SELECT *
FROM таблица1
NATURAL JOIN таблица2;


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

Файловая система выбирается по ряду параметров:
- Тип нагрузки – большие файлы (XFS, ZFS) или много мелких файлов (EXT4, Btrfs).
- Журналирование – влияет на отказоустойчивость (XFS, EXT4).
- Снапшоты – нужны ли сохранения состояний файлов (Btrfs, ZFS).
- Шифрование – встроенная защита данных (ZFS, LUKS).
- Резервирование пространства – например, XFS и ZFS резервируют место.


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

Чтобы определить нагрузку на Node и правильно выделить ресурсы, нужно:
Проверить текущее потребление ресурсов (CPU, RAM, диски)*
Оценить нагрузку от подов (requests и limits)
Использовать мониторинг (Prometheus, Grafana, kubectl top)

🚩Проверить нагрузку на Node (`kubectl top node`)

Команда
sh  
kubectl top nodes



Вывод
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%  
node-1 500m 25% 2Gi 50%
node-2 1000m 50% 4Gi 80%



🚩Проверить потребление ресурсов подами (`kubectl top pods`)

Команда
sh  
kubectl top pods --all-namespaces



Вывод
NAMESPACE   POD            CPU(cores)   MEMORY(bytes)  
default web-app-1 250m 256Mi
default web-app-2 300m 512Mi
monitoring prometheus-1 600m 1Gi



🚩Анализ `requests` и `limits` подов

Команда
sh  
kubectl describe node node-1



Вывод (пример секции Allocatable)
Allocatable:  
cpu: 4
memory: 8Gi
pods: 110



Проверить requests и limits у подов
sh  
kubectl describe pod my-pod



Вывод
Requests:  
cpu: 500m
memory: 1Gi
Limits:
cpu: 1
memory: 2Gi



🚩Использование Prometheus и Grafana для анализа нагрузки

Prometheus-запросы для анализа Node
Средняя загрузка CPU за 5 минут
promql  
avg(rate(node_cpu_seconds_total[5m])) * 100



Среднее использование памяти
promql  
avg(node_memory_Active_bytes) / avg(node_memory_MemTotal_bytes) * 100


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

- Виртуальная машина (VM):
- Подключается как полноценный виртуальный диск.
- Обычно требует перезапуска и настройки в гипервизоре.
- Может использовать собственную файловую систему.
- Контейнер (Docker):
- Монтирование происходит на уровне хоста (bind mount или volume).
- Не требует перезапуска контейнера.
- Более гибкое и динамичное подключение к каталогам.


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

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

🚩Плохие решения

Локально (terraform.tfstate в репозитории)
Потеря данных, если разработчик сменит машину.
Конфликты, если несколько человек применяют terraform apply.
Невозможно откатиться к старому состоянию.
Не поддерживает блокировки (terraform lock).
Возможны проблемы с одновременным доступом.

🚩Лучшие решения для хранения `tfstate`

🟠S3 + DynamoDB (AWS) → Самый популярный способ
S3 хранит tfstate, а DynamoDB предотвращает конфликты.
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}


🟠Terraform Cloud/Enterprise → Официальное SaaS-решение
Terraform Cloud хранит tfstate в облаке HashiCorp.
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "my-org"
workspaces {
name = "my-workspace"
}
}
}


🟠Google Cloud Storage (GCS) + Firestore (GCP)
Для GCP аналог AWS S3 — это Google Cloud Storage (GCS), а DynamoDB заменяется Firestore.
terraform {
backend "gcs" {
bucket = "my-tfstate-bucket"
prefix = "terraform/state"
}
}


🟠Azure Storage + Azure CosmosDB (Azure)
Для Azure можно использовать Azure Storage и блокировки через Azure CosmosDB.
terraform {
backend "azurerm" {
resource_group_name = "my-rg"
storage_account_name = "myterraformstate"
container_name = "tfstate"
key = "prod.terraform.tfstate"
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
🤔 Kubernetes Control Plane и Worker Node — кто за что отвечает?

- Control Plane — управляет кластером, принимает решения, следит за состоянием.
- Worker Node — выполняет рабочие задачи, т.е. подами и контейнерами.


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

Если при создании файла в Linux появляется ошибка, что места нет, но df -h показывает свободное место, проблема может быть в следующем:

🚩Закончились inodes

Inodes – это структуры, которые хранят метаданные о файлах. Даже если есть свободное место, но inodes кончились, новые файлы создать нельзя.
df -i


Найти каталоги с множеством маленьких файлов:

  find /path -xdev -type f | wc -l  # Количество файлов в каталоге


🚩Ограничение дискового квотирования (quota)

В системе могут быть настроены дисковые квоты, которые ограничивают использование диска для пользователя или группы.
quota -v


🚩Заполнен раздел `/var`, `/tmp` или `/home`

В системе может быть несколько дисковых разделов (/, /var, /home и т. д.). Если один из них заполнен, в него нельзя записывать файлы.
df -hT


🚩Файловая система смонтирована в режиме `read-only`

Если файловая система перешла в режим «только для чтения» (read-only) из-за ошибки или сбоя, запись на неё невозможна.
mount | grep ' ro,'


Если файловая система смонтирована с `ro`, значит, запись запрещена. Перемонтировать диск:

  mount -o remount,rw /path


Проверить диск на ошибки:

  dmesg | tail -20  # Лог ошибок
fsck /dev/sdX # Проверка диска


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

Темплейты находятся в директории templates/ и содержат шаблонизированные YAML-файлы, в которых можно:
- Использовать переменные из values.yaml
- Применять условные конструкции, циклы, функции Go-шаблонов
Ты можешь:
- Генерировать манифесты: helm template
- Переопределять значения при установке: helm install --set key=value


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

Она использует механизм, известный как OOM Killer (убийца процессов при нехватке памяти), для завершения процессов с целью освобождения памяти. Выбор процесса для завершения базируется на ряде критериев, чтобы минимизировать влияние на работу системы.

🚩Как работает OOM Killer?

🟠Очки OOM (OOM Score)
Каждому процессу присваиваются очки OOM, которые рассчитываются на основе нескольких факторов, таких как: Объем памяти, используемой процессом. Приоритет процесса. Важность процесса для системы (например, системные демоны имеют более низкие очки).

🟠Формула расчета OOM Score
Основной фактор при расчете очков - это объем потребляемой процессом памяти. Чем больше памяти потребляет процесс, тем выше его OOM Score. Операционная система также учитывает приоритет процесса (nice value) и некоторые другие параметры.

🟠Принудительное завершение
Процесс с наибольшим OOM Score считается наименее критичным для системы и завершается первым.

🚩Пример расчета OOM Score

🟠Вот пример того, как может быть рассчитан OOM Score (упрощенный)
Процесс A использует 1 ГБ памяти.
Процесс B использует 2 ГБ памяти.
Процесс C использует 500 МБ памяти, но это критический системный процесс.
🟠OOM Score для этих процессов может выглядеть так
Процесс A: 300
Процесс B: 600
Процесс C: 100 (низкий, так как процесс критический)

🚩Настройка OOM Killer

Администраторы могут влиять на работу OOM Killer, настраивая параметры OOM Score для конкретных процессов с помощью файлов в каталоге /proc. Например, для изменения приоритета процесса:
echo -1000 > /proc/<PID>/oom_score_adj


🚩Логирование и мониторинг

При срабатывании OOM Killer соответствующие сообщения записываются в системный журнал (обычно /var/log/syslog или /var/log/messages), что позволяет администраторам анализировать причины и предпринимать меры по предотвращению в будущем.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Почему Java Memory Model важно при работе с многопоточностью?

Java Memory Model (JMM):
- Определяет как потоки видят переменные и как изменения одной нити становятся видимыми другим.
- Без JMM каждый поток может кэшировать значения, что приводит к несогласованности данных.
- Благодаря JMM можно использовать volatile, synchronized и Atomic переменные с гарантией корректности.


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

По умолчанию Ansible выполняет задачи последовательно, но можно ускорить выполнение с помощью параметра forks или асинхронных задач (async).

🚩Увеличение параллельных подключений (`forks`)

forks – это количество серверов, на которых Ansible выполняет задачи одновременно.
ansible-playbook -i inventory.ini playbook.yml --forks=10


Установить forks в ansible.cfg:
[defaults]
forks = 10


🚩Асинхронное выполнение (`async` + `poll`)

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

Пример асинхронного выполнения установки пакета
- name: Установить nginx параллельно
apt:
name: nginx
state: present
async: 300
poll: 0


async: 300 – запускает задачу и дает ей 300 секунд на выполнение
poll: 0 – не ждет завершения, сразу переходит к следующей
Проверить статус запущенных задач:
ansible all -m async_status -a "jid=1234567890" -i inventory.ini


🚩Использование `&` в Shell-командах (`shell` + `nohup`)

Пример запуска задачи в фоновом режиме
- name: Запустить долгий процесс
shell: "nohup long_script.sh &"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM