- Сборка создаст новый слой поверх существующего;
- Старый image сохраняется, пока не удалён;
- Изменения можно сравнить, протестировать или запушить в репозиторий;
- При развертывании — будет использоваться обновлённая версия образа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
При работе с CI/CD (GitHub Actions, GitLab CI, Jenkins) часто нужно запускать пайплайн только при изменении определенных файлов. Это помогает оптимизировать сборку, экономить ресурсы и время.
В GitHub Actions можно указать файлы, изменения в которых запустят пайплайн.
name: Infra Pipeline
on:
push:
paths:
- 'infra/**'
- 'k8s/**'
pull_request:
paths:
- 'infra/**'
- 'k8s/**'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy Infrastructure
run: ./deploy.sh
В GitLab можно настроить запуск пайплайна по изменению файлов с помощью
only: changes. stages:
- deploy
terraform:
stage: deploy
noscript:
- terraform apply -auto-approve
only:
changes:
- terraform/**
В Jenkins Declarative Pipeline можно использовать
when { changes } для проверки измененных файлов. pipeline {
agent any
stages {
stage('Deploy Ansible') {
when { changes path: 'ansible/**' }
steps {
sh './deploy_ansible.sh'
}
}
stage('Deploy Helm') {
when { changes path: 'helm/**' }
steps {
sh './deploy_helm.sh'
}
}
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
- Pod — минимальная сущность, может содержать один или несколько контейнеров.
- ReplicaSet — управляет количеством pod'ов.
- Deployment — управляет ReplicaSet'ами, обновлениями и откатами.
- Service — обеспечивает доступ к pod'ам.
- Namespace — логическое разделение ресурсов.
- Node — физическая или виртуальная машина.
- Cluster — объединение всех вышеуказанных компонентов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
ClickHouse – это высокопроизводительная колоночная база данных для аналитики.
Она предназначена для быстрого выполнения аналитических запросов на больших объемах данных (миллиарды строк). Используется в BI-системах, логировании, мониторинге и обработке событий.
за счёт хранения данных по колонкам и сжатия.
работает на одной машине или в кластере.
работает с привычными SQL-запросами.
обработка миллионов событий в секунду.
использует Primary Key + MergeTree, что упрощает оптимизацию.
благодаря специальным алгоритмам хранения.
BI-системы (анализ продаж, маркетинга, поведения пользователей).
Агрегация данных по времени (финансы, реклама, ретеншн).
Хранение логов (NGINX, Kubernetes, Clickstream).
Аналитика событий в реальном времени.
Обработка телеметрии с датчиков.
Анализ поведения пользователей в приложениях.
CREATE TABLE visits (
user_id UInt32,
url String,
duration UInt32,
event_time DateTime
) ENGINE = MergeTree()
ORDER BY event_time;
INSERT INTO visits VALUES (1, 'https://example.com', 30, now());
SELECT url, AVG(duration)
FROM visits
GROUP BY url
ORDER BY AVG(duration) DESC;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ping не использует порты, так как работает на уровне ICMP, а не TCP или UDP.
ICMP — это протокол сетевого уровня, используемый для диагностики (например, ping, traceroute).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊5
Оптимизация Docker-имеджа (или другого контейнерного имеджа) необходима для уменьшения его размера, ускорения сборки, повышения безопасности и повышения производительности контейнеров.
Почему: Базовый образ сильно влияет на размер. Например,
alpine занимает ~5 МБ, в то время как ubuntu или debian могут превышать сотни мегабайт.Как: Замените базовый образ:
FROM alpine:latest
Почему: Временные файлы, кэш или артефакты сборки занимают место.
Как: Добавьте команды для очистки временных данных:
RUN apt-get update && apt-get install -y curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
Почему: Стадия сборки может содержать инструменты, которые не нужны в финальном образе.
Как
# Стадия сборки
FROM golang:1.20 as builder
WORKDIR /app
COPY . .
RUN go build -o app .
# Финальный образ
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/app .
CMD ["./app"]
Почему: Каждый
RUN, COPY, ADD создаёт новый слой. Слишком много слоёв увеличивают размер образа.Как: Объединяйте команды:
RUN apt-get update && apt-get install -y curl wget \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
Почему: Переменные окружения с паролями или токенами могут быть случайно унаследованы.
Как: Используйте Docker secrets или
.env-файлы и исключайте их из COPYENV APP_ENV=production
Почему: Частое скачивание зависимостей замедляет сборку.
Как: Переносите команды загрузки зависимостей ближе к началу:
COPY go.mod go.sum ./
RUN go mod download
Почему: Устаревшие или ненужные зависимости увеличивают размер и могут содержать уязвимости.
Как: Используйте сканеры вроде Trivy или Docker Scan для анализа.
trivy image myimage:latest
# 1. Используем минимальный базовый образ
FROM node:20-alpine as builder
# 2. Устанавливаем зависимости
WORKDIR /app
COPY package*.json ./
RUN npm install
# 3. Копируем код
COPY . .
# 4. Собираем проект
RUN npm run build
# Финальный минимальный образ
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Aurora поддерживает до 5 read-replicas в разных зонах/регионах с высокой доступностью и кросс-региональным фейловером.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Нет, нельзя изменить DNS у уже запущенного контейнера напрямую через CLI. Но есть обходные способы!
Самый надежный способ — перезапустить контейнер с нужными DNS-серверами
docker run --dns 8.8.8.8 --dns 8.8.4.4 -d my_container
Или задать DNS через
docker network docker network create mynet --dns=1.1.1.1
docker run --net=mynet -d my_container
Можно изменить DNS вручную внутри работающего контейнера
docker exec -it my_container sh
echo "nameserver 1.1.1.1" > /etc/resolv.conf
Можно подключить контейнер к другой сети с нужными DNS:
docker network create mynewnet --dns=8.8.8.8
docker network connect mynewnet my_container
Если контейнер использует сеть хоста (
--network host), можно поменять DNS на хосте: resolvectl dns eth0 8.8.8.8
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
- Producer отправляет сообщение в топик, который разбит на партиции.
- Kafka записывает в лог-файл на диск.
- Consumer читает сообщения, обращаясь к нужной партиции.
- Каждый consumer хранит offset, Kafka ничего не удаляет, пока не истечёт retention.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы хотите развернуть приложение в Kubernetes без тонны ручных команд и нервов? Мечтаете о системе, где код сам «доставляется» в прод по принципу «закоммитил — заработало»?
Приглашаем вас на открытый урок в рамках курса «Инфраструктурная платформа на основе Kubernetes , где разберём»:
- как перестать вручную деплоить приложения;
- как добиться стабильного состояния кластера;
- как сделать процессы прозрачными и контролируемыми.
🗓 Когда: 23.12, в 20-00
Для кого: DevOps‑инженеры, разработчики, администраторы Kubernetes, все, кто хочет автоматизировать деплой.
На уроке вы узнаете:
После урока вы сможете:
- настроить базовый пайплайн GitOps с Flux;
- понять, как интегрировать Flux в существующую инфраструктуру;
- оценить, подходит ли GitOps для вашего проекта.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
В Kubernetes Control Plane — это набор компонентов, которые управляют всей кластерной системой. Он отвечает за контроль над состоянием кластера, управлением узлами (nodes) и развертыванием приложений.
Что делает: Это центральный компонент, предоставляющий API для управления кластером.
Почему нужен: Все взаимодействия, включая добавление/удаление узлов, создание подов и настройку сетей, проходят через API-сервер.
Как работает:
Принимает запросы от пользователей,
kubectl, и других компонентов.Проверяет подлинность запросов и валидирует данные.
Передает команды другим компонентам через REST API.
Что делает: Это распределённое key-value хранилище, которое сохраняет все данные о состоянии кластера.
Почему нужен: Все данные о конфигурации, статусе и метаданных кластера сохраняются в etcd. Если etcd выходит из строя, кластер теряет свою управляемость.
Как работает:
Хранит информацию о подах, конфигурации сетей и статусе всех компонентов.
Поддерживает консенсус между узлами, обеспечивая надёжность данных.
Что делает: Назначает поды на доступные узлы.
Почему нужен: Без планировщика поды не смогут быть развернуты на узлах.
Как работает:
Считывает незапланированные поды из API-сервера.
Анализирует доступные узлы на основе их ресурсов (CPU, память и т.д.).
Назначает узел для каждого пода на основе алгоритмов (например, минимальная загрузка).
Что делает: Управляет контроллерами, которые следят за состоянием ресурсов в кластере.
Почему нужен: Контроллеры — это "надсмотрщики", которые автоматически исправляют отклонения от желаемого состояния.
Как работает:
Включает несколько встроенных контроллеров:
Node Controller: Следит за доступностью узлов.
Replication Controller: Поддерживает нужное количество реплик подов.
Endpoint Controller: Обновляет
Endpoints-объекты.Service Account Controller: Создает учетные записи для сервисов.
Что делает: Управляет интеграцией с облачными провайдерами (например, AWS, GCP).
Почему нужен: Позволяет использовать облачные функции, такие как балансировка нагрузки, управление дисками и маршрутизацией.
Как работает:
Отвечает за создание LoadBalancer.
Управляет постоянными томами (Persistent Volumes), связанными с облачными хранилищами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
- Пример: клиент шифрует данные публичным ключом сервера, а сервер расшифровывает их своим приватным.
Также используется в TLS-сертификатах, PGP, SSH.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В Kubernetes есть несколько механизмов, которые могут запретить или ограничить запуск подов на определенных нодах.
Taints – метки на нодах, запрещающие размещение подов, если у них нет соответствующего допуска (Toleration).
Используется для изоляции, приоритизации узлов или резервирования ресурсов.
kubectl taint nodes my-node key=value:NoSchedule
Разрешить конкретному поду запускаться на этой ноде
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
Запрещает запускаться на всех нодах, кроме указанных.
Используется для привязки подов к определенным серверам.
spec:
nodeSelector:
disktype: ssd
Позволяет задать гибкие условия (обязательные и предпочтительные).
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: region
operator: In
values:
- us-east-1
Запрещает запуск новых подов, если их уже запущено определенное количество.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-pdb
spec:
maxUnavailable: 3
selector:
matchLabels:
app: my-app
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
DNS (Domain Name System) преобразует читаемые доменные имена (например,
Процесс включает:
- запрос к локальному кешу;
- обращение к DNS-рекурсору;
- переход к корневым серверам, затем к серверам доменов верхнего уровня (TLD), затем к авторитетным серверам;
- возврат IP-адреса клиенту.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM