- Вопросы к SRE/DevOps на интервью
- Ответы на вопросы
- DevOps практики
- Linux
- Динамическая маршрутизация и разные протоколы динамической маршрутизации, ebgp ibgp, константы bgp. На чём сейчас принято строить bgp-пиринги. Что такое blackhole.
- Команды дебага Linux
- IPIP over TCP или нет?
- Как OOM выбирает кого убивать?
- Что такое UEFI?
- Что делает команда kill?
- Для чего нужны сигналы? Какие сигналы используются чаще всего? 5 - 10 штук
- Что делает сигнал SIGHUP?
- Какие сигналы не могут быть проигнорированы?
- Процессы и треды шаринг ресурсов
- DNS работает через TCP или UDP?
- Методы мониторинга
- Шифрование
- Сети
- В чем разница между TCP и UDP?
- Что такое QUIC?
- Как TCP устанавливает соединение?
- Как происходит TLS Handshake?
- Что такое SNI?
- Что такое mTLS?
- Что такое маска подсети и CIDR?
- Назовите все уровни OSI
- Как диагностировать доступность порта и сервиса?
- Что такое DNS и какие типы записей бывают?
- Какие бывают HTTP-статус-коды?
- Что происходит, когда вы вводите адрес в браузере?
- Контейнеризация
- Docker
- Kubernetes
- Компоненты Kubernetes
- Компоненты контура управления Kubernetes
- Компоненты worker-ноды Kubernetes
- Kubectl apply manifest - что происходит после этой команды коротко?
- Kubectl apply manifest - что происходит после этой команды развернуто?
- Как устроена сеть в Kubernetes
- Что такое Network Policies в Kubernetes
- Общие вопросы по Kubernetes
- Общие вопросы с собесов
- Ansible
- Terraform
- Базы данных
- Свистелки
https://github.com/Tinkoff/career/blob/main/interview/README.md - IT собеседование в Тинькофф
https://learnk8s.io/production-best-practices - Kubernetes best practice
https://github.com/Swfuse/devops-interview/blob/main/interview.md - IT вопросы на собесе
https://www.opennet.ru/base/net/tcpdump_explore.txt.html - tcpdump
https://habr.com/ru/company/alexhost/blog/531170/ - tcpdump
- Эта позиция, на которую вы меня собеседуете - новая, или я заменю старого сотрудника? Чем не подошел старый сотрудник?
- В какую команду вы меня берете и на какой проект?
- Какие задачи решать и какую функцию я буду выполнять?
- Как у вас построен процесс повышения грейдов и пересмотра зарплат?
- На какой срок рассчитан этот проект?
- Какие карьерные перспективы могут меня ждать в вашей компании?
CI - Непрерывная интеграция:
1. План
2. Код
3. Сборка
4. Тест
CD - Непрерывная доставка:
1. Тест
2. Релиз
3. Развертывание
4. Поддержка и мониторинг
12 факторов приложения — это набор принципов для разработки современных веб-приложений, которые обеспечивают их масштабируемость, надежность и простоту развертывания. Вот краткое описание каждого из 12 факторов:
- Кодовая база: Все приложения должны иметь одну кодовую базу, которая может быть развернута в нескольких средах (разработка, тестирование, продакшн).
- Зависимости: Явно объявляйте и изолируйте зависимости приложения, чтобы обеспечить воспроизводимость среды.
- Конфигурация: Храните конфигурацию в переменных окружения, а не в коде, чтобы упростить управление настройками для разных сред.
- Сервисы поддержки: Внешние сервисы (например, базы данных, очереди сообщений) должны быть подключены через конфигурацию, а не жестко встроены в код.
- Сборка, релиз, запуск: Четко разделяйте этапы сборки, релиза и запуска приложения для обеспечения стабильности и предсказуемости.
- Процессы: Приложение должно быть многопроцессным, а не монолитным, чтобы обеспечить масштабируемость и устойчивость.
- Порты: Приложение должно экспортировать сервисы через порты, а не через сокеты или другие механизмы.
- Параллельность: Приложение должно быть способно масштабироваться горизонтально путем запуска нескольких экземпляров.
- Быстрые стартап и остановка: Приложение должно быстро запускаться и корректно завершать работу, чтобы обеспечить надежность и удобство развертывания.
- Разделение разработки и продакшена: Разработка и продакшен должны быть четко разделены, чтобы предотвратить нежелательные изменения в продакшене.
- Логи: Приложение должно выводить логи в стандартный поток вывода, чтобы обеспечить централизованное управление логами.
- Административные процессы: Административные задачи (например, миграции баз данных) должны выполняться в среде, идентичной продакшену, чтобы обеспечить надежность и предсказуемость.
Динамическая маршрутизация и разные протоколы динамической маршрутизации, ebgp ibgp, константы bgp. На чём сейчас принято строить bgp-пиринги. Что такое blackhole.
-
Ответ
Основные протоколы динамической маршрутизации:
- RIP (Routing Information Protocol) - один из старейших протоколов, использует алгоритм расстояния-вектора.
- OSPF (Open Shortest Path First) - протокол маршрутизации внутри автономной системы, использует алгоритм состояния канала.
- EIGRP (Enhanced Interior Gateway Routing Protocol) - протокол Cisco, сочетает в себе лучшие черты RIP и OSPF.
- BGP (Border Gateway Protocol) - протокол междоменной маршрутизации, используется для маршрутизации между различными автономными системами.
автономные системы (AS) - это сети, управляемые одной или несколькими организациями и имеющие уникальный идентификатор AS. BGP позволяет обмениваться маршрутной информацией между этими системами.
Принцип работы: Интернет состоит из множества Автономных Систем (AS). BGP обменивается информацией о доступности сетей между этими системами.
Масштабируемость: Это единственный протокол маршрутизации, способный справляться с колоссальными таблицами маршрутов глобального интернета.
Управление политиками: В отличие от внутренних протоколов (например, OSPF), BGP позволяет операторам сетей гибко настраивать правила: какой трафик принимать, а какой отклонять или передавать дальше.eBGP (External BGP) и iBGP (Internal BGP) являются двумя вариантами протокола BGP:
- eBGP используется для маршрутизации между различными автономными системами (AS). Обычно eBGP требует, чтобы маршрутизаторы были непосредственно соединены.
- iBGP используется внутри одной автономной системы. Маршрутизаторы, использующие iBGP, могут быть соединены через другие маршрутизаторы, не участвующие в BGP.
Константы BGP включают различные атрибуты и параметры, которые используются для выбора наилучшего пути. Некоторые из ключевых атрибутов:
- AS_PATH - список AS, через которые проходит маршрут.
- NEXT_HOP - следующий переходный узел, к которому должен обратиться маршрутизатор для достижения целевой сети.
- LOCAL_PREF - предпочтение маршрута внутри AS; чем выше значение, тем предпочтительнее маршрут.
- MED (Multi-Exit Discriminator) - атрибут, используемый для влияния на выбор входящего маршрута соседним AS.
Современные BGP-пиринги часто строятся на основе сетевых устройств, способных обрабатывать большие объемы маршрутизационной информации и поддерживать высокую производительность. Используются как физические, так и виртуальные маршрутизаторы. Важным аспектом является настройка безопасности пиринга, включая аутентификацию и фильтрацию маршрутов.
Blackhole в сетевых терминах — это механизм, используемый для преднамеренного "поглощения" трафика, который по какой-либо причине считается нежелательным или вредоносным. Трафик, направленный в blackhole, обычно отбрасывается, что помогает защитить сеть от DDoS-атак или избавиться от трафика к недоступным сервисам.
lsof -p # поиск удаленных файлов, если процесс их еще держит
numactl --hardware, -H # список номеров нод, разделенных запятыми, или диапазонов A-B, или всех.
perf: # узнать сколько CPU использует каждая функция в программе
CPU:
perf top
perf stat ls -e
perf
/usr/bin/perf top -c 100
strace # отслеживает системные вызовы
strace -e trace=%network -p <PID> # смотреть сетeвые вызовы
strace -f -p <PID> # посмотреть все дочерние процессы
strace -e open -p <PID> # посмотреть все файлы, которые открывает процесс
unshare # запуск программ в пространстве имен, не разделенном с родительским.
ulimit -n # фиксит Too many open files
opensnoop # следит за открытыми файлами
dstat # сочетает в себе возможности iostat, vmstat, netstat и ifstat.
Докер:
docker ps
Ресурсы по ядру:
syscalls https://man7.org/linux/man-pages/man2/syscalls.2.html
The system call is the fundamental interface between an application and the Linux kernel.
Сетевые:
nslookup # DNS запросы
tcpdump # можно проверить проходит ли пакет между хостами. Через wireshark можно посмотреть кто виноват, клиент или сервер.
tcpdump -A # посмотреть пакеты, если трафик не шифрованный
tcpdump -ni any net 10.232.232.0/31 -AvX
-A # Печать каждого пакета (за вычетом заголовка уровня соединения) в формате ASCII. Удобно для захвата веб-страниц.
-v # verbose
-X # Печать данных каждого пакета в шестнадцатеричном формате и ASCII.
sudo ngrep -d any # сканить сеткуЧаще всего, программа работает медленно из-за:
- CPU time;
- Диска (много I/O операций);
- Ожидания медленного сервера.
Mastering the mentioned tools: (strace, tcpdump, netstat, lsof, ngrep, etc)
-
Ответ: Нет.
TCP- L4, аIPIPиGRE-туннели— это туннели сетевого уровня (L3) модели OSI, при создании которых доступны IP-адреса обеих сторон. Они представляются в системе в виде интерфейсов GreX и IPIPX, и через них можно настраивать маршрутизацию (в том числе и default route) точно также, как и через любые другие интерфейсы.
Плюс ко всему для этих интерфейсов можно настроить уровень доступа security level — private, protected или public
IPIP (IP over IP) один из самых простых в настройке туннелей (инкапсулирует только unicast IPv4-трафик). Его можно настроить как на UNIX/Linux-системе, так и на различных маршрутизаторах (например, Cisco).В Kubernetes, IPIP-туннели могут использоваться в Calico, если кластер развернут в облаке, которое не поддерживает BGP. В этом случае Calico использует IPIP для инкапсуляции трафика между подами на разных узлах, обеспечивая их связь через оверлейную сеть.
- Ответ:
По приоритету. Приоритет в файле
/proc/$PID/oom_adj. Сначала сдохнут свежие процессы пользователя с низким приоритетом, в последнюю очередь рутовые. Диапазон от -1000 (OOM Killer пройдет мимо) до 1000 (Процесс будет дохнуть в числе первых).fsnotify
- Ответ:
UEFI: новыйBIOS
Stage boot loader: синий экран загрузки, где можно задатьSingle mod. Представьте себе, и за знание таких терминов спрашивают. Еще бы спрашивали какой драйвер за вывод курсора на винде отвечает...
-
Ответ:
Назначение команды kill - отправить определенный сигнал процессу. По умолчанию используется сигнал SIGTERM.
А вот все сигналы можно глянуть через
kill -l, они нужны для взаимодействия между процессамиroot@pentagon:~# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
-
Ответ:
Это уведомление процесса о наступившем событии. Также это способ взаимодйествия между процссами.
SIGTERM (15)- запрос на "мягкое" завершение процесса.
SIGKILL (9)- принудительное завершение процесса.
SIGINT (2)- прерывание процесса. (Например нажатие Ctrl-C)
SIGSTOP (10)- приостановка процесса.
SIGCONT (18)- возобновить работу процесса.
SIGHUP (1)- перезагрузка конфигурации (например, так можно сделать релоад конфига nginx)
СигналыSIGKILLиSIGSTOPнельзя перехватить, блокировать или игнорировать.
-
Ответ:
SIGHUP: По умолчанию этот сигнал завершает работу программы, но многие демоны используют его для «мягкой» перезагрузки конфигурации без остановки
-
Ответ:
SIGSTOP- принудительная остановка процесса
SIGKILL- немедленное завершение процесса
Процесс — это независимый контейнер ресурсов, содержащий собственную память, код и дескрипторы файлов.
Поток (тред) — это единица выполнения внутри процесса. В отличие от процессов, которые изолированы друг от друга, потоки разделяют общее адресное пространство. То есть, когда один поток изменяет ресурс процесса, это изменение сразу же становится видно другим потокам этого процесса.
-
Ответ:
Как правило, считается, что DNS использует
UDP port 53, ноTCP port 53также зарезервирован под использование для DNS. То есть, (маленький тупой) рекурсивный сервер должен сначала пробовать выполнять DNS-запрос с использованием UDP, но при высокой вероятности большого и усеченного ответа (размер пакета превышает 512 байт), либо при наличии открытой TCP-сессии к запрашиваемому серверу (по которому обрабатывается другой запрос или запрос другого клиента), не возбраняется использование TCP. Подробнее тут
RED Method:- Requests
- Errors
- Duration
4 golden signals:- Задержка (Latency)
- Трафик (Traffic)
- Ошибки (Errors)
- Насыщенность (Saturation)
Симметричное шифрование- один и тот же ключ используется и для кодирования, и для восстановления информации:- Шифр Цезаря, RSA
Асимметричное шифрование- данные шифруются открытым ключем, а расшифровываются приватным. И никакой магии. Примеры:- TLS, SSH.
mTLSдобавляет возможность двусторонней аутентификации. Это означает, что не только клиент, но и сервер должны предоставить свидетельство своей подлинности при установлении защищенного соединения. Такое усиление аутентификации снижает риск атаки «человек посередине», когда злоумышленник пытается подставиться под сервер или клиента.
Здесь будут основные вопросы по сетям, которые задают на собеседованиях.
-
Ответ:
TCP – транспортный протокол (L4 OSI) передачи данных в сетях TCP/IP, предварительно устанавливающий соединение с сетью (SYN > SYN-ACK > ACK) и гарантирующий доставку данных. Используется для передачи таких данных как электронная почта, файлы, сообщения. При определении потери пакетов будет выполнен перезапрос потерянных пакетов. При нарушении порядка доставки пакетов TCP их порядок будет восстановлен.
UDP – транспортный протокол (L4 OSI), передающий сообщения-датаграммы без установки соединения в IP-сети. Используется в потоковой передаче данных IPTV, VoIP. При потере пакетов перезапроса потерянных пакетов не происходит.
В нашем мире каждый протокол используется для разных типов передачи трафика.
-
Ответ покороче:
TCPперед передачей данных устанавливает связь между устройствами. Он выполняет трехэтапное рукопожатие. И при доставке пакета проверяет, дошел ли он до адресата. Если нет - отправляет повторно.
UDPсразу отправляет данные, хендшейк не устанавливает. Возможна частичная потеря и несоблюдение порядка данных.
-
Ответ:
QUIC(Quick UDP Internet Connections) — это транспортный протокол, разработанный Google, который работает поверх UDP. Он предназначен для улучшения производительности веб-приложений и уменьшения задержек при установлении соединений. QUIC объединяет функции TCP и TLS, обеспечивая надежную передачу данных и шифрование в одном протоколе. Основные преимущества QUIC включают:- Быстрое установление соединения: QUIC использует 0-RTT (Zero Round Trip Time) для повторных соединений, что позволяет сократить время ожидания.
- Улучшенная производительность: QUIC снижает задержки и повышает скорость передачи данных за счет оптимизации управления потоками и устранения проблем с блокировкой головы очереди.
- Встроенное шифрование: QUIC обеспечивает безопасность данных с помощью встроенного TLS 1.3, что делает его более безопасным по сравнению с традиционными протоколами.
- Поддержка мультиплексирования: QUIC позволяет грузить сразу несколько объектов веб-страницы.
- Ответ:
Установка TCP-соединения — это процесс «трехстороннего рукопожатия» (3-way handshake). Он гарантирует надежную связь: клиент и сервер синхронизируют номера пакетов и подтверждают готовность.
Этот процесс состоит из трех шагов:
SYN (Synchronize): Клиент отправляет серверу пакет с установленным флагом SYN и своим начальным порядковым номером.SYN-ACK (Synchronize-Acknowledge): Сервер принимает запрос, отвечает пакетом с флагами SYN + ACK, подтверждая получение первым пакетом (номер клиента + 1) и отправляя свой порядковый номер.ACK (Acknowledge): Клиент получает ответ, выделяет ресурсы для связи и отправляет серверу пакет с флагом ACK (номер сервера + 1). Соединение установлено, начинается передача данных.
- Ответ:
TLS-рукопожатие происходит после того, как с помощью TCP-рукопожатия было установлено TCP-соединение.
- Клиент отправляет
ClientHello, в котором сообщает список алгоритмов шифрования, которые он поддерживает. - Сервер отвечает
ServerHello, выбирая версию TLS, набор шифров, отправляя свое случайное число и публичную часть сертификата, и может запросить сертификат клиента (если требуется двусторонняя аутентификация). - Клиент проверяет сертификат сервера, используя доверенные центры сертификации. Если сертификат действителен, клиент
генерирует сеансовый ключ, шифрует его открытым ключом сервера и отправляет обратно. - Сервер расшифровывает
сеансовый ключс помощью своего приватного ключа. Теперь и клиент, и сервер имеют общийсеансовый ключ. - Клиент и сервер отправляют друг другу сообщения
Finished, подтверждая успешное завершение рукопожатия. После этого начинается защищенная передача данных с использованиемсимметричного шифрованияна основесеансового ключа.
Фишка в том что публичным ключом можно только зашифровать, а расшифровать можно только приватным. Поэтому клиент шифрует сеансовый ключ публичным ключом сервера, а сервер расшифровывает его своим приватным ключом.
-
Ответ:
SNI (Server Name Indication)— это расширение протокола TLS, которое позволяет клиенту указывать имя хоста, к которому он пытается подключиться, во время установления TLS-соединения. Это особенно важно для серверов, которые обслуживают несколько доменов на одном IP-адресе (виртуальный хостинг). SNI позволяет серверу выбрать правильный сертификат для конкретного домена, обеспечивая безопасное соединение для каждого клиента.
-
Ответ:
mTLS (Mutual Transport Layer Security)— это расширение протокола TLS, которое обеспечивает двустороннюю аутентификацию между клиентом и сервером. В отличие от стандартного TLS, где только сервер предоставляет свой сертификат для аутентификации, в mTLS оба участника (клиент и сервер) обмениваются сертификатами. Это позволяет не только клиенту убедиться в подлинности сервера, но и серверу проверить подлинность клиента. mTLS можно использовать, например, в Kubernetes.
-
Ответ:
IP-адрес - это 32 бита. Формула для расчета количества IP-адресов на основе префикса CIDR:
$$N = 2^{(32 - P)} - 2$$ где:
- N — количество полезных IP-адресов, которые можно присвоить устройствам.
- 32 — общее количество бит в адресе IPv4.
- P — префикс CIDR (число после косой черты, например, 24 в сети /24).
-
2 — исключение двух обязательных служебных адресов:
- Адрес сети (первый адрес подсети).
- Широковещательный адрес (Broadcast, последний адрес подсети).
На сервере:
- А сервис вообще запущен?
# НА ХОСТЕ
netstat -tulnp | grep <port_number>
# ИЛИ
ss -tulnp | grep <port_number>
# ИЛИ
systemctl status <service_name>- Фаервол не режет порт?
# НА ХОСТЕ
iptables -n -v -L| grep <port_number>
# ИЛИ
ufw status | grep <port_number>- В облаке проверить настройки Security Group (AWS) или NSG (Azure) или Firewall (GCP)
На клиенте:
- Проверить доступность
# НА КЛИЕНТЕ
nc -zv <host> <port_number>
# ИЛИ
telnet <host> <port_number>Тут для telnet:
- CONNECTED - порт доступен, все хорошо
- TRYING - пакеты дропаются по пути
- CONNECTION REFUSED - порт закрыт, но хост доступен
Для https можно использовать curl -v https://<host>:<port_number>
Тут будет видно:
- DNS резолвинг
- TCP соединение
- TLS рукопожатие
- HTTP запрос и ответ
Если запрос от клиента не доходит до сервера, можно использовать traceroute или mtr, чтобы понять где теряются пакеты.
# НА КЛИЕНТЕ
traceroute <host>
# ИЛИ
mtr <host>-
Ответ:
DNS (Domain Name System) — распределённая база данных, переводящая доменные имена (например,
google.com) в IP-адреса (142.250.185.78).Основные типы DNS-записей
Тип Назначение A IPv4-адрес домена AAAA IPv6-адрес домена CNAME Алиас (перенаправление на другой домен), например, www.google.com→google.comMX Почтовые серверы NS DNS-серверы домена TXT Текстовые данные (SPF, DKIM, верификации) PTR Обратная запись (IP → домен) SOA Параметры зоны (авторитетный сервер, TTL) SRV Сервисные записи (порт, приоритет) CAA Разрешённые центры сертификации (SSL)
-
Ответ:
1xx (Информационные): Запрос получен, продолжается обработка.
2xx (Успешные): Запрос успешно обработан.
3xx (Перенаправления): Необходимы дополнительные действия для завершения запроса.
4xx (Ошибки клиента): Ошибка на стороне клиента (например, неверный запрос).Ошибка Значение Пояснение 400 Bad Request Кривый запрос 401 Unauthorized Неавторизован 403 Forbidden Аворизован, но нет прав 404 Not Found Файл или ресурс не найден 405 Method Not Allowed Метод не поддерживается 429 Too Many Requests Слишком много запросов (rate limit) 5xx (Ошибки сервера): Ошибка на стороне сервера (например, сервер не может обработать запрос).
Ошибка Значение Пояснение 500 Internal Server Error Внутренняя ошибка сервера (что-то просто упало) 502 Bad Gateway Прокси не достучался до бэкенда 503 Service Unavailable Сервис перегружен 504 Gateway Timeout Прокси не дождался ответа от бэкенда (таймаут)
-
Ответ:
- DNS-резолвинг: Браузер проверяет локальный (свой) кэш DNS, затем обращается к DNS-серверу для получения IP-адреса домена.
- Кэш браузера
- Кэш ОС
- /etc/hosts
- DNS провайдера
- Корневые DNS-серверы
- DNS-серверы зоны (.com, .org, .net)
- DNS-серверы домена (например, ns1.google.com)
- DNS-серверы зоны (.com, .org, .net)
- Корневые DNS-серверы
- DNS провайдера
- Установка TCP-соединения: Браузер инициирует TCP-соединение с сервером по полученному IP-адресу (3-way handshake).
- TLS Handshake: Если используется HTTPS, происходит TLS-рукопожатие для установления защищенного соединения.
- HTTP-запрос: Браузер отправляет HTTP-запрос на сервер (например, GET /index.html).
- Обработка запроса сервером: Сервер обрабатывает запрос и формирует HTTP-ответ.
- HTTP-ответ: Сервер отправляет ответ обратно браузеру, включая статус-код, заголовки и тело ответа (например, HTML-код страницы).
- Рендеринг страницы: Браузер получает ответ, парсит HTML, CSS и JavaScript, загружает необходимые ресурсы (изображения, скрипты) и отображает страницу пользователю.
Контейнеры = Linux namespaces + cgroups + chroot + capabilities (Seccomp)
-
Namespacesизолируют различные ресурсы между процессами, чтобы они не "видели" друг друга
Механизмы контейнеризации: namespacesNamespaces состоят из:
Тип Что изолирует PID PID процессов NETWORK Сетевые устройства, сетки, порты и т.п. USER ID Пользовательские идентификаторы (UID/GID) MOUNT Точки монтирования (контейнер видит только свою файловую структуру) UTC Изоляция имени хоста и доменного имени IPC Изоляция систем межпроцессного взаимодействия (например, разделяемая память) -
Сgroups(Control Groups) ограничивают, учитывают и изолируют использование ресурсов (CPU/Memory/Disk/Network)Ресурс Пример использования CPU Ограничение использования процессорного времени Memory Задание лимитов на использование памяти Disk I/O Контроль скорости чтения/записи на диск Network Ограничение пропускной способности сети Cgroups предотвращают ситуацию, когда один контейнер потребляет все ресурсы хоста. Вот как они это делают:
-
Ограничение ресурсов- можно определить сколько CPU или памяти будет использовать конкретный процесс -
Приоритизация– cgroups позволяют определить какой процесс в рамках однойcgroupболее приоритетен для использования ресурсов -
Отчетность- лимиты ресурсов мониторятся и сообщаются на уровнеcgroup -
Управление- можно изменить статус (frozen, stopped, restarted) всех процессовcgroupодной командой -
Chroot— операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении, не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называетсяchroot jail. -
Seccomp(сокращение от secure computing) — механизм ядра Linuх, позволяющий процессам определять системные вызовы, которые они будут использовать. Если злоумышленник получит возможность выполнить произвольный код, seccomp не даст ему использовать системные вызовы, которые не были заранее объявлены.
Итоговая структура контейнера:
- Файловая система (основана на UnionFS, включает слои образов).
- Процессы (изолированы с помощью namespaces).
- Ресурсы (управляются через cgroups).
- Сеть (виртуальная, изолированная через net namespace).
- Конфигурация (переменные окружения, монтирование томов, настройки сети).
Контейнеры не включают ядро операционной системы — они используют ядро хоста, что делает их лёгкими и быстрыми по сравнению с виртуальными машинами.
Это технология с открытым исходным кодом, которая создает легкие виртуальные машины, работающие и выглядящие как обычные контейнеры.
Kata Containers объединяют преимущества контейнеров и виртуальных машин (VM). Они обеспечивают более высокий уровень изоляции и безопасности для приложений, сохраняя при этом лёгкость и скорость работы контейнеров. Если обычные контейнеры используют стандартные механизмы контейнеризации Linux, у Kata Containers используются QEMU, KVM.
Контейнер на стероидах. Больше для безопасности придумано.
Принципы работы OverlayFS:
- Чтение файлов:
- OverlayFS сначала ищет файл в верхнем слое.
- Если файл найден, он используется.
- Если файла нет в верхнем слое, он читается из нижнего слоя. - Запись файлов (Copy-on-Write):
- OverlayFS не изменяет файлы в нижнем слое, так как он read-only.
- При изменении файла из нижнего слоя:- Файл копируется в верхний слой (это называется Copy-on-Write).
- Изменения применяются только к копии в верхнем слое.
- Удаление файлов:
- OverlayFS не удаляет файлы из нижнего слоя.
- Вместо этого в верхнем слое создаётся запись, отмечающая файл как "удалённый" (Whiteout File). - Создание новых файлов:
- Новые файлы и каталоги создаются только в верхнем слое.
50 вопросов по Docker, которые задают на собеседованиях, и ответы на них
-
Ответ
Docker базируется на технологиях namespaces, cgroups, capabilities, overlayfs
- namespaces - обеспечивает изоляцию процессов. Например, можно айдишники процессов разместить в разных контейнерах.
- cgroup - ограничивают и управляют использованием ресурсов (CPU, память, дисковый ввод/вывод), которые контейнеры могут потреблять.
- capabilites - штука, которая позволяет дать некоторые root привелегии процессам или исполняемым файлам. Например, изменить UID процесса на 0, или дать возможность монтировать файловые системы.
- overlay (overlayFS, overlay2-драйвер) - файловая система, которая умеет работать "слоями". Не сохранять каждый раз новые файлы, а наслаивать один слой с конкретными изменениями конкретного файла на другой, тем самым экономя место на диске и время создания контейнера.
А вот Docker - это уже штука, которая всеми этими технологиями рулит. Да ещё и удобным для нас образом.
1. **Docker Daemon** — тот самый Container Engine. Запускает контейнеры.
2. **Docker CLI** — утилита по управлению Docker Daemon.
3. **Dockerfile** — инструкция по тому, как собирать образ.
4. **Image** — образ, из которого раскатывается контейнер.
5. **Container** - запущенный экземпляр образа — изолированная среда выполнения.
6. **Docker registry** — хранилище образов.
На **DOCKER_HOST** работает **Docker daemon**, запускает контейнеры. Есть **Client** (Docker CLI), который передаёт команды: *собери образ*, *скачай образ*, *запусти контейнер*. **Docker daemon** ходит в **Registry** и выполняет их. **Docker CLI** может обращаться и локально (к unix-сокету), и по TCP с удалённого хоста.
**Docker Daemon** (демон) — это серверная часть, она работает на хост-машине: скачивает образы и запускает из них контейнеры, создаёт сеть между контейнерами, собирает логи. Когда мы говорим «создай образ», этим тоже занимается демон.
**Docker CLI** — клиентская часть Docker, консольная утилита для работы с демоном. Повторю, она может работать не только локально, но и по сети.
- Использовать multi-stage билды
- Создавать переиспользуемые стейджи
- Выбор оптимальных базовых образов
- Регулярная пересборка образов с обновленными зависимостями
- Использовать --pull в команде
docker buildдля загрузки более новой базовой версии:docker build --pull -t my-image:my-tag . - Использовать параметр --no-cache для чистой сборки:
docker build --pull --no-cache -t my-image:my-tag . - Настроить исключения файлов с помощью
.dockerignore - Создание эфемерных контейнеров (легко и быстро пересоздаваемых)
- Когда я выполняю
docker run hello-world, Docker client отправляет запрос в Docker daemon по API. - Daemon проверяет, есть ли образ локально, и если нет — скачивает его из registry.
- Далее Docker daemon через containerd создаёт контейнер: настраивает namespaces, cgroups, файловую систему и через OCI runtime (runc) запускает процесс контейнера.
- Stdout/stderr процесса передаются обратно через Daemon в Docker client (Docker CLI), который выводит результат в терминал.
При многоэтапной сборке вы используете несколько операторов FROM в вашем Dockerfile. Каждая инструкция FROM использует произвольный базовый образ и начинает новый этап сборки. Вы можете выборочно копировать артефакты с одного этапа на другой, оставляя только то, что вам необходимо в конечном образе. Пример как это работает:
Dockerfile:
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app . # тут вся фишка
CMD ["./app"]Теперь вам нужен только один Dockerfile. Более того, вам больше не нужен и отдельный скрипт сборки. Просто запустите сборку образа привычной командой.
docker build -t ivanovii/href-counter:latest .В итоге, вы получаете крошечный образ. Фишка в том, что вам не нужно извлекать промежуточные артефакты на вашу локальную систему.
Как это работает? Вторая команда FROM начинает новый этап сборки с базового образа alpine:latest. Инструкция COPY --from=0 копирует артефакты с предыдущего этапа сборки на текущий этап, благодаря чему необходимые для сборки Go SDK и любые промежуточные артефакты не сохраняются в конечном образе.
Kube-apiserver:- представляет API Kubernetes;
- умеет в горизонтальное масштабирование;
- на OpenAPI (OpenAPI - это cпецификация), на архитектуре REST.
etcd:- Распределённая и высоконадёжная БД в формате "ключ-значение", основное хранилище всех данных кластера в Kubernetes.
kube-scheduler:- отслеживает созданные поды без привязанного узла (ноды) и выбирает узел, на котором они должны работать;
- назначает поды согласно требованиям к ресурсам, ограничениям, связанным с аппаратными/программными политиками, принадлежности (affinity) и непринадлежности (anti-affinity) узлов/подов, местонахождению данных, предельным срокам отклика.
kube-controller-manager(куча контроллеров в одном бинаре):Node Controller: уведомляет и реагирует на сбои узла;ReplicationController: старая, изначальная технология, сейчас этой балалайки вk8sнет;ReplicaSets Controller: поддерживает правильное количество подов для каждого объектаReplicaSetsв системе. У него нетrolling-update, как у предшественника. Вот по этому появилсяDeployment, он абстракция надReplicaSets, добавляет функционалrolling-update/rollback. Костыли. Кругом костыли;Endpoints Controller: заполняет объект узлов (Endpoints), то есть связывает сервисы (Services) и поды (Pods);Account & Token Controllers: создают стандартные учетные записи и токены доступа API для новых пространств имен.
Контроллер - это асинхронный скрипт, который работает над согласованием текущего состояния системы
Kubernetesс желаемым состоянием. Полезно думать о кубелете как о контроллере! Он запрашиваетPodsизkube-apiserverкаждые 20 секунд (это настраивается), фильтруя те, чьеNodeNameсовпадает с именем узла, на котором запущенkubelet. Получив этот список, он обнаруживает новые добавления, сравнивая их с собственным внутренним кэшем, и начинает синхронизировать состояние, если имеются какие-либо расхождения.
kubelet:- следит за тем, чтобы контейнеры были запущены в поде;
- принимает набор
PodSpecs, и гарантирует работоспособность и исправность определённых в них контейнеров; - если
Podсоздается, он регистрирует некоторые метрики запуска, вPrometheusдля отслеживанияPod;
У пода бывает несколько статусов:
Pending, Running, Succeeded, Failed and Unknown. КогдаPodзапускается впервые,Kubeletвызывает команду удаленной процедурыRunPodSandbox (RPC). "Песочница" - это терминCRIдля описания набора контейнеров, который в языкеKubernetes, как вы догадались, являетсяPod.
kube-proxy:- конфигурирует правила сети на узлах (iptables). При помощи них разрешаются сетевые подключения к вашим подам изнутри и снаружи кластера;
kube-proxy использует уровень фильтрации пакетов в операционной системы, если он доступен. В противном случае, kube-proxy сам обрабатывает передачу сетевого трафика.
- валидация манифеста на стороне
kubectl(client-side) и затем наkube-apiserver(server-side); kubectlидет вkube-apiserverна мастер-ноду, проходя при этом аутентификацию, авторизацию и admission control;kube-apiserverдесериализует манифест и записывает объект вetcd;controller-managerсмотрит наkube-apiserverчерезinformers/watchesи создает необходимые объекты (напр., ReplicaSet для Deployment);kube-schedulerполучает уведомление о новых подах без привязки к ноде, подбирает подходящую ноду и устанавливаетnodeNameу пода;- на воркер-ноде
kubeletсинхронизирует состояние подов черезCRI(Container Runtime Interface) —containerd,cri-oилиdocker; CRIruntime создает контейнеры,CNIпрокидывает сетевой интерфейс в pod, запускаются lifecycle hooks;
1. Действия внутри kubectl (на стороне клиента)
- Валидация и генераторы:
kubectlпроводит валидацию на стороне клиента, не отправляя никаких запросовkubectlформируетHTTPзапрос, который будет отправлен наkube-apiserverkubectlтакже выяснит, нужны ли какие-либо действия, например, запись команды (для роллоута или аудита), или же эта команда просто "--dry-run".
- API groups and version negotiation:
- k8s использует REST архитектуру и протокол OpenAPI. Другими словами, API у кубера не монолитное и имеет много отдельных ресурсов. Собственно, выбирается нужный. Все ресурсы можно посмотреть командой
kubectl api-resources - у
k8sверсионированный API (v1, v1beta1, v1alpha1, apps/v1 и т.д.), kubectl выбирает подходящую версию для ресурса
- k8s использует REST архитектуру и протокол OpenAPI. Другими словами, API у кубера не монолитное и имеет много отдельных ресурсов. Собственно, выбирается нужный. Все ресурсы можно посмотреть командой
- Аутентификация пользователя/клиента:
- Для аутентификации нужен
kubeconfig - Аутентифицироваться в k8s можно по сертификату, Bearer токену, имени пользователя/паролю, через OpenID токен
- Для аутентификации нужен
2. HTTP запрос отправляется на Kube-apiserver
Kube-apiserver - это главный интерфейс, через который клиенты и элементы контролплейна рулят нашим кластером.
- Аутентификация:
Kube-apiserverдолжен убедиться, что запрашивающий является тем, за кого себя выдает. В зависимости от опциий запуска будет проверка что HTTP-запрос закодирован ключом TLS, подписанным корневым сертификатом CA, или проверит токен, или проверит что учетные данные HTTP-запроса соответствуют его собственному локальному состоянию.
- Авторизация:
- Например, через
RBACроль, настроенную админом.
- Например, через
Admission control: (контроллеры допуска (последний бастион контроля перед сохранением объекта вetcd)):они бывают всякими, например, resource management, security, defaulting, and referential consistency examples of admission controllers resource management.
InitialResourcesустанавливает ограничения ресурсов по умолчанию для ресурсов контейнера на основе прошлого использования;LimitRangerнакладывает верхние границы на определенные ресурсы (не более 2 ГБ памяти, по умолчанию 512 МБ);ResourceQuotaподсчитывает и запрещает количество объектов (pods, rc, балансировщики нагрузки сервисов) или общее количество потребляемых ресурсов (cpu, память, диск) в пространстве имен.
3. После создания объекта, Kubernetes будет следить за существованием объекта
ETCD:
Здесь, наконец,kube-apiserverдесериализует HTTP-запрос (inverse process of kubectl's generators) и записывает наши объекты в БД, такие как:- Deployment
- Replicaset
- Pod
Initializers(инициализаторы): Ну на собесах фиг с ними
-
Kube-controller-manager:
Контроллеры- это куча скриптов (участков кода) в одном бинарнике, которые асинхронно следят только за своей зоной ответственности.Deployments controllercоздаетReplicaSet, присоединяет к немуlabel selectorи дает номер ревизии.ReplicaSets controllerпроверяет состояние новогоReplicaSet, если видит несоответствие между тем, что есть, и тем, что требуется, пытается наплодитьPods, принадлежащихReplicaSet.При подъеме происходит магия
SlowStartInitialBatchSize. То есть, при каждом успешном создании пода, новых подов в следующей итерации поднимается в 2 раза больше. Это сделано, чтобы не упоротьKubeApiserver, если что-то пойдет не так.
-
InformersиWatch:
Informers — это высокоуровневый паттерн в Kubernetes для отслеживания изменений объектов. Компоненты (контроллеры, scheduler) подписываются через Watch API на изменения интересующих их объектов. Механизм List-Watch работает так: при старте выкачивается полное состояние ресурсов (List), а затем поддерживается актуальный локальный кэш через поток событий об изменениях (Watch). Это позволяет компонентам реагировать на события в режиме реального времени, потреблять меньше ресурсов и снижать нагрузку на Control Plane. -
Scheduler:- Слушает события (через Watch) о подах, у которых не установлен
nodeName, и выполняет scheduling в соответствии с запрошенными ресурсами, constraints и policies. - После выбора подходящей ноды устанавливает
nodeNameв spec пода через binding API.
- Слушает события (через Watch) о подах, у которых не установлен
-
Kubelet:- Это агент, запущенный на каждой воркер ноде кластера k8s и отвечает за управление жизненным циклом подов. Подписывается через Watch на поды, у которых
nodeNameсоответствует этой ноде. - Получив информацию о новом поде, он обрабатывает всю логику перевода между абстракцией "Pod" и ее строительными блоками (контейнерами).
- Он также обрабатывает всю сопутствующую логику, связанную с:
- монтированием томов
- протоколированием контейнеров
- сборкой мусора и многими другими важными вещами
- передачей
podSpecвCRI
- Регулярно сообщает статус подов обратно в
kube-apiserver
- Это агент, запущенный на каждой воркер ноде кластера k8s и отвечает за управление жизненным циклом подов. Подписывается через Watch на поды, у которых
-
CRI(Docker, containerd (protocol buffers (it's like a faster JSON) and a gRPC API)):- Создается
Sandbox(песочница) включает в себя созданиеpauseконтейнера. pauseконтейнер служит в качестве родительского для всех остальных контейнеров вPod, поскольку в нем размещается множество ресурсов уровняPod, которые в конечном итоге будут использовать контейнеры рабочей нагрузки.
Этиресурсыпредставляют собой пространства именLinux(IPC, сеть, PID).
- Создается
-
CNI:bridge/ipvlan/macvlan/sr-iov
тут прокидывается виртуальный линк в
Podхоста,IPцепляется заpauseконтейнер, чтоб не потеряться при рестартах контейнера из-за ошибок, например. -
Inter-host networking:overlay networking(Flannel, например)
Для этого обычно используется концепция оверлейной сети, которая представляет собой способ динамической синхронизации маршрутов между несколькими узлами. Одним из популярных поставщиков оверлейных сетей являетсяFlannel. Когда он установлен, его основной задачей является обеспечение сетиIPv4третьего уровня между несколькими узлами в кластере.Flannelне управляет тем, как контейнеры подключаются к узлу (это задачаCNI remember), а скорее тем, как трафик передается между узлами. Для этого он выбирает подсеть для узла и регистрирует ее вetcd. Затем он хранит локальное представление маршрутов кластера и инкапсулирует исходящие пакеты в UDP-датаграммы, гарантируя, что они дойдут до нужного узла.
Для получения дополнительной информации ознакомьтесь с документацией CoreOS.
-
Container startup:- Pull the image
- Create the container via CRI
- Create network via CNI (всякие правила iptables)
- post-start lifecycle хуки
- Рединес пробы
- Контейнер шуршит
Можно посмотреть вот это видео
С чего бы начать? В Кубере есть такой прикол как эфемерность подов. Поды могут умирать и рождаться как им вздумается, а IP-адреса при этом могут меняться как погода в Питере.
А еще в среднестатистическом кластере Кубера существует сразу 3 разновидности сети. Весело, даже сеть на микросервисы поделили.
Разберемся с каждой из них:
-
Node Network - грубо говоря, это сеть железок - самих хостов, которые мы называем worker-нодами. Внутри этой сети ноды общаются друг с другом, а также с мастерами. Обычная серверная связность (
L2/L3уровни OSI). Эта сеть ничего не знает про поды. -
CNI — Container Network Interface. Короче, куберовцы молодцы, съехали с темы администрирования сети и отдали ее, грубо говоря, на аутсорс, предоставив интерфейс - коннектор до плагинов.
Самый популярный:
- Calico - Работает на уровне L3, поддерживает NetworkPolicy, использует BGP для маршрутизации между нодами.
Но есть и другие: (Cilium, Flannel и т.д.)
- Flannel - нет NetworkPolicy - в прод не берем, только дома поиграться. Работает на оверлейных сетях (VXLAN - упаковывает пакет пода в пакет ноды), простая настройка.
- Cilium - киллер фича - использует eBPF, поддерживает mTLS, все хорошо с NetworkPolicy, работает на уровне L3
Как СNI-плагин работает при старте пода:
-
Pod Scheduling
-
Kubelet получает из API детали запускаемого пода и обращаеся в CRI для создания пода.
-
CRIв свою очередь:- Создает сетевой
namespace. - Создает
pauseконтейнер. - Вызвает
CNIplugin.
- Создает сетевой
-
CNIplugin (например, Calico):- Создает виртуальный Ethernet интерфейс (
veth pair) для пода. - Подключает один конец
vethк поду, а другой кbridgeноды. - Назначает IP-адрес поду из пула
CIDRноды. - Прописывает
маршруты. - Прописывает правила
iptables.
- Создает виртуальный Ethernet интерфейс (
-
Services
Давай посмотрим, что происходит, когда pod1 хочет отправить пакет pod2, и оба находятся на одной ноде:
- Пакет выходит из
pod1через его виртуальный интерфейсeth0и попадает вroot netnsузла через вещь под названиемveth(вроде виртуального сетевого кабеля) - Пакет приходит в
cbr0— это сетевой мост на ноде (container bridge). Это такой коммутатор в ядре ОС cbr0говорит: "Хм, пакет для IP 10.x.x.x. У кого такой IP?" и отправляет ARP-запрос (это как узнать, кто сидит за этим IP)- Виртуальный кабель пода
pod2(vethyyy) отвечает: "Это я! Это мой IP!" bridgeузнаёт, через какой виртуальный кабель лежит путь до пода, и отправляет пакет туда- Пакет проходит через этот кабель и попадает в netns
pod2
Просто, правда? Это работает на уровне L2 (линк-уровня).
А вот тут становится сложнее. Поды должны быть доступны со всех узлов, и каждому узлу нужен способ узнать, как до них добраться.
Вот как Kubernetes это решает:
Каждому узлу назначается свой блок CIDR (через Calico) — это диапазон IP-адресов. Например:
- Нода 1 получает 10.244.0.0/24
- Нода 2 получает 10.244.1.0/24
Так что поды на разных нодах никогда не конфликтуют по IP-адресам.
Как трафик передаётся между нодами?
Kubernetes не диктует, как это должно работать. Можно использовать несколько подходов:
- L3 маршрутизация (Calico) — просто добавляются маршруты в таблицу маршрутизации. Например: "Трафик для 10.244.1.0/24 идёт через 192.168.1.10 (IP узла 2)". Обычно облачные провайдеры используют именно этот способ
- Оверлейные сети (вроде Flannel) — пакеты инкапсулируются. Например, пакет от пода на
ноде 1к поду наноде 2оборачивается в ещё один IP-пакет и только потом отправляется наузел 2, а там распаковывается и доставляется в нужный под. - L2 подходы (вроде Weave) — используется ARP между узлами
Смысл такой: Kubernetes говорит "Поды должны видеть друг друга", а как это реализовать — дело CNI-плагина (Flannel, Calico, Weave и т.д.)
Так, хорошо, но IP-адреса подов постоянно меняются — поды создаются и удаляются. Как приложениям обращаться друг к другу?
Для этого есть Services — это виртуальный IP (VIP), который не меняется и автоматически маршрутизирует трафик к нужным подам.
Типы Services:
-
ClusterIP(по умолчанию): Service получает виртуальный IP (VIP), доступный только внутри кластера. Это как внутренний адрес склада, который никому не нужен снаружи.kube-proxyна каждой ноде обновляет правилаiptables, чтобы трафик к VIP адресам перенаправлялся на реальные IP подов. -
NodePort: Сервис доступен на одном и том же порту на каждой ноде кластера. Например, если ты настроил NodePort на порт 30000, то можешь обратиться на192.168.1.10:30000или192.168.1.11:30000, и трафик попадёт на поды сервиса. Под капотом Kubernetes всё равно создаёт ClusterIP, но дополнительно прокидывает трафик на узлах. -
LoadBalancer: Если ты в облаке (AWS, GCP и т.д.), этот тип просит облачный провайдер создать балансировщик нагрузки и направить трафик на твой сервис. Пользователь обращается на внешний IP балансера, и всё работает волшебно. -
ExternalName: Это простоaliasдля внешнего сервиса. Например, ты можешь сказать, что сервисmy-dbна самом деле этоmy-db.example.com. Kubernetes просто вернётCNAMEзапись, никакого проксирования.
Каждый Service и Pod получают имя во внутренней DNS системе Kubernetes. Обычно это выглядит так:
my-service.default.svc.cluster.localдля сервисаmy-serviceв namespace'еdefault. Можешь просто писатьmy-service, и если под в том же namespace'е, система поймёт о ком речь
DNS-сервер в кластере (обычно CoreDNS) следит за всеми Services и обновляет DNS-записи. Это сделано для того, чтобы приложения могли обращаться друг к другу по имени, а не по IP.
На каждой ноде работает kube-proxy. Его задача — следить за Services и обновлять правила маршрутизации в ядре ОС (обычно через iptables). Когда ты создаёшь Service, kube-proxy добавляет правило: "Если видишь трафик на VIP этого сервиса, отправь его на IP одного из его подов" (причём выбирает под по round-robin). Это работает очень быстро, потому что всё решается в ядре ОС.
Network Policies в Kubernetes — это объект, который определяет правила управления сетевым трафиком между подами (Pods) и сетевыми сущностями внутри кластера. Они используются для ограничения и контроля входящего (ingress) и исходящего (egress) трафика между подами на уровне сетевого взаимодействия.
Сетевые политики позволяют улучшить безопасность, изолируя поды и управляя их сетевой доступностью.
Основные задачи Network Policies
-
Изоляция сетевого трафика:
По умолчанию все поды могут взаимодействовать друг с другом без ограничений. Network Policies позволяют контролировать, какие поды могут обмениваться трафиком. -
Управление входящим трафиком (Ingress):
Определяет, кто может отправлять сетевые запросы в под. -
Управление исходящим трафиком (Egress):
Определяет, куда под может отправлять сетевые запросы.
Как работают Network Policies?
- Network Policies работают на уровне CNI (Container Network Interface) плагинов, таких как:
- Calico
- Weave
- Cilium
Важно: Чтобы Network Policies работали, CNI-плагин должен поддерживать их реализацию.
-
По умолчанию поды открыты для всех соединений, пока не применена хотя бы одна Network Policy.
-
Правила политики описываются на основе меток (Labels), которые задают:
- Какие поды участвуют в политике.
- Какой трафик разрешён или запрещён.
Особенности работы
- Если политика определена для Ingress, то весь входящий трафик блокируется, кроме явно разрешённого.
- Если политика определена для Egress, то весь исходящий трафик блокируется, кроме явно разрешённого.
- Политики не имеют обратной силы:
- Если под не попадает в
podSelector, политика на него не распространяется.
- Если под не попадает в
- Network Policies не блокируют трафик, идущий через Service type
NodePortилиLoadBalancer, а только межподовый трафик.
Преимущества использования Network Policies
-
Безопасность:
- Позволяют изолировать поды и ограничивать сетевые взаимодействия.
- Защищают от несанкционированного доступа.
-
Гибкость:
- Позволяют задавать сложные правила маршрутизации трафика.
-
Масштабируемость:
- Использование меток (labels) упрощает управление политиками при большом количестве подов.
-
Соответствие стандартам:
- Network Policies помогают соответствовать требованиям безопасности, таким как PCI DSS или GDPR.
Ограничения Network Policies
-
Только L3/L4:
Network Policies работают на сетевом уровне (IP и порты), но не на уровне приложений (L7), например, HTTP. -
Зависимость от CNI-плагина:
Network Policies не работают с плагинами, которые их не поддерживают (например, Flannel). -
Нет deny-правил:
Kubernetes Network Policies определяют только разрешающие (allow) правила. Блокировка трафика происходит автоматически, если явно не разрешено.
-
StatefulSets: Штука, описывающая где будут крутитьсяPodsс данными. StatefulSets -
Daemonset: Гарантирует, что все (или некоторые по .spec.template.spec.{nodeSelector или affinity}) узлы запускают копиюPod- Примеры:
- node-exporter (Prometheus)
- Datadog Agent
- Zabbix agent
- Telegraf
- CNI / сетевые компоненты
- Calico node
- NVIDIA device plugin
- Примеры:
-
Operator: (профессия) — группа профессий по управлению работой оборудования (установок) различного вида и назначения. Шутка.Операторы- это программные расширенияKubernetes, которые используют пользовательские ресурсы для управления приложениями и их компонентами.
К числу задач, которые можно автоматизировать с помощью оператора, относятся:- развертывание приложения по требованию;
- создание и восстановление резервных копий состояния приложения;
- обработка обновлений кода приложения вместе с сопутствующими изменениями, такими как схемы баз данных или дополнительные параметры конфигурации;
- публикация службы для приложений, которые не поддерживают API Kubernetes, чтобы обнаружить их;
- имитация сбоя всего кластера или его части для проверки его устойчивости;
- выбор лидера для распределенного приложения без внутреннего участника.
Назначение подов на ноды происходит по одному из следующих методов:
- nodeSelector: выбор ноды по node labels. Kubernetes будет планировать размещение бода только на тех узлах, которые имеют все указанные вами метки.
- Affinity and anti-affinity: можно указать, что правило является мягким или предпочтительным, чтобы планировщик все равно запланировал под, даже если он не может найти подходящий узел, например.
- nodeName
- Pod topology spread constraints: ограничения на распространение топологии Подов
livenessProbe: Показывает, запущен ли контейнер;readinessProbe: Указывает, готов ли контейнер отвечать на запросы;startupProbe: Указывает, запущено ли приложение внутри контейнера.
Нужно выбирать или
livenessProbe+readinessProbe, илиstartupProbe. Если с пробами что-то не так,kubeletсмотрит вrestartPolicy, а они бывают трех видов -Always, OnFailure, and Never
Ладно, представь ситуацию: тебе нужно что-то подготовить перед тем, как запустить основное приложение. Например, сгенерировать конфиг, скачать данные или проверить что-то. Для этого есть init-контейнеры — они запускаются ДО основного контейнера и могут создавать/подготавливать файлы.
Вот как это работает:
- Init-контейнер запускается первым — выполняет свою задачу (например, создаёт файл
/data/config.conf) - Init-контейнер завершается — его работа закончена, он умирает
- Основной контейнер запускается — видит уже готовые файлы, которые создал init-контейнер
- Приложение работает — использует файлы из общего тома
Важно: Если init-контейнер упадёт с ошибкой, основной контейнер вообще не запустится. Kubernetes перезапустит весь под.
Для общего использования между init и основным контейнером подходят emptyDir (самый частый случай) и другие:
-
emptyDir(самый частый) — пустая директория, которая существует только пока живёт под. Init создаёт там файлы, основной читает. Идеально!volumes: - name: shared-data emptyDir: {}
-
configMap— если нужно смонтировать конфиг из ConfigMap. Init может его читать и дополнять. -
downwardAPI— для метаинформации пода (имя, namespace, labels). Init может записать эту информацию в файл. -
secret— если init нужно прочитать секрет и обработать его. -
persistentVolumeClaim— если данные нужно сохранить между перезагрузками пода.
Когда использовать init-контейнеры:
- Генерация конфигов — например, создать nginx.conf на основе переменных окружения
- Загрузка данных — скачать нужные файлы из S3 или другого хранилища
- Проверка зависимостей — убедиться, что БД доступна, прежде чем запустить приложение
- Миграции БД — запустить миграции перед стартом приложения
- Инициализация — распаковать архив, создать нужные директории, установить разрешения
Пример:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
# Init-контейнер подготавливает данные
initContainers:
- name: init-config
image: busybox
command:
- sh
- -c
- |
echo "Generated config" > /data/config.txt
echo "Server started at $(date)" >> /data/config.txt
volumeMounts:
- name: shared-data
mountPath: /data
# Основной контейнер читает готовые файлы
containers:
- name: app
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
# Один том на всех
volumes:
- name: shared-data
emptyDir: {}В этом примере init-контейнер создаёт файлы в /data, а nginx их видит как готовые к использованию.
Ответ: По протоколу RAFT
Основной механизм — Lease API:
* Kubernetes API предоставляет объект типа Lease (часть Coordination API).
* Кандидаты на лидерство периодически пытаются обновить объект Lease в etcd, который служит индикатором текущего лидера.
* Узел, который успешно обновляет Lease, становится лидером.
Ответ: OpenAPI (REST) HTTP/HTTPS
Обычно существует 2 поля объекта: `spec` и `status`.
В поле `spec` указывается требуемое состояние (описание характеристик, которые должны быть у объекта).
`status` описывает текущее состояние объекта
ой как понятно стало
garbage collector вычищает по полю ownerReferences
- нужно выключить 2 из трех инстансов, на оставшемся можно подложить последний хороший бэкап (забэкапив текущие данные, если они покрашились) и запуститься с ключем `--force-new-cluster`
- [ETCD Disaster recovery](https://etcd.io/docs/v3.3/op-guide/recovery/)
> Сжатие + дефрагментация + правильный мониторинг — основа обслуживания вашего кластера etcd.
- Ответ:
merge- оставляет историю (больше коммитов, после merge - новый коммит слияния в основной ветке, другая продолжает существовать и не зависит от основной)
rebase- переписывает историю (меньше коммитов, после rebase последний коммит перезаписывается и остаётся основным. Ветка, которая была родительской - удаляется)
-
Ответ:
Теорема cap: эвристическое утверждение о том, что в любой реализации распределённых вычислений возможно обеспечить не более двух из трёх следующих свойств:согласованность данных (англ. consistency)— во всех вычислительных узлах в один момент времени данные не противоречат друг другу;доступность (англ. availability)— любой запрос к распределённой системе завершается откликом, однако без гарантии, что ответы всех узлов системы совпадают;устойчивость к разделению (англ. partition tolerance)— расщепление распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций.
У вас есть ноутбук с линуксом, например убунтой, на рабочем столе запущен терминал, в нем вы запускаете curl https://example.com/расскажите, что произойдет?
Прострой отказоустойчивый сервис сокращения ссылок, например.
Отказоустойчивый, распределенный сервис DNS, например, на 5 зон
-
Ответ:
Prometheus хранит данные в своей локальной Time Series Database (TSDB) на диске.
- По умолчанию — в директории
./data(относительно рабочей папки Prometheus). - В production — обычно
/var/lib/prometheusили/var/lib/prometheus/data(зависит от дистрибутива/установки). - Указывается флагом
--storage.tsdb.path=/path/to/data.
Структура внутри:
- WAL (write-ahead log) — для недавних данных и восстановления после краша
- Блоки (chunks_head, блоки по 2 часа → компактируются в большие) — основные данные time series
- Индексы, метаданные.
Данные хранятся локально на файловой системе (рекомендуется локальный диск, не NFS для надёжности).
Для долгосрочного хранения → remote write в Thanos, Cortex, VictoriaMetrics и т.д. (локально держат только недавние данные, retention обычно 15 дней–несколько недель). - По умолчанию — в директории
Ansible — это инструмент для автоматизации настройки серверов: устанавливать пакеты, править конфиги, запускать команды без ручного SSH.
Проще: Ansible — это “настроить много серверов одной командой”.
Обычно проект выглядит так:
ansible/
├── inventory/ # Список серверов
│ └── hosts.yml
├── playbook.yml # Что делать (основной сценарий)
├── roles/ # Готовые роли
│ └── nginx/
│ ├── tasks/ # Что выполнять
│ │ └── main.yml
│ ├── handlers/ # Перезапуск сервисов
│ │ └── main.yml
│ ├── templates/# Jinja2 шаблоны
│ ├── files/ # Файлы для копирования
│ └── vars/ # Переменные
- inventory — где сервера
- playbook — что делать
- roles — переиспользуемая логика
Inventory — файл конфигурации, где определяется информация о хосте. Хранится в папке /etc/ansible/hosts
Плейбуки - в плейбуках Ansible мы определяем, как применять политики, объявлять конфигурации, оркестрировать действия и запускать задачи на серверах — синхронно или асинхронно. Плейбук может включать один play или несколько.
Play — компонент плейбука, который состоит из группы задач, выполняемых на определённых хостах. Каждый play должен указывать хост или группу хостов. Пример:
-hosts: all # здесь мы указываем все хосты. Задачи (task) — это отдельные действия, которые выполняются плейбуками. Например:
- name: Install Apache httpd # Определение задачи может содержать модули,
например yum, git, service и copy.Роли в Ansible назначаются группе хостов и помогают организовать задачи по автоматизации. Мы можем создать несколько ролей и назначить их группе задач. Допустим, роль webserver можно использовать для установки Apache и Nginx на указанной группе серверов.
Обработчики (handler) похожи на задачи, но выполняются только при вызове из события. Например, обработчик может запустить сервис httpd после того, как его установила задача. Обработчик вызывается директивой notify. Важно! Имя директивы notify и обработчика должны совпадать.
Шаблоны Файлы шаблонов (template) основаны на шаблонизаторе Python Jinja2 и имеют расширение .j2. В файл шаблона при желании можно поместить содержимое файла index.html, но эффективнее всего использовать в них переменные и факты.
Переменные В плейбуки можно включать собственные переменные. Есть пять способов определить переменную:
- В play, в атрибуте vars_files:
vars_files:
- "/path/to/var/file"- В /vars/apache-install.yml
- В командной строке:
# ansible-playbook apache-install.yml -e "http-port=80"- В
playчерез vars:
vars: http_port: 80- В каталоге group_vars/
Приоритеты переменных https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html#understanding-variable-precedence
Модули в Ansible — это готовые действия, которые Ansible выполняет на серверах.
Проще: модуль = “что именно сделать” (установить пакет, скопировать файл, перезапустить сервис).
apt/dnf— установить пакетcopy— скопировать файлtemplate— развернуть шаблонservice/systemd— управлять сервисомfile— создать файл/директориюshell/command— выполнить команду
- name: Install nginx
apt:
name: nginx
state: presentЗдесь apt — модуль.
- Модули идемпотентны (повторный запуск безопасен)
- Работают через SSH
- Не нужно писать скрипты
- Возвращают structured output (ok / changed / failed)
- playbook — ❌
- role — ❌
- inventory — ❌
Terraform - Предназначен для инфры.
Ansible - Предназначен для приложений на инфре.
То есть, Terraform используется чтобы разворачивать инфраструктуру (виртуальные машины, сети, диски, и тп.).
Ansible предназначен для работы с существующими ресурсами, чтобы устанавливать и настраивать окружение (программы, операционные системы) на этих виртуалках.
Нюансы:
-
Terraform отслеживает состояние и делает инкрементные изменения, что особенно полезно при работе с облачной инфраструктурой.
-
Ansible не управляет состоянием, и каждая задача считается независимой.
- Нужно понимать что это инструменты. И в ряде случаев с помощью Ansible равзвернуть инфраструктуру всё таки можно.
- Как и для Терраформа написать провайдер, который будет делать что-то свое. Вопрос лишь в применимости инструментов.
- Декларативный язык (HCL) – вы описываете, какой должна быть инфраструктура, а Terraform сам выполняет необходимые шаги.
- Поддержка множества облаков – AWS, Google Cloud, Azure, Kubernetes и даже локальная инфраструктура.
- Отслеживание состояния – Terraform хранит текущее состояние ресурсов и понимает, что нужно изменить.
- Масштабируемость – можно управлять как небольшими, так и крупными кластерами.
- Модули – позволяют переиспользовать код и упрощать управление инфраструктурой.
-
Пишем код Определяем ресурсы в файле
.tf, например:resource "aws_instance" "example" { ami = "ami-123456" instance_type = "t2.micro" }
-
Инициализируем проект
terraform init
-
Просматриваем план изменений
terraform plan
-
Применяем конфигурацию
terraform apply
-
Удаляем инфраструктуру при необходимости
terraform destroy
- Providers – плагины, которые позволяют работать с разными облачными сервисами.
- State (состояние) – Terraform хранит текущее состояние ресурсов в файле
terraform.tfstate. - Modules – повторно используемые блоки конфигурации.
- Variables – позволяют параметризовать конфигурацию.
- Outputs – используются для экспорта данных, например, IP-адресов.
-
Ответ:
Это основной строительный блок кода, который описывает объект в инфраструктуре. Каждый ресурс имеет свои аргументы, свои параметры, свою конфигурацию. Ресурс имеет какой-то уникальный идентификатор (ID, ARN и тд).
Виртуальная машина, сеть, диск, порт, балансировщик и тд.
Как реализовать принцип Don't Repeat Yourself при описании инфраструктуры с помощью IaC-инструментов (Terraform, Ansible, Helm)?
-
Ответ: В Terraform — модули, for_each, переменные + locals.
В Ansible — роли, include_tasks, vars_files и Jinja-шаблоны.
В Helm — _helpers.tpl, values.yaml + subcharts.Главное — выносить повторяющуюся логику в переиспользуемые блоки и параметризовать через переменные.
| Тип БД | В каких форматах хранят данные | Чем хороши (Плюсы) | Популярность | Особенности и ограничения | Сценарии использования в Highload / ML |
|---|---|---|---|---|---|
| Реляционные (RDBMS) PostgreSQL, MySQL, Oracle, MS SQL. | Строки (двумерные таблицы). Данные разбиты по колонкам с жестко заданной схемой типов (Schema-on-Write). | Строгое соблюдение ACID; поддержка сложных декларативных SQL-запросов и JOIN; гарантированная консистентность. Мощная аналитика. | Экстремально высокая. Почти каждый проект использует их как ядро. | Плохо масштабируются горизонтально; деградация производительности при обилии связей «многие-ко-многим» и терабайтных объемах. | Финансовые транзакции, биллинг, учетные записи пользователей, паттерн Transactional Outbox. |
| Документо-ориентированные MongoDB, Couchbase. | Иерархические документы. Текстовые или бинарные структуры данных: JSON, BSON, XML. | Schemaless (гибкая структура без жесткой схемы); высокая скорость записи; легкое горизонтальное масштабирование (sharding). | Очень высокая. Стандарт для быстрой разработки и работы с полуструктурированными данными. | Нет поддержки полноценных JOIN на уровне движка; избыточность (дублирование данных внутри документов); повышенный расход диска. | Каталоги товаров со сложным набором характеристик, хранение пользовательских профилей и сессий, CMS-системы. |
| Ключ-Значение (Key-Value) Redis, Memcached, Dragonfly | Ассоциативный массив. Простая пара: уникальный ключ (строка) и значение (строка, строка-бинарник, JSON, списки/хэши). | Экстремально низкий Latency (субмиллисекунды); огромный throughput (сотни тысяч RPS); работа целиком в оперативной памяти. | Высокая (как слой кэширования). Присутствует почти в любой highload-архитектуре. | Объем данных жестко ограничен размером RAM сервера; риск потери данных при перезапуске, если не настроен сброс на диск (RDB/AOF). | Кэширование ответов API, хранение сессий пользователей, распределенные блокировки (Mutex), rate-limiter'ы. |
| Колоночные (Wide-Column / OLAP) ClickHouse (лидер в РФ), Cassandra, ScyllaDB, Google Bigtable | По колонкам (столбцам). Физически данные из одной колонки пишутся на диск в один непрерывный блок. | Колоссальная скорость чтения отдельных колонок для агрегации; высокая степень сжатия данных (одинаковые типы сжимаются эффективнее). | Высокая в BigData/Аналитике. | Не подходят для OLTP (частых точечных обновлений/удалений одиночных строк); не поддерживают транзакции ACID. | ClickHouse: Аналитика логов, продуктовые метрики, аудит-логи. Cassandra: Таймлайны, история сообщений в чатах. |
| Векторные (Vector DB) Qdrant, Milvus, Pinecone, плагин pgvector | Многомерные числовые массивы. Векторы фиксированной длины (эмбеддинги), полученные из ML-моделей (например, [0.12, -0.43, ..., 0.89]). | Эффективный поиск ближайших соседей (ANN поиск); оптимизация математических операций сравнения векторов (косинусное расстояние). | Взрывной рост (благодаря LLM). Главный инфраструктурный тренд последних лет. | Высокая нагрузка на CPU/GPU при перестроении индексов (HNSW); требуют огромного объема RAM; точность поиска вероятностная. | RAG-системы (Retrieval-Augmented Generation), семантический поиск по картинкам/текстам, рекомендательные движки. |
| Временные ряды (Time-Series) VictoriaMetrics, InfluxDB, TimescaleDB | Пара: Время + Метрика. Массив точек, где ключевым индексом является временная метка (Timestamp), привязанная к набору тегов. | Оптимизированы под непрерывную запись метрик в хронологическом порядке; автоматическое удаление старых данных по политикам (TTL). | Высокая в DevOps и IoT. Инфраструктурный стандарт для сбора телеметрии. | Узкая специализация; низкая эффективность, если структура данных или метатеги постоянно меняются в реальном времени. | Мониторинг ИТ-инфраструктуры (сбор метрик с серверов, etcd и Kubernetes через Prometheus), финансовые тикеры, котировки акций. |
-
Ответ:
ACID — это набор свойств, обеспечивающих надежность транзакций в базах данных.
Каждая буква в аббревиатуре ACID обозначает одно из свойств:-
Atomicity (Атомарность):
- Транзакция выполняется полностью или не выполняется вовсе. Если одна часть транзакции не удалась, все изменения откатываются.
-
Consistency (Согласованность):
- После завершения транзакции база данных остается в согласованном состоянии, удовлетворяя всем правилам и ограничениям (например, уникальность ключей, внешние ключи).
-
Isolation (Изоляция):
- Одновременные транзакции не влияют друг на друга. Результат выполнения одной транзакции не виден другим до её завершения.
-
Durability (Долговечность):
- После успешного завершения транзакции изменения сохраняются в базе данных даже в случае сбоя системы.
-
-
Ответ:
OLTP (Online Transaction Processing) базы данных — БД, предназначенные для обработки большого количества транзакций в реальном времени. Используются там, где требуется высокая скорость операций ввода, обновления, удаления и чтения данных, таких как системы управления заказами, банковские системы, розничная торговля, системы бронирования и другие. Следуют ACID.
Основные характеристики OLTP-баз данных:
- Обработка транзакций в реальном времени с большой скоростью I/O:
* OLTP-базы обрабатывают транзакции быстро и с минимальной задержкой (например, покупка товара, перевод средств). Фигачат транзакции в миллисекундах (добавление, обновление или удаление данных). - Моделирование данных:
* OLTP использует нормализованную структуру данных, чтобы минимизировать избыточность и обеспечивать согласованность данных. - Поддержка большого числа пользователей:
* OLTP-системы часто рассчитаны на поддержку тысяч или миллионов пользователей, которые выполняют транзакции одновременно.
Примеры баз данных, используемых для OLTP:
- Реляционные базы данных:
- MySQL
- PostgreSQL
- Oracle Database
- Microsoft SQL Server
- NoSQL базы данных (для специфичных сценариев):
- MongoDB
- Cassandra
- Redis (в качестве высокопроизводительного кэша)
- Обработка транзакций в реальном времени с большой скоростью I/O:
- Основная база данных с синхронной репликацией (Master-Slave).
- Географически распределённые узлы для защиты от катастроф.
- Автоматическое переключение (failover) на резервный сервер.
- Резервное копирование с регулярной проверкой восстановления.
- Репликация - НЕ БЭКАП!
- Инструменты мониторинга и оповещения для быстрого реагирования. Мониторить следующие метрики:
- активные соединения (max_connections);
- использование ресурсов (Disk I/O, CPU, RAM);
- задержка репликации (в идеале 0 секунд);
- блокировки;
- ошибки транзакций;
- состояние бэкапов и их успешность.
- Primary и минимум одна синхронная реплика. Для синхронной реплики нужно включить WAL-журналы (Write-Ahead Logging - Все операции записываются последовательно в журнал транзакций перед их применением)
- Автоматический failover через Patroni или Pgpool-II. - Pgpool-II Позволяет распределять чтение на реплики. Patroni - самый популярный.
- DCS (Distributed Consensus Store): Etcd (или Consul) — распределенное хранилище состояния. Хранит информацию о том, кто сейчас Лидер (Primary), а кто Реплика. Защищает от проблемы Split-Brain (когда две нoды думают, что они главные)
- Балансировка и роутинг трафика: Haproxy + Keepalived (или встроенный в Kubernetes-сервисы механизм). На Haproxy вешаем VIP для прозрачного переключения клиентов - виртуальный IP, через Keepalived.
- Мониторинг и управление через Prometheus/Grafana.
- Резервные копии для защиты от потери данных. через pg_basebackup или pg_dump
-
Ответ:
Redis (Remote Dictionary Server) — это сверхбыстрая база данных с открытым исходным кодом, которая хранит данные в оперативной памяти и поддерживает множество типов данных. Она популярна как кэш, брокер сообщений или хранилище данных, требующих быстрого доступа.
ETL (Extract, Transform, Load — Извлечение, Трансформация, Загрузка) — это базовый трехэтапный процесс в инженерии данных, который собирает информацию из разных источников, приводит её в порядок и сохраняет в единое централизованное хранилище (Data Warehouse или Data Lake).Это «топливная система» для любой аналитики, отчетов и ИИ-моделей. Без ETL данные останутся разбросанными по разным базам в сыром, грязном и нечитаемом виде.
-
Extract (Извлечение)
Система подключается к множеству разрозненных источников и забирает из них новые или изменившиеся данные.
Откуда забирает:
Из баз данных продакшн-сайтов (PostgreSQL, MongoDB), логов серверов, CRM-систем (amoCRM, Salesforce), Google Таблиц, рекламных кабинетов или API-сервисов. -
Transform (Трансформация)
Самый сложный и важный этап. Сырые данные очищаются, пересобираются и приводятся к единому стандарту, чтобы их можно было анализировать вместе.
Очистка: Удаление дубликатов, исправление ошибок, обработка пустых значений (NULL).
Нормализация: Приведение к одному формату. Например, даты из разных систем (06/06/2026,2026-06-06,06-Июн-26) превращаются в единый стандарт2026-06-06. Валюты переводятся в одну базовую денежную единицу.
Агрегация и обогащение: Склеивание таблиц (JOIN) и подсчет промежуточных итогов, чтобы аналитикам не приходилось делать это вручную. -
Load (Загрузка)
Чистые отформатированные данные записываются в финальное распределенное хранилище.
Куда загружает:
В аналитические СУБД (ClickHouse, Snowflake, Greenplum) или объектные хранилища (MinIO, AWS S3). Отсюда данные забирают BI-системы (PowerBI, Tableau) для построения красивых графиков или Data Science модели для обучения.
Представьте сеть супермаркетов.
-
Extract: ETL-скрипт в полночь забирает данные о продажах: из базы данных кассовых аппаратов (там SQL), из мобильного приложения (там JSON файлы) и от службы доставки (там CSV файлы).
-
Transform: Скрипт видит, что один и тот же товар в кассах называется «Вода 0.5», а в приложении — «Вода минеральная без газа, 500мл». Он сопоставляет их по штрихкоду, убирает ошибочные тестовые транзакции и считает общую выручку за день.
-
Load: Готовая чистая таблица отправляется в ClickHouse бэкенда. Утром директор открывает ноутбук и видит точный график продаж по всей сети.
С появлением мощных распределенных хранилищ (о которых мы говорили в прошлом шаге) классический ETL часто уступает место подходу ELT (Extract, Load, Transform).
- Данные сначала извлекаются и сразу же загружаются в хранилище в сыром виде.
- Трансформация (Transform) происходит уже внутри самого хранилища силами его собственных вычислительных мощностей. Это быстрее и позволяет гибко менять логику очистки данных задним числом.
- Оркестраторы и движки: Apache Airflow, Prefect, Dagster (управляют запуском скриптов по расписанию).
- Трансформация кода: dbt (Data Build Tool) — стандарт для трансформации данных внутри баз с помощью SQL.
- Low-Code платформы: Apache NiFi, Airbyte, Talend.
ArgoCD (continuous delivery): декларативный инструмент для непрерывной доставки в Kubernetes по модели GitOps. Имеет красивый UI, поддерживает синхронизацию с репозиториями Git и автоматическое обновление ресурсов в кластере.
Terragrunt — это тонкая обертка (wrapper) для Terraform, которая решает его главные «боли» и помогает содержать код инфраструктуры в чистоте, особенно в больших проектах. Если Terraform — это кирпичи, то Terragrunt — это умная система логистики, которая следит, чтобы кирпичи лежали ровно и не дублировались.
Istio Service Mesh:
- Istio идет как Control Plane, он состоит из трёх компонентов - Pilot, Mixer и Citadel;
- Envoy как sidecar у подов (Data Plane)
> Istio перехватывает весь сетевой трафик и применяет к нему набор правил, вставляя в каждый pod умный прокси в виде sidecar-контейнера. Прокси, которые активируют все возможности, образуют собой Data Plane, и они могут динамически настраиваться с помощью Control Plane.
> На моей практике Nginx сайта перенаправлял запросы к одной из нескольких ферм Envoy, которая роутила запрос непосредственно в нужный kubernetes кластер.
ELK: (Elasticsearch, Logstash и Kibana): у нас ClickHouse, c kittenhouse - своей проксей + statsd
sr-iov: Single Root Input/Output Virtualization
Calico: сетевая штука, через CRD (Custom Resource Definition) поднимает networkpolicy, net
Consul: обеспечивает обнаружение сервисов, проверку работоспособности, балансировку нагрузки, граф сервисов, принудительное использование идентификационных данных с помощью TLS и управление конфигурацией распределенных сервисов. Вау.
Deckhouse kubernetes — это enterprise-платформа Kubernetes “под ключ” от компании Flant, ориентированная на эксплуатацию, безопасность и управляемые обновления.
Mesos: это централизованная отказоустойчивая система управления кластером. Она разработана для распределенных компьютерных сред c целью обеспечения изоляции ресурсов и удобного управления кластерами подчиненных узлов (mesos slaves). Это новый эффективный способ управления серверной инфраструктурой, но и, как любое техническое решение, не "серебряная пуля". Нормальные мальчики пользуют ванильный кубер :)
Apache Kafka статья:
- Событие или сообщение — данные, которые поступают из одного сервиса, хранятся на узлах Kafka и читаются другими сервисами. Сообщение состоит из:
- Key — опциональный ключ, нужен для распределения сообщений по кластеру.
- Value — массив байт, бизнес-данные.
- Timestamp — текущее системное время, устанавливается отправителем или кластером во время обработки.
- Headers — пользовательские атрибуты key-value, которые прикрепляют к сообщению.
RabbitMQ:
- Сообщение — это единица данных, которая передается между отправителем и получателем через брокер сообщений. Сообщение состоит из:
- Body — основное содержимое сообщения, может быть любым типом данных (текст, JSON, бинарные данные).
- Properties — метаданные сообщения, такие как заголовки, приоритет, время жизни и т.д.
- Routing Key — строка, которая используется для маршрутизации сообщения к соответствующему потребителю.
- Exchange — логический компонент, который принимает сообщения от отправителей и маршрутизирует их в очереди на основе правил маршрутизации.
Чаще всего Kafka сравнивают с RabbitMQ. Обе системы — брокеры сообщений. Главное отличие в модели доставки: Kafka добавляет сообщение в журнал, и консьюмер сам забирает информацию из топика; брокер RabbitMQ самостоятельно отправляет сообщения получателям — помещает событие в очередь и отслеживает его статус.
«Кролик» удаляет событие после доставки, «Кафка» хранит до запланированной очистки журнала. Таким образом, брокер Apache используется как источник истории изменений.
Разработчики RabbitMQ создали системы управления потоком сообщений: мониторинг получения, маршрутизация и шаблоны доставки. Подобное гибкое управление подойдет для высокоскоростного обмена сообщениями между несколькими сервисами. Минус такого подхода в снижении производительности при высокой нагрузке.
Главный вывод — для сбора и агрегации событий из большого количества источников, логов и метрик больше подойдет Apache Kafka.
Airflow — это платформа для создания, планирования и мониторинга рабочих процессов (workflow) в виде Directed Acyclic Graphs (DAGs). Она позволяет автоматизировать сложные задачи, такие как ETL-процессы, обработка данных и другие повторяющиеся операции. Airflow обеспечивает гибкость, масштабируемость и удобный интерфейс для управления задачами и их зависимостями.
- DAG (Directed Acyclic Graph) — это структура данных, которая представляет собой ориентированный ациклический граф. В контексте Airflow, DAG используется для определения рабочих процессов, где узлы представляют задачи, а ребра указывают на зависимости между ними. DAG гарантирует, что задачи выполняются в правильном порядке и предотвращает циклические зависимости.
- Operator — это абстрактный класс в Airflow, который представляет собой единицу работы. Он определяет, что должно быть выполнено, но не как. Существует множество встроенных операторов (например, BashOperator, PythonOperator), а также возможность создавать свои собственные операторы для выполнения специфичных задач.
- Планировщик (Scheduler) — это компонент Airflow, который отвечает за планирование и запуск задач в соответствии с определенными DAG. Он следит за зависимостями между задачами и запускает их, когда все условия выполнены.
Nexus: фреймворк - расширение классического скрама для крупных проектов с многокомандной разработкой.
ITIL методология: https://www.atlassian.com/ru/itsm/itil
ITSM методология Основная идея ITSM заключается в том, что ИТ нужно предоставлять как услугу.
Dependencies
lvm
jagger
open-api
gravitee
vmware - виртуализация, не интересно в эпоху контейнеров. Хотя... Есть люди, которые поднимают Kubernetes в виртуалках, наверно, надо изучить эти кейсы. Здесь может быть ваш MR :)
LeetCode - уровень easy https://leetcode.com/ - это для SRE в Rндекс и ТинькоFF. Кстати, они гоняют тупо по академическим знаниям, не спрашивая у любителей куберетиса ничего про кубернетис, отнимая тонны вашего времени на 4 этапа. Что сказать, Google Way...
штурвал
haiva
ipv6
git джит-компилятор
steal
dora
Безопасность:
dlp системы
RHEL
Пайпы







