从AKS kubernetes群集中检索已部署的ASP.Net核心Web应用程序的环境秘密

时间:2018-10-16 19:14:54

标签: asp.net-core kubernetes azure-aks

我已经将一个Web应用程序部署到AKS,并且通常可以正常运行。我现在尝试通过添加对Azure sql的访问来扩展其功能。

我们正在使用VSTS / Azure DevOps进行部署。

我已使用以下命令将机密部署到集群:

kubectl secret generic sampleapp-appsettings --from-literal=DBConnectionString="$(var_DBConnectionString)"

我已经从kubernetes仪表板检查了集群,可以看到它已经按预期部署。秘密是与数据库的连接字符串

但是,我正在努力从已部署的吊舱中检索秘密。我为ASPNETCORE_ENVIRONMENT创建了一个环境变量,并为Kubernetes创建了一个值。

这是我的部署Yaml的一部分:

    spec:
  containers:
  - name: sampleapp-services
    image: sampleapp.azurecr.io/sampleapp-services:latest
    imagePullPolicy: Always          
    env:
    - name: "ASPNETCORE_ENVIRONMENT"
      value: "Kubernetes"
    - name: services-appsettings
      valueFrom:
        secretKeyRef:
          name: services-appsettings
          key: DBConnectionString          
    ports:
    - containerPort: 80 

我已将api端点添加到我的应用中以进行调试,并且可以看到ASPNETCORE_ENVIRONMENT值正在正确提取。

但是,DBConnectionString值没有从kubernetes机密中正确提取。相反,它是从appsettings.json文件中检索的。我的应用程序中有一些代码只是输出值:

        [HttpGet("settings")]
    public ActionResult<string> GetAppSettings()
    {
        var message = $"Host: {Environment.MachineName}\n" +
                      $"EnvironmentName: {_env.EnvironmentName}\n" +
                      $"Secret value: {_dataSettings.ConnectionString}";
        return message;
    }

在我的DataSettings类中,我有这样的代码:

 var value = Environment.GetEnvironmentVariable("DBConnectionString");

但是,这并没有从我期望的kubernetes集群中撤回秘密值。

我遵循了这样的一些示例-但它们无济于事。

blog

有人能获得一些简单的分步说明/示例,可能会有所帮助吗?

谢谢

1 个答案:

答案 0 :(得分:0)

您指定的用于创建机密的命令缺少create并通过名称“ sampleapp-appsettings”创建机密,但是在Deployment.yaml中,您指定了“ services-appsettings”。我假设您列出的摘录仅供参考,并且在实际代码中这些值匹配。

第二,环境变量- name: services-appsettings应该与您在代码中指定的名称匹配。根据您的摘要,Environment.GetEnvironmentVariable("DBConnectionString")具有'DBConnectionString',但是您的Yaml具有'services-appsettings'

最后,我希望在Web API中,您在构建配置时调用.AddEnvironmentVariables()。