DevOps | Вопросы собесов
5.53K subscribers
35 photos
1.44K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Что такое squash в Docker?

squash — это процесс объединения всех слоёв Docker-образа в один. Это уменьшает количество слоёв, упрощает образ и может ускорить развертывание. Однако использование squash делает процесс сборки менее гибким из-за потери промежуточных слоёв.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Куда идет деплой из релизных веток?

Касается подходов к управлению релизами в системах контроля версий, таких как Git, и их интеграции с процессами CI/CD. Ответ зависит от структуры разработки и процесса релиза в конкретной команде или компании. Однако, в общем, деплой из релизных веток обычно идет на тестовые, стейджинговые или продакшн-окружения. Давайте разберем этот процесс подробнее.

🚩Что такое релизные ветки?

Это ветки, которые создаются на этапе, когда функционал и исправления, готовые к выпуску, отделяются от основной ветки разработки (например, main или develop). Они позволяют:
Заморозить текущий набор изменений для подготовки к релизу.
Отделить доработки и исправления релиза от активной разработки.
Упростить процесс тестирования и последующего деплоя.

🚩Куда обычно идет деплой из релизных веток?

🟠Тестовое окружение (QA environment)
На тестовое окружение деплой из релизной ветки осуществляется для прохождения проверок качества: Автоматизированное и ручное тестирование.
Проверка производительности, безопасности и других аспектов.
stages:
- test
deploy:
stage: test
script:
- echo "Deploying release branch to QA"
- ./deploy.sh qa
only:
- release/*


🟠Стейджинговое окружение (Staging)
После успешного прохождения тестов релизную ветку деплоят в стейджинг. Это окружение максимально похоже на продакшн и используется для финального тестирования: Проверка совместимости с продакшн-системами.
Демонстрация функционала заказчикам или заинтересованным сторонам.
stages:
- staging
deploy:
stage: staging
script:
- echo "Deploying release branch to Staging"
- ./deploy.sh staging
only:
- release/*


🟠Продакшн (Production)
После прохождения всех этапов тестирования изменения из релизной ветки деплоятся в продакшн: Обычно это делается автоматически после финального подтверждения.
В некоторых командах финальный мерж релизной ветки в main инициирует деплой.
stages:
- production
deploy:
stage: production
script:
- echo "Deploying release branch to Production"
- ./deploy.sh production
only:
- release/*


🚩Зачем это нужно?

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

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

1⃣Разработчик создает ветку release/1.0.0 от develop.
2⃣Выполняются тесты на QA окружении.
3⃣Исправляются баги в release/1.0.0, и изменения деплоятся на стейджинг.
4⃣После успешного тестирования ветка мержится в main, и начинается деплой в продакшн.

Ставь 👍 и забирай 📚 Базу знаний
🔥2
🤔 Сколько часов живёт один вал Prometheus CI/CD?

Файлы WAL (write-ahead log) в Prometheus обычно хранятся 2 часа по умолчанию, после чего происходит компрессия данных в блоки. Этот параметр можно настроить через флаг запуска --storage.tsdb.min-block-duration.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥4👍1
🤔 Что означают DNS records?

DNS Records – это записи, которые управляют маршрутизацией домена в интернете. Они определяют, куда направлять запросы, какие IP-адреса использовать и какие сервисы подключены к домену.

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

A-запись (IP-адрес домена)
example.com.   IN  A   192.168.1.1


CNAME-запись (псевдоним)
www.example.com.  IN  CNAME  example.com.


MX-запись (почтовый сервер)
example.com.  IN  MX  10 mail.example.com.


TXT-запись (SPF, верификация)
example.com.  IN  TXT  "v=spf1 include:_spf.google.com ~all"


Ставь 👍 и забирай 📚 Базу знаний
🤔 Как работает TCP?

TCP (Transmission Control Protocol) — это протокол надёжной передачи данных:
- устанавливает соединение (handshake);
- обеспечивает доставку, повторные отправки при потере;
- работает с потоками данных и контролем перегрузки;
- использует подтверждения (ACK) и номера последовательности.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Какие виды метрик в Prometheus знаешь?

В Prometheus есть 4 типа метрик, которые используются для мониторинга и сбора данных.

🚩Counter (Счетчик) – только увеличивается

Используется для подсчета событий, ошибок, запросов
Значение только увеличивается (нельзя уменьшить)
promql  
http_requests_total


Как вывести количество запросов за последние 5 минут
promql  
rate(http_requests_total[5m])


Пример экспозиции в приложении
go  
httpRequests := prometheus.NewCounter(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests",
})



🚩Gauge (Измеритель) – может расти и уменьшаться

Используется для измерения текущего состояния (температура, RAM, CPU)
Значение может расти и уменьшаться
promql  
node_memory_usage_bytes


Как вывести среднюю загрузку CPU за 5 минут
promql  
avg(node_cpu_seconds_total)



Пример экспозиции в коде
go  
cpuUsage := prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "cpu_usage_percentage",
Help: "Current CPU usage",
})



🚩Histogram (Гистограмма) – распределение значений

Используется для измерения длительности, размера запросов
Делит данные по диапазонам (buckets)
promql  
http_request_duration_seconds_bucket


Как вычислить среднее время отклика
promql  
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))


Пример в коде
go  
requestDuration := prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Histogram of response time for HTTP requests",
Buckets: prometheus.DefBuckets,
})



🚩Summary (Сводка) – квантильные метрики

Показывает среднее, медиану, квантильное распределение
Используется для измерения задержек, времени отклика
promql  
http_request_duration_seconds{quantile="0.99"}


Пример в коде:
go  
requestSummary := prometheus.NewSummary(
prometheus.SummaryOpts{
Name: "http_request_duration_seconds",
Help: "Summary of response time for HTTP requests",
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
})


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое OpsWorks?

AWS OpsWorks — это сервис управления конфигурациями, который:
- Поддерживает Chef и Puppet.
- Используется для автоматизации серверной инфраструктуры.
- Позволяет управлять слоями, версиями, скриптами и зависимостями.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как сделать rebase на main branch?

Выполнить rebase на main в Git означает "перенести" ваши изменения поверх актуального состояния основной ветки (main).

🟠Переключаемся на вашу текущую ветку
Допустим, вы работаете в ветке feature-branch:
git checkout feature-branch


🟠Выполняем rebase на `main`
Сначала убедимся, что main обновлена:
git checkout main
git pull origin main


Теперь выполняем сам rebase:
git checkout feature-branch
git rebase main


🟠Разрешение конфликтов (если есть)
Если у вас есть конфликты, Git остановит процесс и попросит их решить.
Откройте файлы с конфликтами, исправьте их.
Добавьте исправленные файлы:

   git add <файл>


Продолжите rebase:

   git rebase --continue


🟠Обновление удалённого репозитория
Если rebase прошёл успешно, вам нужно форсированно обновить удалённую ветку (так как история изменилась):
git push origin feature-branch --force


Ставь 👍 и забирай 📚 Базу знаний
🤔 На каком уровне работает ICMP?

ICMP работает на сетевом уровне (уровень 3 по модели OSI). Он используется для сервисных сообщений, таких как:
- "Хост недоступен"
- "Время вышло"
- "Сетевой недоступен"


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Что сделать если зависает ssh?

Если SSH завис, не стоит сразу закрывать терминал. Есть несколько причин и решений.

🚩Проверить, можно ли выйти без разрыва сессии
Если SSH завис, но сессия не разорвана, попробуйте выйти без закрытия терминала:
~.


Переключение в режим управления SSH
~Ctrl+Z


🚩Проверить соединение с сервером

Если SSH завис, причина может быть в разрыве соединения. Проверьте:

Работает ли пинг до сервера:
ping server_ip

🔹 Открыт ли SSH-порт (22):
nc -zv server_ip 22


🚩Перезапустить SSH-клиент

Если только один SSH-клиент завис, попробуйте:
pkill -9 ssh


или
killall -9 ssh


Затем переподключитесь
ssh user@server_ip


🚩Проверить SSH-сервер

Если сервер доступен, но SSH зависает, войдите через консоль или другой метод (например, VNC, IPMI).

Если SSH не отвечает, перезапустите его:
sudo systemctl restart ssh


или
service ssh restart


🚩Отключить TCP KeepAlive или изменить таймауты

Иногда SSH зависает из-за разрыва соединения на роутере или файрволе.

Добавьте в ~/.ssh/config на клиенте
Host *
ServerAliveInterval 60
ServerAliveCountMax 5


Или в /etc/ssh/sshd_config на сервере
ClientAliveInterval 60
ClientAliveCountMax 5


Затем перезапустите SSH
sudo systemctl restart ssh


🚩Убить зависшую SSH-сессию на сервере

Если осталось зависшее подключение, найдите его и завершите:
who  # Показывает активные пользователи
ps aux | grep ssh # Показывает процессы SSH
pkill -9 -u username # Завершает все сессии пользователя


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое сквош (squash)?

Squash — это процесс объединения нескольких коммитов в один перед слиянием ветки. Применяется для:
- очистки истории;
- упрощения отката;
- группировки связанных изменений;
- подготовки "чистого" pull request'а.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 В каких случаях используется multi stage?

Multi-stage (многоэтапная сборка) — это метод создания Docker-образов, позволяющий уменьшить их размер и повысить безопасность.

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

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

🚩Пример использования Multi-stage в Docker

Допустим, у нас есть приложение на Go. Мы сначала компилируем его в одном контейнере, а затем создаем минимальный образ для запуска.
# Этап 1: сборка
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Этап 2: минимальный образ для запуска
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]


🚩Использование в React / Angular / Vue

При сборке фронтенда мы можем сначала установить зависимости и собрать проект, а затем развернуть его на nginx.
# Этап 1: сборка приложения
FROM node:18 AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build

# Этап 2: деплой на nginx
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]


Ставь 👍 и забирай 📚 Базу знаний
💊1
🤔 Какие экзекьютеры использовали для GitLab CI?

Наиболее часто используемые:
- Docker Executor — для контейнеризированного выполнения
- Shell Executor — выполняет скрипты прямо в системе
- SSH Executor — запускает команды по SSH на удалённой машине
- Kubernetes Executor — для масштабируемого CI/CD в кластере
Docker — самый популярный благодаря изоляции и простоте настройки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое нормализация баз данных?

Нормализация баз данных - это процесс организации данных в базе данных для минимизации избыточности данных и обеспечения их целостности. Цель нормализации - структурировать таблицы таким образом, чтобы устранить аномалии обновления, вставки и удаления данных. Нормализация достигается путем разбиения больших таблиц на более мелкие, связанных между собой отношениями, что упрощает управление данными и делает их более логически связанными.

🚩Зачем нужна нормализация

🟠Устранение избыточности данных
Нормализация позволяет минимизировать дублирование данных, что экономит пространство и упрощает управление базой данных.
🟠Обеспечение целостности данных
Нормализация помогает поддерживать целостность данных, обеспечивая правильное и единообразное хранение данных.
🟠Упрощение структуры базы данных
Разделение данных на логические таблицы делает структуру базы данных более понятной и удобной для использования.
🟠Избежание аномалий данных
Нормализация предотвращает возникновение аномалий при обновлении, вставке и удалении данных.

🚩Основные формы нормализации

🟠Первая нормальная форма (1NF)
Удаление повторяющихся групп в таблице. Каждый столбец должен содержать только атомарные (неделимые) значения. Все записи в таблице должны быть уникальными.

🟠Вторая нормальная форма (2NF)
Таблица должна быть в 1NF. Удаление частичной функциональной зависимости: каждый неключевой атрибут должен быть полностью зависим от первичного ключа.

🟠Третья нормальная форма (3NF)
Таблица должна быть в 2NF. Удаление транзитивной зависимости: все неключевые атрибуты должны быть напрямую зависимы от первичного ключа, а не от других неключевых атрибутов.

🟠Бойс-Кодд нормальная форма (BCNF)
Усиление 3NF: каждая детерминанта должна быть кандидатом на ключ, что означает, что в любой нетривиальной функциональной зависимости X -> Y, X должно быть суперключом.

🟠Четвертая нормальная форма (4NF)
Таблица должна быть в BCNF. Устранение многозначных зависимостей: таблица не должна содержать многозначных зависимостей, когда один атрибут зависит от нескольких значений другого атрибута.

🟠Пятая нормальная форма (5NF)
Таблица должна быть в 4NF. Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась.

🚩Примеры применения нормализации

🟠Первая нормальная форма
Если у вас есть таблица с повторяющимися группами, такими как несколько телефонных номеров для одного клиента, вы создаете отдельную таблицу для телефонов и связываете ее с таблицей клиентов.

🟠Вторая нормальная форма
Если у вас есть таблица заказов с колонками "номер заказа", "название товара" и "цена товара", вы можете создать отдельные таблицы для заказов и товаров, чтобы цена товара зависела только от товара, а не от комбинации заказа и товара.

🟠Третья нормальная форма
Если у вас есть таблица сотрудников с колонками "идентификатор сотрудника", "название отдела" и "имя начальника отдела", вы можете создать отдельные таблицы для сотрудников и отделов, чтобы имя начальника отдела зависело только от отдела, а не от сотрудника.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Если переменная объявлена внутри функции, можно ли её использовать в другой функции?

Нет. Переменная, объявленная внутри функции, имеет локальную область видимости — она недоступна в других функциях.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Как сделать так чтобы клиенты отдавали метрики в Prometheus?

В Prometheus данные собираются по pull-модели – сервер сам запрашивает метрики у клиентов. Чтобы клиенты отдавали метрики, нужно:

1. Настроить приложение на экспонирование метрик в формате Prometheus.
2. Добавить Prometheus job для сбора этих метрик.
3. Опционально – использовать Pushgateway, если pull-модель не подходит.

🚩Экспонирование метрик в формате Prometheus

Если приложение написано на Go, Python, Java или Node.js. Prometheus предлагает официальные клиентские библиотеки:
Go: [prometheus/client_golang](https://github.com/prometheus/client_golang)
Python: [prometheus_client](https://github.com/prometheus/client_python)
Java: [simpleclient](https://github.com/prometheus/client_java)
Node.js: [prom-client](https://github.com/siimon/prom-client)
Пример для Python

1⃣Установим библиотеку
pip install prometheus_client


2⃣Добавим в код экспонирование метрик
from prometheus_client import start_http_server, Counter
import time

# Создаем счетчик запросов
REQUEST_COUNT = Counter('app_requests_total', 'Total requests')

def process_request():
REQUEST_COUNT.inc() # Увеличиваем счетчик
time.sleep(1) # Имитация обработки запроса

if __name__ == '__main__':
start_http_server(8000) # Открываем метрики на 8000 порту
while True:
process_request()


🚩Пример для Node.js

1⃣Установим библиотеку:
npm install prom-client express


2⃣Код сервера:
const express = require('express');
const client = require('prom-client');

const app = express();
const collectDefaultMetrics = client.collectDefaultMetrics;
collectDefaultMetrics();

const requestCounter = new client.Counter({
name: 'http_requests_total',
help: 'Total HTTP requests',
});

app.get('/', (req, res) => {
requestCounter.inc();
res.send('Hello, World!');
});

app.get('/metrics', (req, res) => {
res.set('Content-Type', client.register.contentType);
res.end(client.register.metrics());
});

app.listen(3000, () => {
console.log('Server running on port 3000');
});


🚩Настроить Prometheus для сбора метрик

Добавляем job в prometheus.yml
scrape_configs:
- job_name: 'my_app'
static_configs:
- targets: ['app_host:8000']


🚩Push-модель через Pushgateway (если нужно)

Если клиент не может сам отдавать метрики (например, это краткоживущий job), можно использовать Pushgateway.

Запускаем Pushgateway:
docker run -d -p 9091:9091 prom/pushgateway


Отправляем метрики через curl
echo "job_execution_time 5.3" | curl --data-binary @- http://localhost:9091/metrics/job/my_batch_job


Настраиваем Prometheus на сбор данных из Pushgateway
scrape_configs:
- job_name: 'pushgateway'
static_configs:
- targets: ['localhost:9091']


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое pv, pvc?

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

🚩Persistent Volume (PV)

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

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

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


🚩Persistent Volume Claim (PVC)

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

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

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


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

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

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

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

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

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


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Динамическая маршрутизация и разные протоколы динамической маршрутизации, ebgp ibgp, константы bgp. На чём сейчас принято строить bgp-пиринги?

🟠Динамическая маршрутизация
Динамическая маршрутизация – это механизм автоматического выбора маршрута на основе изменяющихся сетевых условий. В отличие от статической маршрутизации, она автоматически адаптируется к изменениям в сети.
Протоколы динамической маршрутизации делятся на:
Протоколы внутреннего шлюза (IGP – Interior Gateway Protocol)
RIP (Routing Information Protocol) – устаревший, работает на алгоритме дистанционно-векторного маршрутизации.
OSPF (Open Shortest Path First) – основан на SPF (Dijkstra) и работает по принципу линк-стейт.
IS-IS (Intermediate System to Intermediate System) – аналог OSPF, но чаще используется в провайдерских сетях.
Протоколы внешнего шлюза (EGP – Exterior Gateway Protocol)
BGP (Border Gateway Protocol) – основной протокол маршрутизации в интернете.

🟠BGP: Основной протокол глобальной маршрутизации
eBGP vs iBGP
BGP бывает двух типов:
eBGP (External BGP) – маршрутизация между автономными системами (AS). Используется для обмена маршрутами между разными организациями или провайдерами.
iBGP (Internal BGP) – работает внутри одной AS, передавая BGP-маршруты между роутерами этой сети.

🚩Константы BGP (Attributes)

BGP использует атрибуты маршрута для выбора наилучшего пути. Основные атрибуты:

🟠Local Preference
приоритетный маршрут внутри AS (чем выше, тем лучше).
🟠AS Path
список AS, через которые проходит маршрут (короче – лучше).
🟠MED (Multi-Exit Discriminator)
предпочтение одного из выходов из AS (меньше – лучше).
🟠Origin
источник маршрута (IGP < EGP < Incomplete).
🟠Community
метки маршрутов для упрощения политики маршрутизации.
🟠Weight (Cisco-only)
локальный параметр (чем больше, тем лучше).

🚩На чём сейчас строят BGP-пиринги?

BGP можно развернуть на разных платформах, включая аппаратные и программные решения:

🟠Оборудование (Аппаратные маршрутизаторы)
Cisco (IOS, IOS-XE, IOS-XR, NX-OS) – классика для крупных сетей.
Juniper (Junos OS) – мощное решение для дата-центров и операторов.
Arista (EOS) – высокопроизводительные маршрутизаторы для ЦОДов.
Huawei (VRP) – популярно в крупных корпоративных сетях.

🟠Программные решения (SOFT-router)
FRRouting (FRR) – open-source, поддерживает BGP, OSPF, IS-IS.
BIRD – лёгкий BGP-демон для Linux, используется в IX (Internet Exchange).
GoBGP – BGP-демон, написанный на Go.
VyOS – Linux-маршрутизатор с поддержкой BGP.
MikroTik (RouterOS) – бюджетное, но мощное решение.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Из чего состоит control plane?

В Kubernetes Control Plane — это набор компонентов, которые управляют всей кластерной системой. Он отвечает за контроль над состоянием кластера, управлением узлами (nodes) и развертыванием приложений.

🟠kube-apiserver
Что делает: Это центральный компонент, предоставляющий API для управления кластером.
Почему нужен: Все взаимодействия, включая добавление/удаление узлов, создание подов и настройку сетей, проходят через API-сервер.
Как работает:
Принимает запросы от пользователей, kubectl, и других компонентов.
Проверяет подлинность запросов и валидирует данные.
Передает команды другим компонентам через REST API.

🟠etcd
Что делает: Это распределённое key-value хранилище, которое сохраняет все данные о состоянии кластера.
Почему нужен: Все данные о конфигурации, статусе и метаданных кластера сохраняются в etcd. Если etcd выходит из строя, кластер теряет свою управляемость.
Как работает:
Хранит информацию о подах, конфигурации сетей и статусе всех компонентов.
Поддерживает консенсус между узлами, обеспечивая надёжность данных.

🟠kube-scheduler
Что делает: Назначает поды на доступные узлы.
Почему нужен: Без планировщика поды не смогут быть развернуты на узлах.
Как работает:
Считывает незапланированные поды из API-сервера.
Анализирует доступные узлы на основе их ресурсов (CPU, память и т.д.).
Назначает узел для каждого пода на основе алгоритмов (например, минимальная загрузка).

🟠kube-controller-manager
Что делает: Управляет контроллерами, которые следят за состоянием ресурсов в кластере.
Почему нужен: Контроллеры — это "надсмотрщики", которые автоматически исправляют отклонения от желаемого состояния.
Как работает:
Включает несколько встроенных контроллеров:
Node Controller: Следит за доступностью узлов.
Replication Controller: Поддерживает нужное количество реплик подов.
Endpoint Controller: Обновляет Endpoints-объекты.
Service Account Controller: Создает учетные записи для сервисов.

🟠cloud-controller-manager
Что делает: Управляет интеграцией с облачными провайдерами (например, AWS, GCP).
Почему нужен: Позволяет использовать облачные функции, такие как балансировка нагрузки, управление дисками и маршрутизацией.
Как работает:
Отвечает за создание LoadBalancer.
Управляет постоянными томами (Persistent Volumes), связанными с облачными хранилищами.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Как бы организовал хранение и доступ к секретам?

В DevOps и Kubernetes важно безопасно хранить секретные данные (пароли, API-ключи, токены). Нельзя хранить их в коде, в Git, в .env файлах без шифрования.

🚩HashiCorp Vault (лучший вариант для масштабных проектов)

Полностью управляемое решение для хранения и динамической ротации секретов.
Шифрование с поддержкой KMS.
API-доступ и интеграция с CI/CD.
Как получить секрет через CLI?
vault kv put secret/db password="SuperSecret123"
vault kv get secret/db


Как использовать в Jenkins?
withVault([vaultSecrets: [[path: 'secret/db', secretValues: [['envVar': 'DB_PASS', 'vaultKey': 'password']]]]]) {
sh 'echo $DB_PASS' # Переменная доступна только внутри блока
}


🚩Kubernetes Secrets (если приложение в K8s)

Интеграция с Kubernetes, управление через kubectl.
Доступ через переменные окружения или монтирование в файл.
Можно использовать Sealed Secrets или SOPS для шифрования.
Как создать секрет?
kubectl create secret generic db-secret --from-literal=password='SuperSecret123'


Как использовать в Deployment?
env:
- name: DB_PASS
valueFrom:
secretKeyRef:
name: db-secret
key: password


🚩AWS Secrets Manager / Azure Key Vault / GCP Secret Manager

Интеграция с облачными сервисами (IAM, Lambda, RDS).
Автоматическая ротация ключей.
Как получить секрет в AWS?
aws secretsmanager get-secret-value --secret-id my-secret


Как подключить к Kubernetes?
Используем External Secrets Operator:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
secretStoreRef:
name: aws-secrets
kind: SecretStore
target:
name: db-secret
data:
- secretKey: password
remoteRef:
key: my-db-password


🚩SOPS + GitOps (для хранения в Git, но зашифрованно)

Позволяет хранить секреты в Git без утечек.
Работает с KMS, PGP, age.
Как зашифровать секрет?
sops --encrypt --age YOUR_PUBLIC_KEY secrets.yaml > secrets.enc.yaml


Как расшифровать?
sops --decrypt secrets.enc.yaml


Ставь 👍 и забирай 📚 Базу знаний
🔥3💊1
🤔 Что используется внутри докер контейнера?

Внутри 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>


Ставь 👍 и забирай 📚 Базу знаний
👍1