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

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

الذهاب إلى القناة على Telegram
5 511
المشتركون
-224 ساعات
-47 أيام
-330 أيام
أرشيف المشاركات
🤔 Может ли быть несколько контейнеров в поде? Да, в Kubernetes Pod можно запускать несколько контейнеров, и это обычная практика. Pod — это минимальная единица развертывания в Kubernetes которая может содержать один или несколько контейнеров. 🚩Зачем запускать несколько контейнеров в одном Pod? 🟠Sidecar-контейнеры вспомогательные контейнеры, дополняющие основное приложение (логирование, прокси, безопасность). 🟠Init-контейнеры выполняют задачи перед запуском основного контейнера (например, подготовка базы данных). 🟠Общий файловый кэш контейнеры могут использовать общие тома (volumes) для хранения данных. 🟠Общий сетевой стек контейнеры в одном Pod разделяют IP-адрес и порты. 🚩Пример: два контейнера в одном Pod (Nginx + логирование) Допустим, у нас есть Nginx и отдельный контейнер, который собирает его логи.
yaml  
apiVersion: v1  
kind: Pod  
metadata:  
  name: nginx-pod  
spec:  
  containers:  
  - name: nginx  
    image: nginx  
    volumeMounts:  
    - name: log-volume  
      mountPath: /var/log/nginx  

  - name: log-collector  
    image: busybox  
    command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]  
    volumeMounts:  
    - name: log-volume  
      mountPath: /var/log/nginx  

  volumes:  
  - name: log-volume  
    emptyDir: {}  
🚩Как работают контейнеры внутри Pod? Все контейнеры внутри Pod имеют один IP-адрес и могут взаимодействовать через localhost. Например, если в одном контейнере работает Node.js на порту 3000, другой контейнер внутри Pod может обращаться к нему через localhost:3000. Контейнеры могут делиться файлами через volumes, как в примере выше. Если нужно выполнить команду перед запуском основного контейнера, используют initContainers.
yaml  
apiVersion: v1  
kind: Pod  
metadata:  
  name: app-pod  
spec:  
  initContainers:  
  - name: wait-for-db  
    image: busybox  
    command: ["sh", "-c", "until nc -z db-service 5432; do sleep 1; done"]  

  containers:  
  - name: app  
    image: my-app
Ставь 👍 и забирай 📚 Базу знаний

🤔Как запустишь приложение в Kubernetes? Чтобы запустить приложение в Kubernetes: 1. Подготовь манифест YAML с описанием (обычно это Deployment или StatefulSet). 2. Убедись, что есть нужный Service, чтобы обеспечить доступ к приложению. 3. Применяешь манифест командой: 4. kubectl apply -f <файл>.yaml Приложение развернётся в виде подов, которые будут управляться контроллером. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое SLA, SLO, SLI? Эти три термина относятся к управлению надежностью и качеством IT-сервисов. Они помогают определить, измерить и гарантировать уровень обслуживания пользователей. 🚩SLI (Service Level Indicator) – Показатель уровня сервиса SLI – это метрика, которая показывает, насколько хорошо работает сервис. - Доступность (например, uptime 99.9%) - Время ответа API (например, менее 200 мс) - Ошибки запросов (например, не более 1% 5xx ошибок) 🚩SLO (Service Level Objective) – Целевой уровень сервиса SLO – это цель, которую компания ставит для SLI. Доступность 99.9% сервиса в месяц. Среднее время ответа API ≤ 200 мс. 🚩SLA (Service Level Agreement) – Соглашение об уровне сервиса SLA – это официальное соглашение между клиентом и провайдером сервиса, которое описывает обязательства и штрафы за их невыполнение. - Если доступность меньше 99.9%, клиент получает возврат денег. - Если среднее время ответа API больше 500 мс, клиент получает скидку. 🚩Как они связаны? SLI (метрика) → измеряет, насколько хорош сервис. SLO (цель) → устанавливает, каким должен быть сервис. SLA (договор) → фиксирует обязательства и штрафы. Ставь 👍 и забирай 📚 Базу знаний

Бесплатный курс по дизайну: веб, графический и UX/UI Получи востребованные навыки: - создание дизайна сайтов и приложений - с
Бесплатный курс по дизайну: веб, графический и UX/UI Получи востребованные навыки: - создание дизайна сайтов и приложений - создание инфографики и карточек для маркетплейсов - работа в графическом редакторе Figma и др. Студенты курса в среднем зарабатывают от 68 000 ₽ уже во время обучения💰 Зарегистрироваться #реклама 16+ ydaev.ru О рекламодателе

🤔 Что должно находиться внутри пода? Внутри пода размещаются один или несколько контейнеров, выполняющих взаимосвязанные задачи. Также могут быть volume для хранения данных и sidecar-контейнеры для дополнительных функций, таких как логирование. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое config map в кубере? ConfigMap в Kubernetes – это механизм хранения конфигурационных данных. Он позволяет разделять код приложения и настройки, храня конфигурацию в виде ключ-значение. ConfigMap удобен для передачи переменных окружения, файлов конфигурации, командных аргументов без изменения образа контейнера. 🚩Основные способы использования ConfigMap 🟠Переменные окружения передача настроек через ENV. 🟠Файлы конфигурации монтирование в контейнер как файл. 🟠Параметры командной строки передача аргументов в command. 🚩Как создать ConfigMap? 1⃣Создание из манифеста
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "debug"
  CONFIG_FILE: |
    [settings]
    mode = "production"
    debug = true
2⃣Создание из командной строки
kubectl create configmap my-config --from-literal=APP_ENV=production --from-literal=LOG_LEVEL=debug
3⃣Создание из файла
kubectl create configmap my-config --from-file=config.ini
🚩Как использовать ConfigMap в подах? 1⃣Как переменные окружения
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: APP_ENV
2⃣Как монтируемый файл
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
  volumes:
  - name: config-volume
    configMap:
      name: my-config
Ставь 👍 и забирай 📚 Базу знаний

Стажировки и вакансии для 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.

🤔 Как сделать свой провайдер в Terraform? Для этого нужно: - Написать провайдер на Go; - Описать ресурсы, методы CRUD; - Зарегистрировать и протестировать его через Terraform Plugin SDK; - Опубликовать или использовать локально. Это позволяет управлять неподдерживаемыми или внутренними ресурсами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое Web Sockets (веб сокет)? WebSockets (веб-сокеты) — это коммуникационный протокол, предоставляющий возможность устанавливать постоянное, двустороннее соединение между клиентом (обычно веб-браузером) и сервером через один TCP-соединение. Это позволяет обмениваться данными в реальном времени с минимальной задержкой и без необходимости повторного открытия соединения для каждого обмена сообщениями, как это происходит в традиционных HTTP-соединениях. 🚩Основные характеристики WebSockets: 🟠Двусторонняя коммуникация: WebSockets поддерживают полноценную двустороннюю (или full-duplex) коммуникацию, что позволяет как клиенту, так и серверу отправлять данные в любое время без необходимости инициирования запроса. 🟠Постоянное соединение: После установления WebSocket-соединение остается открытым, что значительно уменьшает задержки, связанные с установлением новых соединений, характерных для HTTP-запросов. 🟠Меньший накладной расход: WebSockets используют меньше заголовков по сравнению с HTTP-запросами, что делает передачу данных более эффективной и менее затратной по времени и ресурсам. 🟠Протокол: WebSocket протокол стандартизирован в RFC 6455 и поддерживается большинством современных веб-браузеров. Соединение начинается с обычного HTTP-запроса, который затем "обновляется" до WebSocket-соединения через HTTP-заголовок Upgrade. 🚩Как работает WebSocket: 🟠Установление соединения: Клиент отправляет HTTP-запрос с заголовком Upgrade: websocket на сервер, указывая на желание перейти к протоколу WebSocket. Сервер отвечает подтверждением, если поддерживает WebSockets, и соединение устанавливается. 🟠Передача данных: После установления соединения клиент и сервер могут обмениваться данными в обе стороны по мере необходимости. Сообщения передаются как фреймы (frames), которые могут содержать текстовые или бинарные данные. 🟠Закрытие соединения: Соединение может быть закрыто любой стороной в любой момент времени с отправкой соответствующего фрейма закрытия. 🚩Применения WebSocket: 🟠Реальное время: Приложения, требующие обновлений в реальном времени, такие как чаты, системы обмена сообщениями, онлайн-игры, торги на биржах. 🟠Потоковая передача данных: Веб-сокеты идеально подходят для приложений, передающих данные в реальном времени, таких как спортивные трансляции или финансовые данные. 🟠Уведомления и оповещения: Приложения, отправляющие мгновенные уведомления пользователям, например, социальные сети или системы мониторинга. 🟠Коллаборативные инструменты: Инструменты для совместной работы, такие как совместное редактирование документов или доски с заметками. Преимущества WebSocket: 🟠Эффективность: Меньший накладной расход и постоянное соединение делают WebSockets более эффективными для приложений, требующих частого обмена данными. 🟠Скорость: WebSockets обеспечивают более низкую задержку, что делает их идеальными для приложений, работающих в реальном времени. 🟠Простота использования: WebSockets имеют простой API, который легко интегрируется с современными веб-приложениями. Ставь 👍 и забирай 📚 Базу знаний

Нужны актуальные вопросы с собеседований ? DevOps | Собеседования - твой незаменимый помощник в подготовке к собеседованиям.
Нужны актуальные вопросы с собеседований ? DevOps | Собеседования - твой незаменимый помощник в подготовке к собеседованиям. 🔊Обзоры собеседований c вилками на позиции: 🔵DevOps инженеров (Junior, Middle, Senior). 🔵С комментариями автора, как человека, который активно собеседует кандидатов. 🔊В ближайшее время: 🔵Записи реальных собеседований (не моки и открытые собеседования). 🔵Гайды и рекомендации по обходу частых ошибок при выступлении на техническом интервью. ➡️ Подписаться

🤔 Где runner берёт код? GitLab Runner скачивает код из репозитория, к которому привязан pipeline. Он использует Git clone или fetch, чтобы получить актуальную версию кода, соответствующую коммиту или ветке, где был инициирован pipeline. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое 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 – графики с датчиков и устройств Ставь 👍 и забирай 📚 Базу знаний

🤔 Как определить ресурс, который необходим одной node? - Собрать usage-метрики: Через kubectl top node, Prometheus или Cloud Monitoring. - Сравнить с pod requests: Если нода забита, а pod’ы с маленькими requests — нужно увеличивать. - Просмотреть узкие места: CPU, RAM, IO, дисковое пространство — что конкретно лимитирует. - Использовать нагрузочные тесты: Прогнать типичную нагрузку и посмотреть, как ведут себя узлы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

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

🤔 Что происходит после того, как GitLab скачал код? После загрузки кода: - Runner выполняет шаги, указанные в .gitlab-ci.yml; - запускаются скрипты, сборка, тестирование, деплой; - могут использоваться Docker-образы, артефакты, кэш; - GitLab отслеживает логи и статусы выполнения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть лучшие практики в использовании инструкции add и copy? ADD и COPY — это инструкции Dockerfile, которые копируют файлы в контейнер. Их использование влияет на размер образа, безопасность и производительность сборки. 🚩Лучшие практики по использованию `COPY` и `ADD` 🟠Используйте `COPY` вместо `ADD`, если не нужно распаковывать архивы Плохо (избыточное использование ADD)
ADD app.tar.gz /app/
Хорошо (явное распаковывание в RUN)
COPY app.tar.gz /tmp/
RUN tar -xzf /tmp/app.tar.gz -C /app && rm /tmp/app.tar.gz
🟠Минимизируйте число `COPY` и `ADD`, чтобы уменьшить размер образа Плохо (копируем всё без исключений)
COPY . /app
Хорошо (копируем только нужные файлы)
COPY src/ /app/src/
COPY requirements.txt /app/
Добавьте .dockerignore
.git
node_modules
__pycache__
*.log
🟠Копируйте только изменяемые файлы, чтобы ускорить кэширование Плохо (изменение кода приводит к пересборке зависимостей)**
COPY . /app
RUN pip install -r /app/requirements.txt
Хорошо (сначала зависимости, потом код)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt

COPY src/ /app/src/
🟠Не используйте `ADD` для загрузки файлов из интернета Плохо (ADD загружает файл, но не кэшируется)
ADD https://example.com/file.tar.gz /tmp/
🟠Хорошо (используем RUN curl + COPY)
RUN curl -L -o /tmp/file.tar.gz https://example.com/file.tar.gz
COPY file.tar.gz /app/
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие сущности указывают в манифесте Terraform? - provider - resource - variable - locals - output - module - data (чтение внешних сущностей) Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В каких случаях удобно использовать kubernetes, а в каких docker-compose? Оба инструмента управляют контейнерами, но предназначены для разных сценариев. 🚩Когда использовать Docker Compose? Docker Compose удобен для локальной разработки и небольших проектов. Разворачиваете приложение на одном сервере. Нужно быстро поднять несколько сервисов (БД, кэш, бекенд, фронт). Разработка ведется в команде, и среда должна быть одинаковой. Нет необходимости в сложном оркестрационном механизме (авто-масштабирование, балансировка нагрузки). Файл docker-compose.yml для запуска бэкенда и базы данных локально:
version: '3'
services:
  app:
    image: my-backend:latest
    ports:
      - "5000:5000"
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
Команда запуска:
docker-compose up -d
🚩Когда использовать Kubernetes? Kubernetes удобен для продакшн-окружений, облаков и сложных приложений. Нужно масштабирование (автоматическое увеличение/уменьшение количества контейнеров). Требуется автоисправление (если контейнер падает, он перезапускается). Используется балансировка нагрузки (Kubernetes распределяет трафик между подами). Нужна развертка в кластере (несколько машин, облако). Требуется обновление без простоя (rolling updates).
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-backend:latest
        ports:
        - containerPort: 5000
Разворачиваем в Kubernetes:
kubectl apply -f my-app.yaml
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какая первая строчка в bash скрипте? Это строка с указанием интерпретатора, чаще всего используется bash. Она обязательна, чтобы скрипт корректно исполнился в нужной среде. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем разница 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
Ставь 👍 и забирай 📚 Базу знаний