我的应用程序托管在 AKS 中,机密存储在 Azure 机密存储中。我的客户创建了一个存储/mnt/secrets-store
该目录的卷,该目录包含我的应用程序的所有机密。
例如:
- RabbitMq--密码
- DB--连接字符串
显然,这是我当前客户的标准做法。然后,解决方案是在每次他们想要加载设置时读取文件。这一切都在治疗图表中设置。
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 目录。但它不阅读它们。
经过一番调试,我发现问题是在pod中启动微服务时,mnt dir不可用。在 pod 运行之后,它首先可以访问 mnt 目录。
有解决方案吗?
- 在 AKS 中启动之前,我怎样才能让它 mnt 卷?
- 服务启动后是否可以再次加载设置?如果是。然后我想知道我是否可以创建类似 IHostedService 的东西,它会继续尝试访问它,然后在它抓住它们后停止。
问题的主要部分是这些设置用于配置系统中运行的所有单例。如果我等到所有内容都加载完毕,它们就已经配置好了。