tgindex

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

описание

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

5 531
подписчиков
Охват к подписчикам
12,3%
ERR
Реакции к просмотрам
0,07%
12 на 28 постов
Пересылки к просмотрам
0,84%
142
Постов в день
1,4
всего 25

Где отзываются чаще

доля реакций к просмотрам
  • 15 авг.🤔 Как дебажить поды в Kubernetes? Когда под (Pod) не работает или ведёт себя странно, нужно уметь его дебажить. 🟠Проверить статус пода Сначала смотрим, работает ли под вообще kubectl get pods 🟠Посмотреть логи контейнера Если под запустился, но работает странно, смотрим логи: kubectl logs pod-name Если в поде несколько контейнеров: kubectl logs pod-name -c container-name Если под перезапускается, а нам нужны старые логи: kubectl logs pod-name --previous 🟠Проверить события (`describe`) Смотрим подробную информацию о поде: kubectl describe pod pod-name 🟠Зайти внутрь контейнера (`exec`) Если под запущен, можно подключиться внутрь и посмотреть файлы, процессы: kubectl exec -it pod-name -- /bin/sh Если в контейнере есть только bash: kubectl exec -it pod-name -- /bin/bash Полезные команды внутри контейнера: ps aux # Смотрим запущенные процессы netstat -tulnp # Проверяем открытые порты env # Проверяем переменные окружения cat /etc/resolv.conf # Проверяем DNS 🟠Проверить манифест пода (`get pod -o yaml`) Если под ведёт себя странно, можно посмотреть его полное описание: kubectl get pod pod-name -o yaml 🟠Проверить ресурсы (describe node) Иногда под не запускается из-за нехватки CPU или памяти. Проверяем узел (node): kubectl describe node node-name Если проблема с ресурсами, будет что-то вроде: Warning FailedScheduling insufficient memory 🟠Проверить сеть (`nslookup`, `ping`, `curl`) Если под не может достучаться до сервиса, тестируем сеть: kubectl exec -it pod-name -- nslookup service-name kubectl exec -it pod-name -- ping 8.8.8.8 kubectl exec -it pod-name -- curl http://service-name:8080 🟠Дебажить с помощью `kubectl debug` (Kubernetes 1.23+) Если под не стартует, можно запустить дебажный контейнер kubectl debug pod-name -it --image=busybox Ставь 👍 и забирай 📚 Базу знаний0,52%
  • 11:05🤔 Как бы вы настроили уведомления для сервисов которые находятся без интернета полностью локализованы закрыты от всего извне? Для настройки уведомлений в изолированной сети без доступа к интернету используйте локальные инструменты и системы. Основные методы включают локальные почтовые серверы, мессенджеры и системы управления инцидентами. 🚩Локальный почтовый сервер (SMTP) 1⃣Установка sudo apt update sudo apt install postfix 2⃣Настройка Отредактируйте /etc/postfix/main.cf myhostname = local.example.com mydomain = example.com myorigin = $mydomain inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain relay_domains = $mydestination 3⃣Перезапуск Postfix sudo systemctl restart postfix 4⃣Проверка echo "Test email" | mail -s "Test Subject" user@example.com 🚩Локальный мессенджер (Mattermost) 1⃣Установка Mattermost Следуйте [документации](https://docs.mattermost.com/install/self-managed-install.html). 2⃣Настройка Создайте каналы и пользователей. 3⃣Интеграция с мониторингом Используйте веб-хуки Mattermost для уведомлений. 🚩Системы управления инцидентами (Zabbix) 1⃣Установка Zabbix Следуйте [документации](https://www.zabbix.com/download). 2⃣Настройка Настройте хосты, триггеры и действия. 3⃣Настройка уведомлений Медиатипы: Настройте Email и SMS. Пользователи: Создайте пользователей и уведомления. 🚩Локальный стек мониторинга (Prometheus, Alertmanager) 1⃣Установка Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-amd64.tar.gz tar xvf prometheus-2.26.0.linux-amd64.tar.gz cd prometheus-2.26.0.linux-amd64 ./prometheus --config.file=prometheus.yml 2⃣Установка Alertmanager wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz tar xvf alertmanager-0.21.0.linux-amd64.tar.gz cd alertmanager-0.21.0.linux-amd64 ./alertmanager --config.file=alertmanager.yml 3⃣Настройка алертинга в Prometheus groups: - name: example-alerts rules: - alert: HighCPUUsage expr: avg_over_time(node_cpu_seconds_total{mode="idle"}[5m]) < 20 for: 2m labels: severity: critical annotations: summary: "High CPU usage detected" description: "CPU usage is above 80% for more than 2 minutes" 4⃣Настройка Alertmanager global: smtp_smarthost: 'localhost:25' smtp_from: 'alertmanager@local.example.com' route: receiver: 'email-notifications' receivers: - name: 'email-notifications' email_configs: - to: 'admin@local.example.com' send_resolved: true Ставь 👍 и забирай 📚 Базу знаний0,35%
  • 12 авг.🤔 Что за протокол http, зачем он нужен? HTTP (HyperText Transfer Protocol) — это протокол передачи данных в интернете. Он используется для обмена данными между клиентом (браузером) и сервером. 🚩Пример работы HTTP Браузер отправляет запрос → "GET /index.html HTTP/1.1". Сервер отвечает → HTML-страницей (200 OK). Браузер отображает страницу. 🚩Основные принципы HTTP Клиент-серверная модель → браузер запрашивает, сервер отвечает. Без состояния (stateless) → каждый запрос независим (нет сессий). Текстовый протокол → данные передаются в читаемом формате. 🚩Структура HTTP-запроса Пример запроса от браузера к серверу GET /index.html HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Ставь 👍 и забирай 📚 Базу знаний0,31%
  • 13 авг.🤔 Что такое squash в Docker? В Docker термин "squash" (от англ. "раздавить", "сплющить") относится к процессу объединения нескольких слоев образа Docker в один. Это делается для уменьшения размера итогового образа и оптимизации хранения. 🚩Зачем нужен `squash`? Docker-образы состоят из последовательности слоев. Каждый слой создается на основе команд в Dockerfile. Например, если ваш Dockerfile выглядит так: FROM ubuntu:latest RUN apt update && apt install -y nginx RUN echo "Hello, World!" > /usr/share/nginx/html/index.html 🚩Как использовать `squash`? В Docker squash можно выполнить с помощью флага --squash при сборке образа: docker build --squash -t my-squashed-image . Для включения экспериментального режима: 1. Открываем /etc/docker/daemon.json (или создаем, если его нет). 2. Добавляем строку "experimental": true. 3. Перезапускаем Docker: systemctl restart docker 🚩Пример с `squash` Без --squash docker history my-image С --squash docker build --squash -t my-squashed-image . docker history my-squashed-image Ставь 👍 и забирай 📚 Базу знаний0,20%
  • 8 авг.🤔 Из чего состоит ELK стек? ELK (Elasticsearch, Logstash, Kibana) – это стек для сбора, обработки, хранения и визуализации логов. Он помогает DevOps-инженерам анализировать логи в реальном времени и выявлять проблемы в системе. 🚩Elasticsearch – хранилище и поиск логов - Хранит структурированные и неструктурированные данные (логи, метрики) - Поддерживает быстрый полнотекстовый поиск - Использует кластеризацию для высокой доступности json GET /logs/_search { "query": { "match": { "message": "error" } } } 🚩Logstash – обработка и отправка логов - Собирает логи из файлов, TCP, Kafka, Beats - Фильтрует и преобразует данные перед отправкой в Elasticsearch - Поддерживает шифрование и маршрутизацию yaml input { file { path => "/var/log/nginx/access.log" start_position => "beginning" } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] } } 🚩Kibana – визуализация и анализ - Позволяет строить дашборды и графики - Делает поиск по логам и метрикам - Визуализирует реальное время работы системы message: "error" AND @timestamp:[now-24h TO now] 🚩Как ELK-стек работает вместе? Logstash собирает и обрабатывает логи Отправляет их в Elasticsearch Kibana визуализирует данные yaml version: "3" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.5.0 environment: - discovery.type=single-node ports: - "9200:9200" logstash: image: docker.elastic.co/logstash/logstash:8.5.0 depends_on: - elasticsearch volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf ports: - "5044:5044" kibana: image: docker.elastic.co/kibana/kibana:8.5.0 depends_on: - elasticsearch ports: - "5601:5601" Ставь 👍 и забирай 📚 Базу знаний0,19%
  • 28 июл.🤔 Что используется внутри докер контейнера? Внутри Docker-контейнера используется изолированная среда, которая позволяет запускать приложения в предсказуемом и воспроизводимом окружении. Контейнер предоставляет доступ к базовой файловой системе, процессам, сетевым интерфейсам и другим ресурсам, изолированным от хоста и других контейнеров. Давайте разберем основные компоненты, которые используются внутри Docker-контейнера. 🟠Файловая система Каждый контейнер имеет собственную файловую систему, основанную на многослойной архитектуре. Это изолированное пространство предоставляет доступ к: Образу Docker (image): Базовый набор файлов, определенных в Docker Image. Copy-on-write (COW): Контейнеры используют copy-on-write слой для изменений. Базовый образ остается неизменным, а любые изменения записываются в слой контейнера. Точки монтирования: Возможность монтировать директории хоста или сетевые тома (volumes) для сохранения данных. docker run -v /host/path:/container/path nginx 🟠Процессы В контейнере запускаются процессы, как в обычной операционной системе. Главный процесс контейнера (например, команда из CMD или ENTRYPOINT) работает с PID 1 и отвечает за выполнение приложения. Процессы внутри контейнера изолированы от процессов на хосте благодаря использованию Linux namespaces. docker exec <container_id> ps aux 🟠Сетевые интерфейсы Docker-контейнеры используют виртуальные сетевые интерфейсы для связи: veth-pair: Каждый контейнер имеет виртуальный интерфейс, подключенный к мосту (docker0 по умолчанию). Типы сетей: bridge (по умолчанию): Локальная сеть между контейнерами. host: Контейнер использует сетевой стек хоста. none: Полностью изолированный контейнер без сети. overlay: Сеть для соединения контейнеров на разных хостах. docker network create my_network docker run --network my_network nginx 🟠Ресурсы хоста (CPU, память, диски) Контейнеры используют ресурсы хоста, но их потребление можно ограничить: CPU: Контейнер может использовать определенную долю процессора. docker run --cpus="2" nginx Память: Лимит на использование оперативной памяти. docker run -m 512m nginx I/O (диск): Возможность ограничения операций чтения/записи. docker run --device-read-bps=/dev/sda:1mb nginx 🟠Изоляция (Namespaces и Control Groups) Docker использует технологии изоляции, встроенные в ядро Linux: Namespaces: Обеспечивают изоляцию пространства имен (PID, сети, файловой системы и т.д.). Control Groups (cgroups): Управляют использованием ресурсов (CPU, RAM, I/O). lsns 🟠Среда выполнения (Runtime) Docker-контейнеры работают благодаря среде выполнения, например: runc: Легковесное средство выполнения контейнеров, совместимое со стандартом OCI. containerd: Менеджер для запуска контейнеров, который Docker использует для взаимодействия с низкоуровневыми компонентами. 🟠Настройки и переменные среды Контейнер может быть настроен с использованием: Переменных среды: Устанавливаются через ENV в Dockerfile или с помощью флага -e. docker run -e ENV_VAR=value nginx Аргументов при сборке: Используются в Dockerfile через ARG. ARG BUILD_VERSION 🟠Приложение или служба Главное, что работает внутри контейнера, — это само приложение: Например, веб-сервер (Nginx, Apache) или база данных (MySQL, PostgreSQL). Контейнеры упрощают запуск приложений с предсказуемыми зависимостями. 🟠Логи и мониторинг Docker предоставляет возможность просматривать логи контейнера и собирать метрики Логи docker logs <container_id> Информация о контейнере docker inspect <container_id> Ставь 👍 и забирай 📚 Базу знаний0,14%
  • 6 авг.🤔 Что такое брокеры сообщений? Это программные системы, которые позволяют обмениваться данными между разными компонентами приложения или между различными приложениями. Они действуют как посредники, принимая сообщения от отправителей (producers) и доставляя их получателям (consumers). 🚩Основные функции брокеров сообщений 🟠Прием и маршрутизация сообщений Сообщения отправляются от одного компонента и доставляются нужному получателю. Брокер определяет, куда отправить сообщение, используя темы (topics), очереди (queues) или маршруты (routing keys). 🟠Асинхронное взаимодействие Отправитель может передать сообщение, не дожидаясь его обработки, что повышает производительность системы. 🟠Очереди сообщений Если получатель временно недоступен, сообщение сохраняется в очереди до тех пор, пока оно не будет доставлено. 🟠Гарантированная доставка Некоторые брокеры предоставляют механизмы подтверждения получения сообщений (acknowledgment), чтобы избежать их потери. 🟠Распределение нагрузки Сообщения могут быть обработаны несколькими получателями, что позволяет распределить нагрузку между ними. 🟠Фильтрация и маршрутизация Сообщения доставляются только тем потребителям, которые их ожидают, используя фильтры или ключи маршрутизации. 🚩Примеры использования брокеров сообщений 🟠Микросервисы Компоненты приложения обмениваются данными через брокер, что позволяет им оставаться изолированными и независимыми. 🟠Логирование и мониторинг Сбор логов и метрик от множества источников с их дальнейшей обработкой. 🟠Управление задачами Постановка задач в очередь для выполнения одним или несколькими воркерами. 🟠Интеграция систем Связывание разнородных систем, которые обмениваются данными. 🚩Примеры брокеров сообщений 🟠RabbitMQ Протокол: AMQP (Advanced Message Queuing Protocol). Поддерживает очереди, маршрутизацию, подтверждения доставки. Хорошо подходит для сложных сценариев с разными типами маршрутизации. 🟠Apache Kafka Протокол: Проприетарный. Отличается высокой производительностью и надежностью. Используется для потоковой обработки данных, аналитики в реальном времени. 🟠Redis (Pub/Sub) Протокол: Redis. Простая и быстрая модель pub/sub. Хорошо подходит для временных сообщений без сохранения состояния. 🟠ActiveMQ Протокол: AMQP, STOMP, MQTT. Гибкий и совместимый с различными сценариями. 🟠NATS Легковесный и быстрый брокер для приложений, требующих низкой задержки. 🚩Как работают брокеры сообщений Producers (отправители) отправляют сообщение в брокер. Брокер размещает сообщение в соответствующей очереди или теме. Consumers (получатели) получают сообщение: Либо сразу, если они активны. Либо позже, если оно сохраняется в очереди. 🚩Пример использования RabbitMQ 1⃣Отправитель публикует сообщение в очередь: import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') connection.close() 2⃣Получатель забирает сообщение из очереди: import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print(f"Received {body}") channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True) channel.start_consuming() 🚩Плюсы использования ➕Разделение ответственности Компоненты системы сосредотачиваются на своих задачах, а не на доставке данных. ➕Масштабируемость Легко добавлять новых потребителей или отправителей. ➕Устойчивость к сбоям Брокеры обеспечивают сохранность сообщений, даже если один из компонентов временно недоступен. ➕Гибкость Возможность использовать различные стратегии маршрутизации и обработки данных. Ставь 👍 и забирай 📚 Базу знаний0,14%
  • 1 авг.🤔 Как мы можем поменять последовательное выполнение таски плейбука на машинах в параллельное? По умолчанию 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 &" Ставь 👍 и забирай 📚 Базу знаний0,13%
  • 3 авг.🤔 Может ли быть несколько контейнеров в поде? Да, в 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 Ставь 👍 и забирай 📚 Базу знаний0,13%
  • 4 авг.🤔 Что такое debezium? Она позволяет отслеживать изменения в базах данных (INSERT, UPDATE, DELETE) в реальном времени и передавать их в Kafka, Elasticsearch, MongoDB и другие системы. 🚩Как работает Debezium? Подключается к базе данных (PostgreSQL, MySQL, MongoDB, Oracle и др.). Слушает лог изменений (binlog, WAL, oplog и т. д.) Формирует события в формате JSON Передаёт их в Kafka или другую шину данных. 🚩Где используется? Синхронизация данных между базами Репликация данных в реальном времени Отправка изменений в аналитические системы (Elasticsearch, ClickHouse) Аудит и логирование изменений 🟠Пример работы с Kafka Запускаем Debezium Connector для PostgreSQL* { "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.postgresql.PostgresConnector", "database.hostname": "localhost", "database.port": "5432", "database.user": "debezium", "database.password": "dbz", "database.dbname": "inventory", "database.server.name": "dbserver1" } } При изменении данных в таблице, Kafka получит событие: { "schema": { ... }, "payload": { "before": { "id": 1, "name": "Old Name" }, "after": { "id": 1, "name": "New Name" }, "op": "u" // Update } } Ставь 👍 и забирай 📚 Базу знаний0,12%
  • 20:19без подписи0,00%
  • 01:06без подписи0,00%