Junior DevOps/SR engineer
115 subscribers
4 photos
10 links
Меня зовут Леша и я начинающий DevOps инженер в компании Флант
Download Telegram
#оффтоп
Добавил комменты к постам, правда они появятся только для будущих (с этого)
Если что, можем похоливарить о предыдущих тут
1
#интересныйфакт
А вы знали, что линуксовая утилита sed как разделитель для регулярных выражений может использовать не только "/"?
До недавнего времени я лепил вот такие штуки:

sed -i 's/\/path\/to\/smth\//\/another\/path\/to\/smth\//g' filename

а оказалось, что можно делать все гораздно проще, например:

sed -i 's^/path/to/smth/^/another/path/to/smth/^g' filename

Опять же, не будь умных людей вокруг, так и мучался бы с конструкциями \/

тредик на стаковерфлоу:
https://stackoverflow.com/questions/5864146/using-different-delimiters-in-sed-commands-and-range-addresses

Мораль: читайте man <команда>
👍21
И в догонку еще #интересныйфакт
Вместо того, чтобы открывать питон и через пандас найти уникальные значения какого-то стобца, либо через встроенный yaml-парсер перебирать данные, можно сделать

cat filename.tsv | cut -f<номер столбца> | sort [аргументы, в зависимости от сортировки] | uniq

cat filename.yaml | grep <нужное поле> | awk -F": " '{print $2}' | sort | uniq

И получить то же самое, только быстрее и проще. А потом можно хвастаться, какие вы хацкеры:)
1
Junior DevOps/SR engineer
И в догонку еще #интересныйфакт Вместо того, чтобы открывать питон и через пандас найти уникальные значения какого-то стобца, либо через встроенный yaml-парсер перебирать данные, можно сделать cat filename.tsv | cut -f<номер столбца> | sort [аргументы, в…
#держувкурсе
На работе надо было обновить api-версии для TLS сертификатов в k8s у аддона cert-manager c certmanager.k8s.io/v1alpha1 на cert-manager.io/v1 и чтобы понять, в каких репозиториях хранятся эти серты, просто сделал:

kubectl get -A certificates.certmanager.k8s.io -l heritage!=deckhouse -o yaml | grep "project.werf.io/git" | awk -F ': ' '{print $2}' | sort -n | uniq

Прошелся по полученным репам, поменял версии, выкатил - профит
1
#оффтоп
Вчера мне один хороший человек сказал, что писать на древнешумерском - не круто. Поэтому сегодня приехала пояснительная бригада из 7 "Б" и будет разбираться со всем вчера написанным (заодно и сам разберусь, хых)
1
Junior DevOps/SR engineer
Кстати, начал совсем с оркестратора, а классную статью про контейнеры не скинул:)))) https://faun.pub/the-missing-introduction-to-containerization-de1fbb73efc5 И ее перевод: https://habr.com/ru/post/541288/ Для хорошего понимания, советую почитать еще вот…
И так, первое, что надо понять из #держувкурсе - это контейнеры. Это, фактически, просто изолированный процесс (с помощью различных технологий ядра операционной системы).

Docker - это волшебная утилита, которая позволила стандартизировать описание и запуск контейнеров (докер не первый, и не последний - но сейчас это стандарт)

Kubernetes - это ещё более крутая штука, которая вышла из Google. Если коротко, то это набор абстракций для управления, мониторинга и запуска большого количества контейнеров.

Но очень советую почитать статейки из сообщения выше и почитать overview документации kubernetes - все должно встать на свои места :)

Займет не больше часа на все, но очень круто для саморазвития
1
Junior DevOps/SR engineer
Рубрика #держувкурсе или истории из жизни: Поставили задачу - развернуть jmeter в кубах. Для тех, кто не знает, что это за зверь: jmeter - это десктопная утилита для нагрузочного тестирования приложений (У нее, конечно, есть CLI, но его функционал ограничен…
Теперь про jmeter.

Как вы поняли, контейнер - это процесс. Причем в данном посте говорится о контейнере в кластере k8s. Так вот, этот кластер развернут на нескольких серверах, и, что логично, физического доступа к серверам нет (ну, кроме, возможно пары человек). Поэтому возникает вопрос - как запустить приложение с UI без монитора на рабочей машине (сервере) удаленно?

И тут на помощь приходит VNC (Virtual Network Computing) - система удаленного доступа к рабочему столу. Фактически, репозиторий из сообщения выше, позволяет развернуть VNC сервер прямо в контейнере (там не все так просто, но я в этом не разбираюсь. Если кто-то знает, буду рад ликбезу:))

И таким образом, можно подключаться через специальные утилиты напрямую к контейнеру удаленно и спокойно им управлять прямо в UI.

Но, конечно, без костылей и танцев с бубнами не обойдется:)
1
Junior DevOps/SR engineer
#держувкурсе На работе надо было обновить api-версии для TLS сертификатов в k8s у аддона cert-manager c certmanager.k8s.io/v1alpha1 на cert-manager.io/v1 и чтобы понять, в каких репозиториях хранятся эти серты, просто сделал: kubectl get -A certificates.…
Теперь про сертификаты.

Для того, чтобы безопасно общаться в сети (прикольная статья от Касперского) - нужно иметь что-то, что будет шифровать, аутентифицировать пользователей и проверять целостность доставленных и полученных данных.

Для этого и был придуман протокол TLS. Чтобы вы могли им пользоваться, нужно что-то, что будет подтверждать вашу "личность" и шифровать данные - это и делают сертификаты.

У kubernetes есть дополнение cert-manager - этот аддон позволяет автоматизировать процесс получения и подписания сертификатов в кластере.

Так как kubernetes рабоатет как REST-api, то у него в описании его абстракций (манифестах) есть поле apiVersion, которое говорит кластеру, в какую версию смотреть. Но бывает так, что одна версия устаревает и появляется новая. Об этом пересланный пост:)
1
#оффтоп
Если у вас есть вопросы по древнешумерскому и не очень - пожалуйста, пишите, буду рад помочь вам разобраться и самому подтянуть знания:)
1
#оффтоп
Когда выкатил говно-коммит и коллеге пришлось его поправлять
1
#оффтоп
В общем, сюда уже несколько дней ничего не выкладывал. Есть, что рассказать, но со временем сложно:(((
Может, у кого-то из вас есть какие-то интересные штуки?)
1
#оффтоп
Сегодня в маршрутке девчушка лет 4-х спросила маму: «А если всем попросить Лёшу не бросать канал на первой неделе после создания, он сможет это сделать?» С мамой плакала половина маршрутки… Леша, как так?!!
👍21
Благодаря очень хорошему человеку, у нас появился сервачок, на котором можно делать всякое.
В общем, необязательно иметь белый ipшник, чтобы ходить на удалённую машину по ssh (или любому другому протоколу).

Берём самый дешёвый хостинг, разворачиваем на нем самую дешёвую виртуальную машину, ставим openvpn (или wireguard).

Подключаем сервер в любой сети с доступом в интернет к этому впну, заворачиваем через iptables проброс порта на тачке с впном до вашего сервера и профит:) (ещё надо не забыть сконфигурить в впне роут до подключенного устройства)

ssh из любой точки мира до вашего сервера дома без платы за белый IP у провайдера.

Подробный мануал, может быть, напишу, а может и нет:)
1
Как какать, когда ты тормоз.

Значится, как все было.
Развернули с одним очень хорошим человеком на новом сервере гитлаб в докере (по инструкции с офф сайта: https://docs.gitlab.com/ee/install/docker.html). Настроили бэкапы (в будущем планировали переехать из обычного докера в кубы), но не особо придали значения, что у гитлаба кучу разных вариантов бэкапов. Прожили так пару недель.

Затем зачесалось кое у кого кое-где (у вашего покорного слуги), снесли к чертовой бабушке докер и накатили кубик (не простой, а золотой https://deckhouse.io/en/). Конечно, и бэкапы, и маунты от гитлаба оставили.
Начали жить по-новому и все было хорошо, до момента осознания, что бэкапы были сделаны "неправильно" и их не получится без танцев с бубнами перенести в новый гитлаб (который теперь в кластере k8s). Поняв, что даже бубен племени майя и жертвоприношения не особо помогут с восстановлением бэкапа в новый инстанс гитлаба, решил запустить гитлаб у себя на ноуте (почему на ноуте - потому что куб работает на containerd и deckhouse (который не простой куб, а золотой) не любит containerd и docker на одной машине) и перенести все репы вручную.

Перенес на ноут маунты старого докерного гитлаба, начал запускать и столкнулся с ошибкой доступов. Провозившись часа полтора, нашел наконец решение: https://stackoverflow.com/a/48037595. Оказалось, что проблема во внутреннем устройстве файловой системы OSX и что нужно было запускать все из домашней директории, а не из /tmp, как хотел изначально.
В общем, потратив всего часа 3-4 на все эти манипуляции, получилось поднять локально гитлаб и достать старые репы. Дальше все пошло легче.

Первым делом, сделал себе acess token для доступа к api гитлаба (https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
Затем, вытащил все проекты, которые уже были в нем, и сохранил в файл их repo_url для клонирования (стоит упомянуть, что все требуемые к восстановлению репы были в одной группе (папке)):

curl -sSf -H "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "http://127.0.0.1/api/v4/projects?per_page=1000" | jq -r '.[].http_url_to_repo )' | tee repos.txt

Поменял url remote, чтобы можно было клонить локально (фикс от остатков конфигов от работающего гитлаба в докере) и нехитрыми манипуляциями склонировал все:

cat repos.txt | sed 's/gitlab.alexmakh.ru/127.0.0.1:20080/g' | xargs -I{} git clone {}

затем, поменял git remote url, так как он был направлен на 127.0.0.1, а нужно было на новый домен удаленного гитлаба:

CURR_DIR=$(pwd)
for path in $(ls -d */); do cd $CURR_DIR/$path; git remote set-url origin $(git remote get-url origin | sed 's/127.0.0.1:20080/gitlab.alexmakh.ru/g'); done


создал группу(папку) в новом инстансе с тем же названием, что и в прошлом гитлабе.
Также сделал себе acess token в новом гитлабе и создал пустые проекты для всех, которые хотел пушнуть:

ls -d */ | tr -d '/' | xargs -I{} curl -H "PRIVATE-TOKEN: $GITLAB_API_TOKEN" --request POST -H "Content-Type: application/json" --data '{
"name": "{}", "description": "", "path": "{}",
"namespace_id": "8", "initialize_with_readme": "false"}' \
--url "https://gitlab.alexmakh.ru/api/v4/projects"


и затем пушнул все нехитрыми манипуляциями.

CURR_DIR=$(pwd)
for path in $(ls -d */); do cd $CURR_DIR/$path; git push; done


Профит, потрачено 5-6 часов на все, вместе с развертыванием гитлаба в кубы, но зато все восстановлено без потерь:)
1👍1
И по просьбам трудящихся,
Wireguard vpn, локальная сеть и проброс портов для доступа из вне:

Оказывается, хороший человек, который все это делал - просто воспользовался мауналом (в этом ничего плохого нет, зачем пилить велосипеды?):
https://noostyche.ru/blog/2022/03/29/ispolzovanie-wireguard-klientami-s-serymi-ip/

Вводные: локальная сеть комнаты общежития, VPS на самом дешевом хостинге и туториал выше. Для проброса портов использовался скрипт с iptables таблицей nat (https://ru.wikipedia.org/wiki/NAT)
Сам скрипт добавления проброса порта:

#!/bin/bash

EXT_IP="белый IP вашей VPSки"
INT_IP="Внутренний адрес VPSки в сети ВПН"
EXT_IF=ens3 (интерфейс VPSки, на который приходит внешний трафик)
INT_IF=wg_ihor (интерфейс VPN)
LAN_IP="Адрес сервера внутри сети VPN, на который нужно отправлять трафик"
SRV_PORT=$1


iptables -t nat -A PREROUTING --dst $EXT_IP -p tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP
iptables -t nat -A POSTROUTING --dst $LAN_IP -p tcp --dport $SRV_PORT -j SNAT --to-source $INT_IP
iptables -t nat -A OUTPUT --dst $EXT_IP -p tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j ACCEPT


где SRV_PORT - нужный порт для проброса (первый аргумент при вызове баш скрипта)

Также, для персистентности правил на впн сервере (так как они сбросятся после перезагрузки), стоит после отрабатывания скрипта сделать:
netfilter-persistent save

а после перезагрузки VPSки:
netfilter-persistent start

или сделать маленькый скрипт:
#!/bin/sh
netfilter-persistent start


И засунуть его в крончик:
@reboot /path/to/script/netfilter-persist-start.sh
#держувкурсе
Гошная библиотека для регулярных выражений не поддерживает опережающие и ретроспективные проверки (https://habr.com/ru/post/159483/), и вот почему: https://groups.google.com/g/golang-nuts/c/7qgSDWPIh_E/m/aKBGgoj8AAAJ

Если коротко: "тупые" кодеры не хотят их включать, так как не могут тогда гарантировать скорость O(n) при сопоставлении паттерна
1
#оффтоп
Как коротко объяснить, кто такой девопес
👍52
#оффтоп
Решили значит с корешом обновить бубунту с 20 до 22 на своем домашнем “серваке“.
Сделали все по правильному, обновили пакетики, сделали do-release-upgrade, система в ребут ушла и больше не поднялась.

Но суть не в этом, суть в том, как проиводился дебаг - была подключена видеокарта к серваку, видеокарта к конвертеру VGA на HDMI, далее по HDMI к карте видео захвата (монитора отдельного нет), а она к ноуту. Там был запущен OBS. После запуска, OBS решил, что он камера и вставил картинку с карты видео захвата (то есть, с сервера) прям в мит.

В итоге, дебаг производился под общажным хуевым интернетом через картинку с гугл мита на телефоне (так как на ноуте картинка была отзеркалена🤡) и клаву, подключенную к серверу. Картинка сетапа, конечно, прилагается
👍3🔥32😁1🤡1