DevOps | Вопросы собесов
5.33K subscribers
32 photos
972 links
Download Telegram
🤔 Как определить ресурс, который необходим одной 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
👍1
🤔 Что такое брокеры сообщений?

Брокер сообщений — это система, которая:
- принимает, сохраняет и передаёт сообщения между компонентами системы;
- развязывает отправителя и получателя, повышает отказоустойчивость;
- поддерживает очереди, топики, доставку и масштабирование.
Примеры: Kafka, RabbitMQ, NATS, ActiveMQ.


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

Grafana — это инструмент для визуализации, мониторинга и анализа метрик. Он позволяет строить графики, панели (dashboards) и оповещения на основе данных из разных источников.

🚩Основные возможности Grafana

Дашборды – красивые панели с графиками и таблицами
Много источников данных – Prometheus, MySQL, Elasticsearch, AWS CloudWatch
Настраиваемые алерты – уведомления в Slack, Telegram, Email
Аутентификация – поддержка LDAP, OAuth, GitHub
Плагины и расширения – добавление новых панелей и источников данных

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

Grafana подключается к источнику данных (например, Prometheus)
Пользователь создает дашборды с графиками, таблицами и метриками
Настраиваются алерты, которые отправляют уведомления при сбоях

🚩Пример развертывания Grafana с Prometheus

Запуск Grafana в Docker
docker run -d -p 3000:3000 --name=grafana grafana/grafana


Пример запроса в PromQL
node_cpu_seconds_total{mode="idle"}


🚩Как настроить алерты?

Например, если загрузка CPU выше 80%, отправлять сообщение в Telegram.

В Grafana → "Alerting" → "Alert Rules" → "Create Alert Rule"
Записываем условие:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80


🚩Где используется Grafana?

Мониторинг серверов (CPU, RAM, диски, сеть)
DevOps (Prometheus + Grafana) для Kubernetes, Docker
Бизнес-аналитика (данные из MySQL, Google Analytics)
IoT – графики с датчиков и устройств

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Зачем нужен OOM

OOM (Out Of Memory) — это механизм, срабатывающий, когда системе не хватает памяти для работы, что приводит к завершению процессов с высокой нагрузкой. Он защищает систему от полного исчерпания памяти, освобождая ресурсы, чтобы другие процессы могли продолжать работать. OOM-killer используется для выбора и завершения наименее критичных процессов, предотвращая полное зависание системы.

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

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

🚩Deployment

Это контроллер, который обеспечивает декларативное обновление подов и ReplicaSets (другой тип контроллера, который управляет одновременным запуском нескольких экземпляров одного и того же пода). Deployment поддерживает непрерывное развертывание, откат к предыдущим версиям, а также масштабирование подов.

🟠Масштабирование
Вы можете увеличивать или уменьшать количество подов в зависимости от нужд.
🟠Обновления
Поддерживает стратегии развертывания, такие как Rolling Update (постепенное обновление), которое помогает минимизировать простои при обновлении приложения.
🟠Самовосстановление
Автоматически перезапускает поды, которые перестали работать, находятся в ошибочном состоянии или не отвечают.

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80


🚩DaemonSet

Это контроллер, который гарантирует, что на каждом узле кластера Kubernetes запущен экземпляр заданного пода. Когда добавляется новый узел, на нем автоматически запускается под, управляемый DaemonSet, и если узел удаляется, поды удаляются автоматически. Это идеально подходит для запуска служб мониторинга, сбора логов или других утилит, которые должны быть запущены на каждом узле.

🟠Гарантия запуска
Убедитесь, что каждый узел кластера запускает копию определённого пода.
🟠Автоматическое размещение
Когда добавляются новые узлы, на них автоматически размещаются необходимые поды.
🟠Службы уровня узла
Идеально подходит для запуска системных служб, таких как коллекторы логов, системы мониторинга и другие.

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: fluent/fluentd:v1.0
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true


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

Заголовки в HTTP делятся на:
- General — общие (Date, Connection);
- Request — только для клиента (Accept, User-Agent, Authorization);
- Response — только для ответа (Server, Set-Cookie);
- Entity — описывают тело (Content-Type, Content-Length).


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

Если под (Pod) в Kubernetes не пройдет readiness-пробу (readiness probe), он будет считаться не готовым для обработки запросов.

🚩Что делает readiness-проба?

Readiness-проба используется для определения того, готов ли контейнер в поде обрабатывать входящие запросы. Если проба не проходит, Kubernetes исключает этот под из списка доступных для обслуживания запросов (например, через Service).

🚩Основные последствия

🟠Под не будет получать трафик через Service
Kubernetes автоматически исключает под из группы Endpoints для соответствующего сервиса. Другие компоненты системы, обращающиеся к сервису, не будут направлять запросы в этот под.

🟠Под продолжает работать
Под не будет удален или перезапущен. Kubernetes продолжит проверять его состояние readiness-пробой до тех пор, пока он не станет готовым.

🟠Нет влияния на liveness-пробу
Если readiness-проба не проходит, это не влияет на liveness-пробу. Под будет работать, пока не нарушена его "жизнеспособность".

🟠Аварийное поведение приложения может быть скрыто
Если под зависнет или будет не в состоянии обработать запросы, но при этом не нарушит liveness-пробу, он останется запущенным, но не будет получать трафик.

🚩Как это выглядит на практике?

Пример readiness-пробы
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: my-container
image: nginx
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10


🚩Сценарий

🟠На старте
После создания пода Kubernetes ждет initialDelaySeconds (5 секунд) перед выполнением первой проверки. Если / не отвечает на HTTP-запрос, под считается не готовым.

🟠Если проба продолжает проваливаться
Kubernetes исключает под из группы доступных эндпоинтов. Под остается запущенным, и проба выполняется каждые periodSeconds (10 секунд), пока под не станет готовым.

🚩Что произойдет с трафиком?

Если под — единственный в сервисе: Запросы к сервису вернут ошибку (например, 503 Service Unavailable), так как ни один под не готов.
Если подов несколько: Трафик перенаправляется на другие поды, готовые обрабатывать запросы.

🚩Как это помогает?

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

🟠Улучшает отказоустойчивость
В случае проблем с подом система перенаправляет запросы на другие экземпляры.

🟠Поддерживает обновления без простоя
Во время обновления подов через Deployment новые поды добавляются в пул доступных только после успешного прохождения readiness-проб.

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

Базы данных можно запускать в Kubernetes для повышения удобства управления, масштабирования и использования облачных возможностей. Однако для критически важных данных лучше использовать managed database services, чтобы снизить административные риски.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
18 ноября в Москве пройдёт Deckhouse User Community meetup #3

Ключевые темы: виртуализация в небольших инсталляциях, управление Open Source-операторами и оптимизация ядра хранения данных в Deckhouse Prom++

Если вы решаете инфраструктурные задачи и работаете с кубером, рекомендуем зарегистрироваться прямо сейчас.
🤔 Что такое лямбда выражение в Phyton?

В Python лямбда-выражение — это анонимная (безымянная) функция, создаваемая с помощью ключевого слова lambda.

Синтаксис
lambda аргументы: выражение


🚩Примеры

Простая лямбда-функция
add = lambda x, y: x + y
print(add(3, 5)) # Выведет: 8


Эквивалентно обычной функции
def add(x, y):
return x + y


Лямбда внутри map()
nums = [1, 2, 3, 4]
squares = list(map(lambda x: x ** 2, nums))
print(squares) # [1, 4, 9, 16]


Лямбда внутри sorted()
words = ["apple", "banana", "kiwi"]
sorted_words = sorted(words, key=lambda w: len(w))
print(sorted_words) # ['kiwi', 'apple', 'banana']


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

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


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