如何将 k8 密码放入 docker cmd 参数?

How to put k8 secret in docker cmd argument?

我正在尝试设置 Azure Face recognition container,但想知道如何将 k8 密钥用作 Docker 命令 "argument."

这有效,但我需要用我的 k8 密钥替换 ApiKey。

{
  "kind": "Deployment",
  "spec": {
    "template": {
      "spec": {
        "containers": [
          {
            "name": "azure-face",
            "args": [
              "Eula=accept",
              "Billing=https://microsoft.com",
              "ApiKey=123"
            ]
          }
        ]
      }
    }
  }
}

像这样创建秘密:

kubectl create secret generic azure-api-key --from-literal=azure-api-key="123"

尝试像这样更改容器参数,但它不起作用 - 参数未按预期传递: (还尝试了其他变体,如 ApiKey=${AZURE_API_KEY})

    "containers": [
      {
        "args": [
          "Eula=accept",
          "Billing=https://microsoft.com",
          "ApiKey=$AZURE_API_KEY"
        ],
        "env": [
          {
            "name": "AZURE_API_KEY",
            "valueFrom": {
              "secretKeyRef": {
                "name": "azure-api-key",
                "key": "azure-api-key"
              }
            }
          }
        ]
      }
    ]

也执行了 docker exec 并从容器内部验证:

$ echo $AZURE_API_KEY
$ 123

看起来这就是问题所在,感谢@Blokje5:

Note: The environment variable appears in parentheses, "$(VAR)". This is required for the variable to be expanded in the command or args field.

我试过 ${VAR} 而不是 $(VAR)。

对 API 密钥等敏感信息使用环境变量不一定是最佳做法。这是一个公开争论什么更好,但我个人认为使用文件更好,主要是因为收集环境变量用于日志记录等目的很常见。

因此,我会将机密作为文件装载并在命令行中读取它,类似于 API_KEY=$(cat api_key.txt)。我认为这应该可行,但需要验证。通常,当时提供的大多数图像都支持配置文件 - 所以我会首先研究这个,例如如果 Azure 人脸识别支持配置文件。

最后一点,如果您想阅读更多关于 Kubernetes 秘密以及如何在 Git 上管理它们的信息,请查看 this blog post(完全披露:我是作者),其中涵盖安全管理 Kubernetes 机密的所有不同选项。