1

我的应用程序托管在 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 的东西,它会继续尝试访问它,然后在它抓住它们后停止。

问题的主要部分是这些设置用于配置系统中运行的所有单例。如果我等到所有内容都加载完毕,它们就已经配置好了。

4

1 回答 1

0

@christian-sauer 是正确的我相信你的“问题”是这些“虚拟”文件需要一些时间才能显示出来,因为它们是从 Azure Vault 映射的。即挂载已完成,因此 pod 初始化继续进行,但在投影秘密时文件需要时间显示。

所以你需要让你的应用等到它们出现。我不确定“吊舱无法完成加载”是什么意思。没事的。只是您的进程在启动时会做一些额外的工作。

因此,只需添加一个小循环来检查该文件夹中是否存在文件,然后继续。使它变得健壮需要一点努力,您需要试验并观察这些文件的显示方式。即它们都同时出现吗?还是它们会在一段时间内出现?也许你数了数文件,等等,再数一次。如果计数在一段时间内稳定(500 毫秒?),则中断循环并继续。如果花费的时间太长(10 秒、30 秒?),那么 throw 并且进程(和 pod)将失败。这是正确的行为。

您考虑健康检查是对的,但是......配置是一件棘手的事情。正如您所指出的,在引导其他事物之前需要它可用。

也许使用 IHostBuilderConfigureHostConfiguration扩展来执行文件检查循环。这已经足够早了,以至于在任何引用配置之前都会阻止启动。(注意:有两个阶段:主机配置;应用程序配置)。

你是对的,这确实会在检查工作时阻止进程。这完全没问题。


为了完整性...您可能会考虑IOptionsMonitor改用(当底层提供程序检测到更改时更新 IConfiguration。即文件更新)。看起来“不错”,但是...

  1. 它会在您的其他作品需要时更新吗?您也许可以重构这些部分以连接到 Changed 事件并重新初始化它们自己。这里是龙。
  2. 在 k8s 中,您正在阅读的“文件”通常是符号链接。SystemFileWatcher 不会捕获更改,因为符号链接属性不会更改,只会更改指向的数据。

所以,KISS,在文件出现之前阻止这个过程

于 2021-12-09T13:46:13.150 回答