【问题标题】:Sending .Net Core application settings to kubernetes pods as environment variables将 .Net Core 应用程序设置作为环境变量发送到 kubernetes pod
【发布时间】:2020-01-11 03:33:31
【问题描述】:

我在 Azure 中将一些东西作为 AppService 托管,并使用环境变量来区分不同插槽(测试、开发等)的设置。

如果 AppSettings.json 文件包含如下结构:

{
   "ConnectionString": {
      "MyDb": "SomeConnectionString"
   }
}

我可以将环境变量“ConnectionString:MyDb”设置为“SomeConnectionString”,.Net Core 会理解 : 表示子级别。

但在 Kubernetes 中,我不能使用 : 作为环境键的一部分。还有另一种处理层次结构的方法还是我需要切换到平面设置?

【问题讨论】:

    标签: azure kubernetes .net-core


    【解决方案1】:

    我相信您指的是 Pod 容器定义中的 env。从 YAML/JSON 的角度来看,我认为在环境变量的键中指定 : 没有问题。您也可以将其放在引号内,并且应该是有效的 JSON/YAML:

    # convert.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: envar-demo
      labels:
        purpose: demonstrate-envars
    spec:
      containers:
      - name: envar-demo-container
        image: dotnetapp
        env:
        - name: ConnectionString:Mydb
          value: ConnectionString
    

    在 JSON 中相同:

    $ kubectl convert -f convert.yaml -o=json
    {
        "kind": "Pod",
        "apiVersion": "v1",
        "metadata": {
            "name": "envar-demo",
            "creationTimestamp": null,
            "labels": {
                "purpose": "demonstrate-envars"
            }
        },
        "spec": {
            "containers": [
                {
                    "name": "envar-demo-container",
                    "image": "dotnetapp",
                    "env": [
                        {
                            "name": "ConnectionString:Mydb",
                            "value": "ConnectionString"
                        }
                    ],
                    "resources": {},
                    "terminationMessagePath": "/dev/termination-log",
                    "terminationMessagePolicy": "File",
                    "imagePullPolicy": "Always"
                }
            ],
            "restartPolicy": "Always",
            "terminationGracePeriodSeconds": 30,
            "dnsPolicy": "ClusterFirst",
            "securityContext": {},
            "schedulerName": "default-scheduler"
        },
        "status": {}
    }
    

    但是,这似乎是 Windows/.NET 应用程序的一个已知问题。尝试修复它has been tried 并放弃,因为这在 Bash 中无效。但看起来他们决定使用__ 而不是: workaround

    【讨论】:

      【解决方案2】:

      是的,例子

      在 Appsettings.json 中

       "ConnectionStrings": {
          "Azure": "Server=tcp:uw2qdisa
      

      在 manifest.yml 中

          env:
          - name:  ConnectionStrings__Azure
            valueFrom:
              configMapKeyRef:
                name: config-disa
                key: ConnectionStrings
      

      关于 Kubernetes 的说明

      • 一些 .Net Core 应用程序需要名称中带有冒号 (:) 的环境变量。 Kubernetes 目前不允许这样做。用双下划线 (__) 替换冒号 (:),如文档中的 here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 2021-08-03
        相关资源
        最近更新 更多