С таким деплоем и врагов не надо
Деплоить в пятницу опасно и безответственно.
Поэтому деплоить надо в субботу.
Перенаправление логов из Fluentbit в Seq
Seq — это сервер поиска и анализа структурированных журналов приложений в режиме реального времени. Можно смотреть на него как на своего рода альтернативу для ELK. Хотя лицензия тут тоже не свободная, а использование для юрлиц платное. Но для домашней лаборатории для меня в своё время это оказался превосходный вариант (в принципе я до сих пор считаю так, потому что времени на развертывание Seq тратится несравнимо меньше чем на ELK. Для экспериментов самое то.
В данной статье проведу нехитрую операцию по развертыванию и настройке fluentbit и seq в docker, и настрою отправку собранных логов из fluentbit в seq.
Начнём с создания отдельной сети для наших контейнеров:
docker network create fluent-bit_seq
Установка Seq
Теперь захэшируем пароль, который будет использоваться.
PH=$(echo 'seqPass%%' | docker run --rm -i datalust/seq config hash)
Убедимся, что переменная действительно содержит пароль:
echo $PH
Запускаем контейнер:
docker run --name seq -d --network fluent-bit_seq \ -p8080:80 --restart unless-stopped \ -e ACCEPT_EULA=Y -e SEQ_FIRSTRUN_ADMINPASSWORDHASH="$PH" \ datalust/seq
Теперь, можем обратиться в браузере к localhost:8080 и залогиниться в Seq с помощью username=admin password=seqPass%%
Установка Fluentbit
Для начала экспортируем переменную, которая будет содержать каталог из которого будет взята конфигурация Fluentbit.
export sharedFolder=/var/fluent-bit_seq
Запустим временный контейнер, откуда скопируем дефолтный конфиг:
docker run -d --rm --name temp cr.fluentbit.io/fluent/fluent-bit
Скопируем сам конфиг с последующей остановкой ставшего ненужным контейнера:
docker cp temp:/fluent-bit/etc/ $sharedFolder docker stop temp
Теперь еще раз запустим контейнер fluentbit, но уже смонтировав в него каталог с конфигом:
docker run -dti --name fluent-bit --network fluent-bit_seq \ -v $sharedFolder:/fluent-bit/etc \ cr.fluentbit.io/fluent/fluent-bit
По дефолту fluentbit отправляет вывод на stdout. Так что с помощью docker log всегда можно посмотреть что с ним происходит. Наша задача как раз исправить дефолтное поведение.
docker logs fluent-bit
Настройка отправки логов в Seq
Отправляемся в конфиг fluentbit и ищем следующую секцию:
# fluent-bit.conf
[OUTPUT]
name stdout
match *
Заменяем её на указанную ниже, с последующим сохранением:
# fluent-bit.conf
[OUTPUT]
Name http
Match *
Host seq
Port 5341
URI /api/events/raw?clef
Format json_lines
Json_date_key @t
Json_date_format iso8601
Log_response_payload False
Теперь перезапустим контейнер с fluentbit для принятия изменений:
docker restart fluent-bit
Возвращаемся в браузер, открываем Seq, логинимся и теперь можем видеть, что логи из fluentbit отправляются прямиком туда:
Огромная просьба к сообществу!
Уважаемые коллеги, на сайте появился некий персонаж @Stravnik. Огромная просьба, если имеется возможность запретить этому персонажу постить в ваших группах - крайне советую это сделать. Человек не знает линукса, K8s, докера, но при всем при этом постит "гайдлайны" которые переполнены ошибками, неточностями, а также плохими практиками. Ребят, я не супер спец сам, ушел в девопс недавно, но имею большой опыт в администрировании различных систем, и то что пишет этот человек и каким пафосом он относится к комментариям, указывающим на его ошибки... Просто финиш. При всем при этом якобы является офигенным специалистом, ведет комюнити DevOPS в СПБ, а также выступает в роли приглашенного эксперта на конференциях. o_O
Я считаю что такой человек не должен учить новичков ни в коем случае. Ко мне часто на работу приходят джуны с курсов, и часто приходится их доучивать и показывать куда копать в саморазвитие, а также править их косяки. Но они при этом имеют хоть какой-то базис от которого можно отталкиватся. Тут же копипаста с разных сайтов без понимания как это вообще работает, и обучение новичков плохому. Во имя ваших же нервов и будущих коллег джунов - ОСТАНОВИТЕ ЭТОГО ЧЕЛОВЕКА!!!
Установка Python3.10.10 + OpenSSL 1.1.1 в RHEL 7
Данный пост не претендует на полноту предоставленной информации.
Все действия выполняете на свой страх и риск.
Для понимания поста требуются минимальные знания в администрировании Linux.
Понадобилось мне недавно установить Python3 определенной версии на сервера с ОС RHEL 7. И вот вроде задача простая, но были несколько условий, а именно:
На контуре закрыт доступ в сеть Интернет
В локальном репозитории нет нужной версии
И еще были требования к минимальным номерам версий, Python должен быть не ниже 3.10.10 и исходя из этого появлялась еще необходимость обновить OpenSSL до версии 1.1.1. После прочтения нескольких статей родилась эта короткая инструкция.
Заходим на сервер, копируем архивы с Python и OpenSSL в папку /tmp и погнали. Начнём с установки OpenSSL версии 1.1.1n.
sudo -s
yum install nano wget yum-utils gcc openssl-devel bzip2-devel libffi-devel perl -y
cp /tmp/openssl-1.1.1n.tar.gz /usr/src
cd /usr/src
tar -xzf openssl-1.1.1n.tar.gz
cd openssl-1.1.1n
./config
make -j $(nproc)
make install
mkdir lib
cp *.{so,so.1.1,a,pc} ./lib
rm -f /usr/src/openssl-1.1.1n.tar.gz
echo 'export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64' >> /etc/profile.d/openssl.sh
source /etc/profile.d/openssl.sh
openssl version
Если последняя команда выведет номер версии отличный от 1.1.1, то выполняем следующее:
mv /usr/bin/openssl /usr/bin/openssl.backup.1.0.2k-fips
ln -s /usr/local/bin/openssl /usr/bin/openssl
С OpenSSL разобрались, теперь приступаем к установке Python версии 3.10.10.
cd /tmp
tar -xzf Python-3.10.10.tgz
cd Python-3.10.10
./configure --prefix=/opt/python310 --with-system-ffi --with-computed-gotos --enable-loadable-sqlite-extensions --with-openssl=/usr/src/openssl-1.1.1n
make -j $(nproc)
make altinstall
rm -f /tmp/Python-3.10.11.tgz
ln -s /opt/python310/bin/python3.10 /usr/bin/python3.10
python3.10 -m pip install pyopenssl
python3.10 -c "import ssl; print(ssl.OPENSSL_VERSION)"
На этом всё.
Обсудить эту заметку можно в нашем Телеграм канале: https://t.me/devops_spb_ru (@devops_spb_ru)
Добавление Linux в Windows домен
Всем привет. Понадобилось мне по-быстрому добавить Linux машины в домен Windows.
Из этого родилась эта заметка. Приступаем.
У нас уже есть вся инфраструктура, сервера, DNS сервера (тут не будет гайда по их настройке). Заходим на Linux машину по SSH и поочередно выполняем следующие команды:
# лично я пользуюсь nano
yum install nano -y
# Правим файл
nano /etc/resolv.conf
# Добавляем в него
search <ИМЯ_ДОМЕНА>
nameserver <IP_DNS_сервера>
# Останавливаем и отключаем файервол (для упрощения работы)
systemctl stop firewalld && systemctl disable firewalld
# Правим файл
nano /etc/hosts
# Добавляем в него
<IP_DNS_сервера> <FQDN_DNS_сервера>
# Устанавливаем chrony
yum install chrony -y
# Правим файл
nano /etc/chrony.conf
# Добавляем в него
server <FQDN_DNS_сервера> iburst
# Стартуем необходимые службы
systemctl start chronyd && systemctl enable chronyd
# Устанавливаем дополнительный софт
yum install realmd sssd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools -y
# Проверяем доступность домена
realm discover <ИМЯ_ДОМЕНА>
# Подключаем машину к домену
realm join -U <АДМИНИСТРАТОР_ДОМЕНА> <ИМЯ_ДОМЕНА>
# Конфигурируем
authconfig --enablemkhomedir --enablesssdauth --updateall
# Включаем необходимые службы
systemctl enable sssd.service && systemctl restart sssd
# Прописываем хостнэйм
hostnamectl set-hostname <FQDN_ЭТОЙ_МАШИНЫ>
# Правим файл
nano /etc/sysctl.conf
# Меняем значения
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# Применяем изменения
sysctl -p
# Рестартим сетевую службу
systemctl restart network
# Добавляем пользователя в админ группу
nano /etc/sudoers.d/<КОРОТКОЕ_ИМЯ_ДОМЕНА>
# Добаявляем
%<ИМЯ_ДОМЕННОГО_ПОЛЬЗОВАТЕЛЯ>@<ИМЯ_ДОМЕНА> ALL=(ALL) ALL
# Меняем права на файл
chmod 0440 /etc/sudoers.d/<КОРОТКОЕ_ИМЯ_ДОМЕНА>
Это необходимый минимум для включения Linux машины в домен Windows. Да, инструкция не идеальная, но для “попробовать” её достаточно.
Всем спасибо за внимание, а я пошел дописывать вторую часть про мониторинг.
Обсудить эту заметку можно в нашем Телеграм канале: https://t.me/devops_spb_ru (@devops_spb_ru)
Kubernetes, создание и управление Deployments – K8s. Часть 3
Сегодня предлагаю разобрать следующий по списку объект Kubernetes, а именно Deployment.
Создание и управление Deployments
Команда для создания deployment выглядит так:
kubectl create deployment DEPLOYMENT_NAME --image IMAGE_NAME
Чтобы посмотреть список созданных deployment:
kubectl get deployments
Как и у Pods, у deployments есть команда для отображения подробной информации:
kubectl describe deployments DEPLOYMENT_NAME
Для скейлинга деплоймента можно использовать такую команду:
kubectl scale deployment DEPLOYMENT_NAME --replicas NUM_OF_REPLICAS
Для проверки, что команда сработала вводим:
kubectl get pods
После скейлинга можно посмотреть параметр replica set:
kubectl get rs
Эта команда выводит информация о количестве подов, которые должны быть запущены в деплойменте.
И теперь, если вы удалите Pod, то он автоматически перезапустится. Таким образом Deployment всегда будет поддерживать количество работающих подов, которое было указано при скейлинге.
Так же можно сделать автоскейлинг:
kubectl autoscale deployment DEPLOYMENT_NAME --min=MIN_NUM_REPLICS --max=MAX_NUM_REPLICAS --cpu-percent=CPU_PERCENT_NUM
Команда для проверки:
kubectl get hpa
Deployment также можно создать с помощью YAML файла. С минимально необходимым YAML файлом вы можете ознакомиться в моем GitHub`е.
И для запуска deployment через yaml файл используется вот такая команда:
kubectl apply -f FILE_NAME.yaml
Для удаления deployment есть команда delete:
kubectl delete deployments DEPLOYMENT_NAME
Обновление Docker Image в Deployment
Посмотреть историю обновлений:
kubectl rollout history deployment/DEPLOYMENT_NAME
Команда для обновления вот такая:
kubectl set image deployment/DEPLOYMENT_NAME CONTAINER_NAME=UPDATED_CONTAINER_NAME --record
Для просмотра статуса обновления:
kubectl rollout status deployment/DEPLOYMENT_NAME
А как откатить последнее выполненное обновление? Легко:
kubectl rollout undo deployment/DEPLOYMENT_NAME
Можно откатиться на любую ревизию:
kubectl rollout undo deployment/DEPLOYMENT_NAME --to-revision=REVISION_NUM
Как обновиться, если вместо версии вы ранее указали latest? Вот так:
kubectl rollout restart deployment/DEPLOYMENT_NAME
Обсудить эту заметку можно в нашем Телеграм канале: https://t.me/devops_spb_ru (@devops_spb_ru)
Главные объекты Kubernetes и работа с Pod – K8s. Часть 2
Главные объекты K8s
Pod – объект в котором работают один или больше Docker контейнеров
Deployment – сэт одинаковых подов, нужен для Auto scaling и для обновления Docker image, держит минимальное количество работающих подов
Service – предоставляет доступ к Deployment через: ClusterIP, NodePort, LoadBalance или ExternalName
Nodes – сервера где все это работает
Cluster – логическое объединение нодов
И сегодня мы поговорим про Pod.
Создание и управление Pods
kubectl run POD_NAME --image=IMAGE_NAME --port=PORT
Эта команда создаст pod с именем POD_NAME из Docker image с именем IMAGE_NAME и откроет на этом поде порт с номеров PORT. Но есть и второй вариант создания пода:
kubectl apply -f FILE_NAME.yaml
Данная команда создаст файл на основании yaml файла. С минимально необходимым yaml файлом вы можете ознакомиться в моем GitHub`е.
Для вывода списка созданных подов можно использовать следующую команду:
kubectl get pods
Как удалить Pod? Очень просто, для этого есть команда:
kubectl delete pods POD_NAME
Окей, мы создали под, что дальше? А дальше у нас есть следующие команды для работы с Pods:
kubectl describe pods POD_NAME
Данная команда выведет подробнейшую информацию о поде с именем POD_NAME. Тут вы можете увидеть имя ноды на которой запущен данный под, ip адреса, какие volume приаттачены к контейнеру и так далее.
kubectl exec POD_NAME CMD_NAME
Данная команда запускает команду CMD_NAME внутри пода POD_NAME. Для примера:
kubectl exec -it POD_NAME sh
Запустит шелл в интерактивном режиме (ключ -it).
kubectl logs POD_NAME
Данная команда выведет логи пода с именем POD_NAME.
kubectl port-forward POD_NAME LOCAL_PORT:REMOTE_PORT
Данная команда пробросит порт с вашего локального компьютера (LOCAL_PORT) на порт (REMOTE_PORT) пода с именем POD_NAME.
В следующих статьях мы посмотрим на такие объекты k8s как Deployment и Service.
Обсудить эту заметку можно в нашем Телеграм канале: https://t.me/devops_spb_ru (@devops_spb_ru)