Если в системе мониторинга или логах кластерный сервис (Cluster P) показывает значение
NaN (Not a Number), это означает, что данные недоступны или не определены. Метрика не обновляется из-за сбоя Prometheus, Zabbix или Grafana.
Датчики или агенты не отправляют данные.
Посмотреть логи агента
journalctl -u node_exporter --no-pager | tail -20
Проверить доступность сервиса
curl -s https://service-ip:port/metrics
Если метрика рассчитывается (
X / Y), но Y = 0, результат будет NaN. SQL-запрос возвращает пустой результат. Если используется PromQL, попробуйте запросить сырые данные:
rate(http_requests_total[5m])
Проверить SQL-запрос, если данные идут из базы:
SELECT AVG(value) FROM metrics WHERE time > now() - interval '1 hour';
Один или несколько узлов в кластере недоступны. DNS или балансировщик не может найти сервис.
Посмотреть статус узлов:
kubectl get nodes
Проверить доступность сервиса в кластере:
kubectl get pods -n monitoring
Запросы блокируются файрволом (
iptables, firewalld). Метрика приходит с другого узла, но между ними нет связи. Проверить сетевые правила:
iptables -L -n | grep DROP
Проверить соединение между узлами:
nc -zv service-ip port
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊4🔥1
- SQS (Simple Queue Service) — очередь сообщений, проста в использовании, полностью управляется AWS. Поддерживает:
- FIFO и стандартные очереди.
- Не гарантирует точно один раз доставку в стандартном режиме.
- MSK (Managed Streaming for Apache Kafka) — стриминговая платформа, аналог Kafka:
- Позволяет обрабатывать большие потоки данных.
- Сложнее, но более гибко.
SQS — простота, MSK — мощность и контроль.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Pod в
Pending означает, что он не может быть запущен, потому что Kubernetes не может его назначить (schedule) на ноду. Нет свободных ресурсов на нодах (CPU, RAM)
Неподходящие
nodeSelector, affinity или taints Нет доступных узлов (все
NotReady) Проблемы с
PersistentVolume (PVC не привязан) Ошибки в CNI (сеть Kubernetes)
Команда
kubectl get pods -A
Команда:
kubectl describe pod my-app-1
Если под настроен только на определенные ноды, он может не найти подходящую.
kubectl describe pod my-app-1
Вывод:
0/3 nodes are available: 3 node(s) didn't match pod affinity/selector.
Проверяем статус нод
kubectl get nodes
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Файл
terraform.tfstate хранит текущее состояние инфраструктуры. Он нужен, чтобы Terraform знал, какие ресурсы уже существуют, и мог правильно управлять изменениями. Terraform использует
tfstate, чтобы сопоставлять код с реальными ресурсами. В коде создаем виртуальную машину
hcl
resource "aws_instance" "example" {
ami = "ami-123456"
instance_type = "t2.micro"
}
Запускаем
terraform apply, создается сервер в AWS В
terraform.tfstate записывается информация об этом ресурсе При следующем
terraform apply Terraform сверяет tfstate с реальными ресурсами и вносит только изменения Когда ресурсы связаны (например, сервер и security group), Terraform понимает связи через
tfstate и удаляет ресурсы в правильном порядке Когда несколько разработчиков работают с Terraform,
tfstate должен храниться в общем месте, например - S3 + DynamoDB (AWS)
- Terraform Cloud
- GCS + Firestore (GCP)
- Azure Storage + CosmosDB (Azure)
hcl
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-lock"
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Типы в Kubernetes:
- ClusterIP — доступен только внутри кластера.
- NodePort — доступ снаружи через IP:порт узла.
- LoadBalancer — работает через облачного провайдера.
- Headless Service — без IP, для StatefulSet и DNS.
На низком уровне: kube-proxy проксирует трафик через iptables или IPVS.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Docker Compose поддерживает использование JSON-файлов вместо стандартного YAML-файла. Формат JSON полностью совместим с YAML, так как YAML является надмножеством JSON. Для этого достаточно создать JSON-файл с описанием конфигурации контейнеров и передать его с помощью опции
-f.Файл должен содержать описание сервисов в формате JSON. Например, вместо YAML
version: "3.9"
services:
web:
image: nginx
ports:
- "80:80"
В формате JSON будет так
{
"version": "3.9",
"services": {
"web": {
"image": "nginx",
"ports": ["80:80"]
}
}
}Используйте флаг
-f, чтобы указать Docker Compose, какой файл использоватьdocker-compose -f docker-compose.json up
Вы можете проверить статус контейнеров, как обычно:
docker-compose -f docker-compose.json ps
JSON часто используется в API, CI/CD-пайплайнах и других инструментах, которые могут генерировать конфигурации автоматически.
JSON легко парсить программно, что может быть полезно в скриптах и интеграциях.
Некоторые команды и проекты могут предпочитать JSON как более строгий и распространенный формат.
docker-compose.json{
"version": "3.8",
"services": {
"app": {
"image": "python:3.9",
"volumes": ["./app:/app"],
"working_dir": "/app",
"command": "python app.py"
}
}
}docker-compose -f docker-compose.json up
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Способы:
- docker exec — вручную изменить файл/установить пакеты.
- ENTRYPOINT + скрипт — настроить в момент запуска.
- Volume или конфиг-файл — монтировать на нужный путь.
- Создать Dockerfile, унаследованный от базового, и внести изменения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3
Настройка графиков на панели Grafana позволяет визуализировать данные из подключенных источников в удобной и наглядной форме.
Откройте существующий дашборд или создайте новый: Перейдите в раздел Dashboards → New Dashboard.
Нажмите Add new panel для добавления панели.
В интерфейсе панели в разделе Query выберите источник данных (Data Source) из выпадающего списка. Например, Prometheus, InfluxDB, MySQL, Elasticsearch. Подключение источника данных настраивается через Configuration → Data Sources.
Каждый источник данных имеет свой язык запросов. Примеры:
Prometheus
rate(http_requests_total[5m])
MySQL
SELECT time, value FROM metrics WHERE time > NOW() - INTERVAL 1 HOUR;
Elasticsearch: Используйте Lucene или Elasticsearch Query DSL.
В разделе Visualization выберите тип графика: Time series (график по времени). Bar chart (столбчатая диаграмма). Gauge (гейдж/индикатор). Table (таблица). Pie chart (круговая диаграмма, доступна через плагин).
Настройте параметры визуализации: Линии, точки, области (lines, points, fill). Цвета линий, область графика. Подписи данных.
В разделе Transform: Преобразуйте данные (группировка, сортировка, вычисления). Добавьте фильтры или агрегируйте данные. В разделе Overrides: Настройте специфичные параметры для отдельных рядов данных (цвета, форматы отображения).
Выберите временной диапазон панели в правом верхнем углу дашборда: Например, последние 5 минут, 1 час, 24 часа. Установите параметры временного сдвига, если нужно отображать данные за конкретный период.
В разделе Panel settings: Укажите название панели. Добавьте описание для контекста.
Нажмите Save dashboard. Укажите имя дашборда и добавьте теги (опционально) для удобного поиска.
Позволяют создавать динамические фильтры. Например, добавьте переменную для выбора имени хоста:
label_values(node_cpu_seconds_total, instance)
Установите дополнительные плагины из Grafana Marketplace (например, Pie Chart, Worldmap Panel).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Теги в Ansible позволяют запускать только определенные задачи или роли, а не весь плейбук. Это ускоряет выполнение и упрощает управление конфигурацией.
если плейбук содержит много шагов, можно выполнить только нужные.
например, отдельно установка, обновление, настройка сервиса.
ускорение развертывания, выполняя только измененные задачи.
Простой пример – установка и перезапуск Nginx
yaml
- name: Установить Nginx
apt:
name: nginx
state: present
tags: install
- name: Перезапустить Nginx
service:
name: nginx
state: restarted
tags: restart
Запуск только установки (
install) sh
ansible-playbook playbook.yml --tags install
Запуск только перезапуска (
restart) sh
ansible-playbook playbook.yml --tags restart
Если у вас несколько ролей, можно запускать только нужную:
yaml
- hosts: all
roles:
- { role: nginx, tags: web }
- { role: database, tags: db }
Запуск только роли
database sh
ansible-playbook playbook.yml --tags db
Можно пропустить выполнение определенных задач
sh
ansible-playbook playbook.yml --skip-tags restart
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊2🤔1
Наследование – это механизм ООП, который позволяет создавать новый класс на основе существующего, перенимая его свойства и методы.
содержит общие свойства и методы.
наследует их и может добавлять новые или переопределять старые.
Код становится повторно используемым → меньше дублирования.
Логически группируем сущности → удобная архитектура.
Можно дополнять и изменять поведение без изменения базового класса.
Базовый (родительский) класс
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
return "Какой-то звук"
Дочерний класс (наследует
Animal)class Dog(Animal):
def make_sound(self):
return "Гав-гав"
Использование наследования
dog = Dog("Шарик")
print(dog.name) # Шарик (унаследовано от Animal)
print(dog.make_sound()) # Гав-гав (переопределено в Dog)Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1💊1
При втором запуске Ansible должен сообщить, что изменений нет, так как файл уже удален. Это подтверждает идемпотентность – задача не выполняется снова, если состояние соответствует ожидаемому.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Это системный механизм в Astra Linux (и некоторых других дистрибутивах на базе Debian), который убивает "долгоиграющие" процессы, потребляющие слишком много ресурсов. Он предотвращает зависания системы и защищает от неэффективного использования вычислительных мощностей.
Long Killer анализирует процессы и завершает те, которые:
Запущены от обычного пользователя (не root).
Работают слишком долго (по умолчанию >10 минут).
Потребляют много CPU (по умолчанию >90% CPU).
Используют много памяти (если система близка к OOM – Out of Memory).
Не имеют активности (зависли, например, ожидание ввода).
Он не убивает root-процессы.
Системные службы (например,
sshd, systemd) остаются нетронутыми. Если процесс выполняется интерактивно (например, работа в
vim или nano), он обычно не трогает его. Если подозреваете, что ваш процесс завершился из-за Long Killer, посмотрите логи
journalctl -u long-killer.service --no-pager | tail -n 20
Также можно проверить
dmesg dmesg | grep "killed by Long Killer"
Файл конфигурации находится здесь
/etc/long-killer.conf
Пример настроек
MAX_CPU_USAGE=90 # Максимальная загрузка CPU (%)
MAX_EXEC_TIME=600 # Максимальное время выполнения (секунды)
EXCLUDE_USERS=root # Не убивать процессы от root
После изменения перезапустите сервис
systemctl restart long-killer.service
Чтобы полностью отключить Long Killer
systemctl stop long-killer.service
systemctl disable long-killer.service
Запуск от
root (если это безопасно): sudo my_long_process
Снижение приоритета процесса (nice/renice)
nice -n 10 my_process
renice -n 10 -p <PID>
Использование
nohup или screen для фоновых задач nohup my_script.sh &
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Например, маска
Используется для разделения сети на подсети, маршрутизации и управления доступом.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔1
В Linux информация о версии дистрибутива и ядра хранится в нескольких файлах.
Этот файл есть во всех современных дистрибутивах (Debian, Ubuntu, RHEL, CentOS, Fedora).
cat /etc/os-release
Пример содержимого
/etc/os-release NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
HOME_URL="https://www.ubuntu.com/"
Некоторые дистрибутивы используют
/etc/issue. cat /etc/issue
Вывод
Ubuntu 22.04.3 LTS \n \l
Этот файл содержит версию ядра и информацию о компиляции.
cat /proc/version
Вывод
Linux version 5.15.0-84-generic (buildd@lcy02-amd64-016) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0) #93-Ubuntu SMP
Проверить версию через
lsb_release lsb_release -a
Вывод
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy
Проверить ядро через
unameuname -r
Вывод
5.15.0-84-generic
Можно также вывести полную информацию:
uname -a
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Squash — это процесс объединения нескольких коммитов в один перед слиянием ветки. Применяется для:
- очистки истории;
- упрощения отката;
- группировки связанных изменений;
- подготовки "чистого" pull request'а.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Маска подсети (subnet mask) — это число, которое определяет, какая часть IP-адреса относится к сети, а какая — к хостам внутри этой сети.
Пример:
IP-адрес: 192.168.1.10
Маска подсети: 255.255.255.0
В двоичном виде
IP: 11000000.10101000.00000001.00001010 (192.168.1.10)
Маска: 11111111.11111111.11111111.00000000 (255.255.255.0)
Разделять сеть на логические сегменты (разделение на подсети). Определять, находятся ли два устройства в одной сети или им нужен маршрутизатор. Экономить IP-адреса, разбивая сеть на нужное количество хостов.
Если два устройства в одной подсети, они могут общаться напрямую. Если в разных — нужен маршрутизатор.
Вместо маски 255.255.255.0 можно записать /24.
Пример: 192.168.1.10/24 (означает, что первые 24 бита — это сеть).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
В GitLab существуют следующие типы Runner:
- Shared Runner — общий для всех проектов;
- Specific Runner — закреплён за конкретным проектом;
- Group Runner — доступен для всех проектов в группе; Также Runner может быть Shell, Docker, Docker+Machine, Kubernetes и другие — по способу исполнения задач.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍4