Андрей Крисанов

Заметки (не) разработчика

По-английскиLinkedInGithub

Как освободить место на диске WSL2

С полным переходом на удаленку в начале пандемии оборудовал постоянное рабочее место со столом регулируемой высоты и креслом Herman Miller. Основным компьютером на тот момент выступал 15’ Macbook Pro late 2018. Так как рабочее время теперь провожу за этим место и занимаюсь задачами связанными с машинным обучением и обработкой данных, решил собрать производительный компьютер на базе 12-ядерного процессора AMD и NVIDIA GeForce RTX 3080. В качестве операционной системы попробовал Ubuntu, Linux Mint, но в итоге разочаровался работой Zoom и других нужных приложений. В итоге установил Windows 10 и собрал окружение на базе Docker и WSL2. Это позволило решить проблемы с качеством десктопного софта и работать с привычным Unix.

Нареканий к такой конфигурации софта нет — даже работают перенесенные с macOS дот-файлы. Единственное, за чем периодически приходится следить, — место на диске. WSL2 создает виртуальный диск в формате .vhdx, который и хранит файлы гостевой операционной системы. Это включает в себя в том числе Docker-образы, скачиваемые для запуска контейнеров. С течением времени размер диска сильно растет и начинает отъедать полезное место на диске C:\.

WSL2 не поддерживает высвобождение места на виртуальном диске, поэтому делать это нужно вручную.

Для начала рекомендую удалить неиспользуемые Docker-образы:

$ docker system prune --all

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: postgres:13.4-alpine3.14

...
Total reclaimed space: 76.84GB

А также выполнить удаление неиспользуемых системных пакетов:

sudo apt-get clean
sudo apt-get autoclean
sudo apt-get autoremove

76.84GB высвободилось на виртуальном диске. На диске C:\ 76.84GB все еще недоступны для пользования.

Ситуацию исправляется следующим образом. Открываем PowerShell с правами администратора и выполняем:

> wsl.exe --list --verbose  # получаем список виртуальных машин

> wsl.exe --terminate Ubuntu-20.04  # останавливаем нужную

> diskpart  # запускаем дисковую утилиту

DISKPART> select vdisk file=C:\Users\devel\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx  # указываем путь к файлу диска

DiskPart successfully selected the virtual disk file.

DISKPART> compact vdisk

100 percent completed

DiskPart successfully compacted the virtual disk file.

То же самое проделываем для диска Docker:

DISKPART> select vdisk file=C:\Users\devel\AppData\Local\Docker\wsl\data\ext4.vhdx

DiskPart successfully selected the virtual disk file.

DISKPART> compact vdisk

100 percent completed

DiskPart successfully compacted the virtual disk file.

Ура, на диске C:\ появились 76.84GB и даже больше.

Чеклист по старту проекта с Apache Kafka®

В любом современном проекте, где появляется необходимость обрабатывать какие-либо события — набор сообщений или поток данных, в качестве инфраструктурного решения разработчики часто предлагают Apache Kafka®. Не всегда этот выбор выглядит взвешенно — там, где достаточно классического брокера типа ActiveMQ, побеждает маркетинг.

Допустим все же, вы обдуманно пришли к выбору Кафки или же ваша централизованная инфраструктура не оставила вам выбора. На какие вопросы стоит ответить перед тем, как начать писать продюсеры, консьюмеры и настраивать какие-то параметры брокера? Мой базовый чеклист-опросник ниже:

  1. Объем данных, который планируется генерировать продьюсерами → хватит ли вашего сетевого канала для всей системы и ее критичных компонент.
  2. Как долго вам необходимо хранить данные: Data Retention Policy → бизнес-требования продукта, который вы разрабатываете и стоимость хранения данных, см. в том числе пункт первый. Кроме перечисленного не стоит забывать и про комплаенс.
  3. Нужны ли гарантии отправки сообщения: Acks → поиск баланса между временем ожидания latency и надежностью в рамках репликации durability.
  4. Гарантия доставки → насколько критично для нашей бизнес задачи потеря или дублирование сообщений, важны ли идемпотентность и транзакционность.
  5. Какая стратегия партиционирования будет использоваться продьюсерами — подходит ли стратегия по умолчанию.
  6. Для выбранного топика важно ли нам хранить весь лог сообщений или достаточно последних изменений → см. Compacted Topics в официальной документации.
  7. Потребуется ли консьюмер-группа для ваших топиков; как вы планируете масштабировать консьюмеры и их пропускную способность; что будет в случае ребаласировки группы.

За рамками чеклиста остаются вопросы шифрования данных, аутентификации и авторизации, а также траблшутинга — предполагая, что за вас это решит SRE или PAAS.

 Нет комментариев    12   6 мес   kafka

Полезные советы невролога о подушках

Сон — это мегаважно. Не только его количество, но и качество. Если по количеству, все плюс-минус понятно — спи себе минимум 8 часов, то на качество влияет довольно много факторов. Один из них — ваша подушка и положение во сне.

Общие советы:

  • Выбирайте простую пухо-перьевую подушку, не сентипоновую
  • Размер 50x70, т. е. прямоугольной, не квадратной формы
  • Наволочка не должна стискивать подушку
  • Для ребенка подушка должна быть мягкой и тонкой — больше пуха или всего 30% пера
  • Спать нужно на спине или на боку, не на животе, чтобы не выкручивать шею
  • Лежа на боку плечо не должно лежать на подушке → подушка под шеей как валик, рука на плече
  • Лежа на спине, подушка должна образовывать валик в области шеи
  • Ортопедическая подушка пригодна только для сна на боку
  • Подушка должна успевать проветриваться и сохнуть, а не лежать постоянно накрытой

Синхронизация пользователей через LDAP в Keycloak

Один из способов подключения провайдера существующих пользователей к Keycloak — механизм, который называется User Federation. Он позволяет используя Kerberos или LDAP синхронизировать учетные записи из корпоративного хранилища. Если пользователей в хранилище много, и оргструктура организации предполагает иерархию, то это может усложнить получение (под)группы учетных записей.

Так, например, в Active Directory используются следующие сущности:

  • CN = Common Name
  • OU = Organizational Unit
  • DC = Domain Component

Документация по LDAP с расшифровкой аббревиатур есть на сайте Microsoft.

В настройках LDAP провайдера необходимо указать User DN. Самый простой вариант — когда все учетные записи разложены по организационным единицам:

OU=Main,DC=Orgname,DC=ru

В этом случае Keycloak с легкостью найдет все учетные записи в юните, даже если внутри него есть какая-то вложенная структура. Для этого, правда, придется включить дополнительный параметр Search Scope: Subtree.

Но что делать если администраторы Active Directory вместо создания OU сущностей добавляют нужных вам пользователей в CN? Другого способа, как дополнить описанное выше решение дополнительным фильтром для LDAP, я не нашел. В настройке Custom User LDAP Filter можно прописать все CN группы через оператор «Или» |:

(&(objectCategory=Person)(sAMAccountName=*)(|(memberOf=CN=CMS_EDITOR,OU=Security,OU=Groups,OU=Central,OU=Main,DC=Orgname,DC=ru)))

В примере указана только одна группа — CMS_EDITOR.

Сертификат для LDAPS в Keycloak

В нескольких рабочих проектах я использую в качестве сервиса аутентификации Keycloak. Проект спонсируется компанией RedHat, активно развивается и адаптирован для cloud-native окружения. Хотя документация у Keycloak достаточная для основных пользовательских сценариев, иногда ее не хватает для решения специфичных вопросов. Последнее с чем я столкнулся — подключение Active Directory как User Federation через протокол LDAPS (LDAP over SSL).

Как и полагается внутренним корпоративным сервисам, наш сервер LDAPS предоставляет самоподписанный сертификат. Keycloak в этом случае для успешного соединения с ldaps://ldap.orgname.com:636 требует, чтобы сертификат находился в truststore. Вариантов конфигурирования несколько:

  1. глобальный cacerts ОС, в которой запускается сервис
  2. cacerts из каталога установленного JDK
  3. системное свойство javax.net.ssl.trustStore для JVM
  4. truststore в каталоге Keycloak

Если вам необходимо просто добавить самоподписанный сертификат или root.crt, то самым простым способом будет добавление его в источники на уровне ОС и обновление списка доверенных сертификатов. Тогда вам не придется каждый раз искать где находиться JDK в системе, переписывать startup-скрипты сервиса или заботиться о безопасной работе с паролями для своего truststore.

Для разворачивания в Kubernetes или OpenShift можно собрать образ следующим способом:

FROM jboss/keycloak:13.0.0

USER root

ARG CERT="root.crt"

COPY $CERT /etc/pki/ca-trust/source/anchors/
RUN update-ca-trust

USER 1000

Убедиться, что сертификат был добавлен в список доверенных:

$ cd /etc/pki/ca-trust/extracted/java
$ keytool -list -keystore cacerts

Your keystore contains 137 entries. В оригинальном образе их 136.

Ранее Ctrl + ↓