- Agile — это подход к разработке, ориентированный на гибкость, постоянную обратную связь, быструю поставку ценности и итеративность.
- Scrum — это фреймворк внутри Agile, с чёткими ролями (Scrum Master, Product Owner, команда), спринтами, ретроспективами, ежедневными митингами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Обычно хранятся в каталоге
/var/log
. Также многие современные дистрибутивы используют систему журналирования systemd
для управления и просмотра логов.Каталог
/var/log
содержит логи большинства системных сервисов и приложений. Логи системных сообщений
/var/log/syslog
: Содержит общие системные логи. /var/log/messages
: Содержит общие системные сообщения (не во всех дистрибутивах).cat /var/log/syslog
less /var/log/syslog
tail -f /var/log/syslog
Логи конкретных сервисов
Apache: /var/log/apache2/ или /var/log/httpd/ Логи доступа: /var/log/apache2/access.log или /var/log/httpd/access_log Логи ошибок: /var/log/apache2/error.log или /var/log/httpd/error_log
tail -f /var/log/apache2/access.log
tail -f /var/log/apache2/error.log
Nginx: /var/log/nginx/ Логи доступа: /var/log/nginx/access.log Логи ошибок: /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
MySQL: /var/log/mysql/ или /var/log/mysqld.log
tail -f /var/log/mysql/error.log
SSH: /var/log/auth.log или /var/log/secure
tail -f /var/log/auth.log
journalctl
— это утилита для просмотра и управления журналами systemd
. Она позволяет фильтровать логи по различным критериям, таким как время, сервис и уровень логирования.Основные команды
journalctl
Просмотр всех журналов
journalctl
Логов конкретного сервиса
journalctl -u nginx.service
Последних логов и продолжение просмотра в реальном времени
journalctl -f
journalctl -u nginx.service -f
Логов за определённый период
journalctl --since "2024-07-25 12:00:00" --until "2024-07-25 13:00:00"
Логов с определённым уровнем логирования
journalctl -p err
journalctl -p warning
Логи доступа
tail -f /var/log/apache2/access.log
Логи ошибок
tail -f /var/log/apache2/error.log
Логи доступа
tail -f /var/log/nginx/access.log
Логи ошибок
tail -f /var/log/nginx/error.log
Все логи Nginx
journalctl -u nginx.service
Последние логи Nginx в реальном времени
journalctl -u nginx.service -f
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
- Легче управлять и масштабировать один процесс в контейнере.
2. Изоляция:
- Каждый контейнер изолирован, что упрощает отладку и обновление.
3. Следование принципу "малые единицы":
- Каждый контейнер выполняет одну задачу, что соответствует философии микросервисов.
4. Упрощение мониторинга и логирования:
- Логи и метрики проще ассоциировать с конкретным процессом.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В Linux информация о группах пользователей хранится в файле:
/etc/group
— основной файл, содержащий список всех групп системы. Вывести содержимое файла
/etc/group
cat /etc/group
Формат строк в файле
имя_группы:x:GID:пользователи
Пример
root:x:0:
sudo:x:27:alice,bob
developers:x:1001:john,mary
Найти группу по имени
grep '^sudo:' /etc/group
Выведет
sudo:x:27:alice,bob
Узнать, в каких группах состоит пользователь
groups alice
или
id -Gn alice
Выведет
alice sudo developers
хранит пароли групп
Если у группы есть пароль (редкость), он хранится здесь.
Формат:
имя_группы:пароль:GID:админы_группы
Пример:
sudo:!:27:
developers:!:1001:john
Посмотреть содержимое
sudo cat /etc/gshadow
Если используется корпоративный домен, данные о группах могут храниться в LDAP или Active Directory.
getent group
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Sidecar — это дополнительный контейнер, запускаемый рядом с основным контейнером в одном поде. Он используется для таких задач, как сбор логов, метрик, проксирование трафика, монтирование секретов и шифрование.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Права доступа по умолчанию зависят от базовых прав доступа и значения
umask
. Базовые права доступа — это значения, которые система использует для определения разрешений перед применением маски umask
.Это означает, что по умолчанию все пользователи могут читать и записывать в файл.
Это означает, что по умолчанию все пользователи могут читать, записывать и выполнять (заходить) в каталог.
Это маска, которая определяет, какие права будут отключены при создании нового файла или каталога. Значение
umask
указывается в восьмеричной системе счисления. Базовые права доступа: 666
Значение
umask
: 022Окончательные права доступа: 666 - 022 = 644 (rw-r--r--)
Базовые права доступа: 777
Значение
umask
: 022Окончательные права доступа: 777 - 022 = 755 (rwxr-xr-x)
umask 0022
touch myfile
ls -l myfile
Вывод
Права доступа: 644 (rw-r--r--)
-rw-r--r-- 1 user user 0 Jul 26 12:00 myfile
umask 0027
mkdir mydir
ls -ld mydir
Вывод
Права доступа: 750 (rwxr-x---)
drwxr-x--- 2 user user 4096 Jul 26 12:00 mydir
Вы можете установить umask в скрипте для задания прав доступа по умолчанию для всех создаваемых файлов и каталогов.
#!/bin/bash
umask 027
touch file1
mkdir dir1
Для файлов: По умолчанию права доступа 666 минус umask.
Для каталогов: По умолчанию права доступа 777 минус umask.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Init создаётся ядром ОС после загрузки, и он порождает все остальные процессы, в том числе системные службы и пользовательские сессии. Его PID всегда равен 1. В контейнерах тоже может быть свой init, чтобы обрабатывать сигналы и управлять дочерними процессами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
По умолчанию Ansible выполняет задачи последовательно, но можно ускорить выполнение с помощью параметра
forks
или асинхронных задач (async
). forks
– это количество серверов, на которых Ansible выполняет задачи одновременно. ansible-playbook -i inventory.ini playbook.yml --forks=10
Установить
forks
в ansible.cfg
: [defaults]
forks = 10
Если задача выполняется долго, ее можно запустить асинхронно и не ждать завершения.
Пример асинхронного выполнения установки пакета
- name: Установить nginx параллельно
apt:
name: nginx
state: present
async: 300
poll: 0
async: 300
– запускает задачу и дает ей 300 секунд на выполнение poll: 0
– не ждет завершения, сразу переходит к следующей Проверить статус запущенных задач:
ansible all -m async_status -a "jid=1234567890" -i inventory.ini
Пример запуска задачи в фоновом режиме
- name: Запустить долгий процесс
shell: "nohup long_script.sh &"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Объекты. Всё в Python — объект: функции, переменные, типы, модули.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Если вы удалили файлы, но место на диске не освободилось, это может происходить по нескольким причинам.
Если файл удален, но он открыт каким-либо процессом, его содержимое остается в памяти или файловой системе до завершения работы этого процесса. Это называется "удаление с дескриптором".
Используйте команду
lsof
(list open files), чтобы найти процессы, удерживающие файлlsof | grep deleted
Перезапустите процесс или завершите его с помощью
kill
:kill -9 <PID>
Например:
- Файл был удален внутри Docker-контейнера, но место занято в образе.
- Файл находился на смонтированном диске, и удаление произошло в другом контексте.
Убедитесь, что вы работаете в правильной файловой системе:
df -h
Убедитесь, что удаление происходит в нужной директории или файловой системе.
Если файл имеет несколько жестких ссылок, удаление одного из них не освободит место до тех пор, пока не удалены все ссылки.
Используйте команду
find
, чтобы найти оставшиеся ссылки:find / -samefile <имя_файла>
Удалите все ссылки на файл.
Если используется файловая система с ограничением (например, квоты пользователей или групп), возможно, квота пользователя исчерпана, и это мешает очистке.
Проверьте квоты:
quota -u <username>
Убедитесь, что квоты настроены правильно, или освободите больше места.
Иногда удаленные файлы остаются в виде кэша, временных данных или не удаляются из корзины.
Очистите кэш или проверьте корзину. Например, для очистки временных файлов
sudo du -sh /tmp
sudo rm -rf /tmp/*
Удалите временные файлы, очистите кэш:
sudo sync && sudo echo 3 > /proc/sys/vm/drop_caches
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Потому что:
- Массив в Java не переопределяет equals() и hashCode(), сравнение идёт по ссылке.
- Это приведёт к тому, что два массива с одинаковыми значениями будут считаться разными ключами.
- Лучше использовать ByteBuffer.wrap(byte[]) или вручную реализовать equals/hashCode.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это контроллеры, используемые для управления подами, но они предназначены для различных типов приложений и имеют разные функции. Разница между ними связана с тем, как они управляют жизненным циклом подов, сетевой идентичностью, постоянством данных и порядком развертывания.
Используется для управления статическими или бесстаточными приложениями, где порядок запуска подов, их идентичность и состояние не имеют значения.
Примеры: веб-серверы, микросервисы, обработка очередей. Каждый под одинаков, и потеря одного из них не нарушает работу приложения.
Поды запускаются и удаляются в любом порядке. Если под удаляется, создается новый с другой идентичностью.
Поды доступны через Service, но они не сохраняют фиксированные сетевые имена.
Поддерживает обновления без простоя (rolling updates). Умеет откатываться на предыдущую версию.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21.6
Используется для управления состоянием и обеспечивает упорядоченность и идентичность подов. Это важно для приложений, где требуется сохранение данных, стабильные идентификаторы или порядок операций.
Примеры: базы данных (MySQL, PostgreSQL), системы очередей (Kafka), распределенные системы (Cassandra, Elasticsearch). Каждый под имеет уникальный идентификатор и связан с определенным хранилищем данных.
Поды запускаются, обновляются и удаляются строго в определенном порядке (0, 1, 2...). Это важно для приложений, где один узел должен быть доступен перед запуском другого.
Каждый под имеет фиксированное имя (например,
pod-0
, pod-1
), что упрощает взаимодействие между подами.Выполняются поэтапно, с учетом порядка.
Поды используют PersistentVolumeClaim (PVC) для сохранения данных. Даже если под удален, данные остаются на диске и доступны после повторного запуска.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql-service"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
Бесстаточное. Требует быстрой масштабируемости. Не зависит от порядка запуска подов.
Требует сохранения данных между перезапусками. Зависит от фиксированной идентичности подов. Требует упорядоченного запуска или удаления.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
NAT (Network Address Translation):
- Преобразует внутренние IP-адреса в один внешний IP.
- Позволяет многим устройствам пользоваться Интернетом через один адрес.
- Типы:
- SNAT — исходящий трафик (от локального к Интернету).
- DNAT / Port forwarding — входящий трафик (от Интернета к устройству).
- Обеспечивает безопасность и экономию IP-адресов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Запуск контейнеров от имени пользователя root (рута) в Docker является обычной практикой, но это может привести к серьезным проблемам безопасности. Вот основные причины, почему это считается плохой практикой:
Эксплуатация уязвимостей: Если злоумышленник получает доступ к контейнеру, запущенному от имени root, он может легко использовать уязвимости контейнера для атаки на хост-систему.
Злоумышленники: Контейнеры могут содержать уязвимые или злонамеренные коды, которые при запуске с привилегиями root могут получить доступ к чувствительной информации или вызвать сбои.
Гостевая изоляция: Контейнеры должны быть изолированы от хост-системы. Запуск контейнера от имени root нарушает эту изоляцию, так как root внутри контейнера — это также root на хосте.
Повышенные привилегии: Контейнеры, запущенные от имени root, могут иметь доступ к системным ресурсам, что увеличивает риск нарушения безопасности.
Принцип наименьших привилегий: Этот принцип гласит, что процесс должен иметь только те привилегии, которые необходимы для выполнения его задач. Запуск контейнера от имени root нарушает этот принцип, предоставляя ему избыточные права.
Если в контейнере, запущенном от имени root, найдена уязвимость, злоумышленник может использовать ее для выполнения команд с привилегиями root на хосте, что может привести к серьезным нарушениям безопасности.
Контейнер, запущенный от имени root, может получить доступ к критически важным файлам хостовой системы, изменять их или удалять, что может привести к нарушению работы всей системы.
Использование непривилегированных пользователей:
В Dockerfile можно создать пользователя с ограниченными привилегиями и переключиться на него.
FROM ubuntu:20.04
RUN useradd -m myuser
USER myuser
CMD ["myapp"]
Использование флага --user:
При запуске контейнера можно использовать флаг
--user
, чтобы указать непривилегированного пользователя.docker run --user 1000:1000 myapp
Использование механизмов безопасности Docker:
Использование профилей seccomp для ограничения системных вызовов.
Использование AppArmor или SELinux для ограничения доступа контейнеров к системным ресурсам.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Изменение в ReplicaSet не сохранится надолго: Deployment всё равно будет следить за своим состоянием и при следующем изменении пересоздаст ReplicaSet с заданной в манифесте конфигурацией. Поэтому любые ручные изменения потеряются — надо менять именно Deployment.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В Bash функция возвращает код завершения (exit status), который представляет собой числовое значение от 0 до 255. Это значение используется для указания успешного или неуспешного выполнения функции. По умолчанию, если явно не указано возвращаемое значение, функция возвращает код завершения последней выполненной команды внутри нее.
Чтобы явно задать код завершения функции, используется команда
return
. my_function() {
if [[ $1 -gt 0 ]]; then
return 0 # Успех
else
return 1 # Ошибка
fi
}
my_function 5
echo $? # Выведет 0 (успех)
Для передачи данных из функции (например, строки или числа) можно использовать
echo
. Вывод можно перехватить через подстановку команд $()
my_function() {
echo "Hello, $1!"
}
result=$(my_function "world")
echo "$result" # Выведет "Hello, world!"
Функция может менять значения глобальных переменных, которые затем используются за ее пределами
my_function() {
result=$(( $1 + $2 ))
}
my_function 3 7
echo $result # Выведет 10
Используется в сценариях для проверки, выполнилась ли функция успешно. Значение
0
обычно означает успех, а любое другое число — ошибку.Удобен для передачи данных из функции.
Полезно, если функция должна сохранять данные для дальнейшей обработки.
# Функция проверки файла
check_file() {
if [[ -f $1 ]]; then
echo "Файл $1 существует."
return 0
else
echo "Файл $1 не найден."
return 1
fi
}
# Вызов функции
check_file "/etc/passwd"
status=$? # Сохраняем код завершения
if [[ $status -eq 0 ]]; then
echo "Продолжаем работу..."
else
echo "Останавливаемся из-за ошибки."
fi
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
- Least privilege (минимальный RBAC).
- Ограничение доступа к hostPath, privileged, capabilities.
- Использование NetworkPolicies.
- Использование PodSecurityPolicy / PodSecurityAdmission.
- Контейнеры без root.
- Сканирование образов (Trivy, Clair).
- ReadOnlyRootFilesystem, Seccomp, AppArmor.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Императивный подход — это стиль программирования, где мы пошагово указываем компьютеру, что делать и как это делать.
Программист описывает процесс решения задачи.
Код выполняется шаг за шагом, изменяя состояние программы.
Пример на Python (императивный подход)
numbers = [1, 2, 3, 4, 5]
squared = []
for num in numbers:
squared.append(num ** 2) # Явно указываем, что делать на каждом шаге
print(squared) # [1, 4, 9, 16, 25]
C, Java, Python (может быть и императивным, и декларативным).
где важно управлять состоянием
(например, скрипты Bash
Пример в DevOps (Bash-скрипт, императивный стиль)
#!/bin/bash
mkdir /backup
cp /var/log/syslog /backup/
echo "Backup создан"
Императивный (Ansible, Bash)
apt update
apt install nginx
Шаги установки Nginx описаны вручную.
Декларативный (Terraform, Kubernetes)
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "t2.micro"
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
proc — это виртуальная файловая система, которая содержит:
- информацию о процессах (/proc/<pid>/);
- информацию о системе (cpuinfo, meminfo, uptime);
- псевдофайлы, которые отражают текущее состояние ядра и процессов;
- не занимает физическое место, создаётся динамически.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В
iptables
есть 5 таблиц, но чаще всего работают с тремя: основная таблица для контроля трафика (используется по умолчанию)
для трансляции адресов (SNAT, DNAT, редиректы)
для изменения пакетов (маркировка, TTL, QoS)
для исключения пакетов из обработки
conntrack
используется в SELinux для меток безопасности
Используется для разрешения или блокировки трафика.
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Используется для NAT, порт-форвардинга, маскарадинга.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Пример: Проброс порта (DNAT) – входящие пакеты на 80 порт перенаправляем на 8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Используется для маркировки пакетов, изменения TTL, QoS.
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64
Пример: Маркировка пакетов для использования в
tc
(QoS) iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM