Как снова загрузить параметры конфигурации после запуска службы
Мое приложение размещено в AKS, секреты хранятся в хранилище секретов Azure. У моего клиента есть том, в котором
/mnt/secrets-store
этот каталог содержит все секреты моего приложения.
Например:
- RabbitMq- Пароль
- БД -ConnectionString
По-видимому, это стандартная практика с моим нынешним клиентом. Тогда есть решение - читать файл каждый раз, когда они хотят загрузить настройки. Все это настроено в таблицах исцеления.
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
{{- end}}
Некоторые из моих сервисов загружаются как синглтоны при запуске, что означает, что настройки должны быть доступны при запуске.
Примечание. Моя служба не имеет прямого доступа к хранилищу ключей Azure, и это нельзя изменить. У меня есть доступ только к этим файлам.
Что я сделал, так это создал обычай
IConfigurationBuilder
называется
UseAzureKeyVaultMountedSecrets
с этим все очень прямолинейно. Он просто проверяет папку, а затем загружает секреты, заменяя все, что находится в appsettings..json для этого ключа, являющегося именем.
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseAzureKeyVaultMountedSecrets()
.UseSerilog((context, config) => config.ReadFrom.Configuration((context.Configuration)))
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Локально для тестирования я просто создал папку с файлами в ней, и она работает как шарм. Однако при размещении на AKS у меня начались проблемы. Мои проверки работоспособности показывают, что он может обнаружить каталог mnt. Но не читать их.
После небольшой отладки я обнаружил, что проблема в том, что каталог mnt недоступен, когда микросервис запускается в модуле. Сначала после запуска модуля он может получить доступ к каталогу mnt.
Есть ли решение для этого?
- Как сделать так, чтобы перед запуском в AKS он устанавливал громкость?
- Можно ли снова загрузить настройки после запуска службы? Если это. то мне интересно, могу ли я создать что-то вроде IHostedService, который просто продолжал бы пытаться получить к нему доступ, а затем останавливался, как только он их захватил.
Основная проблема заключается в том, что эти параметры используются для настройки всех синглтонов, работающих в системе. Если я жду, пока все загрузится, они уже настроены.
1 ответ
@christian-sauer прав. Я считаю, что ваша «проблема» заключается в том, что для отображения этих «виртуальных» файлов требуется некоторое время, поскольку они отображаются из Azure Vault. т.е. монтирование завершено, поэтому инициализация модуля продолжается, но требуется время, чтобы файлы появились, пока проецируются секреты.
Поэтому вам нужно заставить ваше приложение ждать, пока они не появятся. Я не уверен, что вы подразумеваете под «капсула не закончит загрузку». Все будет хорошо. Просто ваш процесс будет выполнять небольшую дополнительную работу во время запуска.
Итак, просто добавьте небольшой цикл, который проверяет наличие файлов в этой папке, а затем продолжайте. Потребуется немного усилий, чтобы сделать его надежным, и вам нужно будет поэкспериментировать и посмотреть, как выглядят эти файлы. т.е. они все появляются сразу? Или они появляются через какое-то время? Может, ты посчитаешь файлы, подожди, посчитай еще раз. Если счетчик стабилен в течение некоторого периода времени (500 мс?), то разорвите цикл и продолжите. Если это займет слишком много времени (10 с, 30 с?), то выбросьте, и процесс (и модуль) завершится ошибкой. Какое правильное поведение.
Вы правы, когда думаете о проверках работоспособности, но… конфигурация — сложная штука. Как вы указали, это должно быть доступно, прежде чем другие вещи могут быть загружены.
Возможно, используйте IHostBuilder
Вы правы, это блокирует процесс, пока работает проверка. Это совершенно нормально.
Для полноты... вы можете подумать об использовании
- будет ли он обновлен к тому времени, когда он понадобится другим вашим произведениям? Возможно, вы сможете реорганизовать эти части, чтобы подключиться к событию Changed и повторно инициализировать себя. Вот драконы.
- В k8s «файлы», которые вы читаете, часто являются символическими ссылками. SystemFileWatcher не будет обнаруживать изменения, поскольку атрибуты символической ссылки не меняются, а только данные, на которые указывают.
Итак, KISS, просто заблокируйте процесс, пока файлы не появятся.