【问题标题】:How to prevent pushing Kubernetes Secrets into git repository?如何防止将 Kubernetes Secrets 推送到 git 存储库中?
【发布时间】:2020-11-11 11:29:42
【问题描述】:

所以我的项目中有这个清单:

apiVersion: v1
kind: Secret
metadata:
  name: cambiotoday-secret-key
  namespace: default
type: Opaque
stringData:
  ct-key: <my_third_party_service_key>
---

# The rest of it, deployment and service.
...

我正在尝试寻找一种方法,可以将这个清单推送到我的 git 存储库中,但不发布其中的实际密钥。

我正在使用 Skaffold 构建我的 kubernetes 应用程序。

根据 K8S 文档:

如果您的应用程序使用以下配置文件:

apiUrl: "https://my.api.com/api/v1"
username: "user"
password: "password"

您可以使用以下方法将其存储在 Secret 中:

apiVersion: v1
kind: Secret
metadata:
 name: mysecret
type: Opaque
stringData:
  config.yaml: |-
    apiUrl: "https://my.api.com/api/v1"
    username: {{username}}
    password: {{password}}

然后,您的部署工具可以在运行 kubectl apply 之前替换 {{username}} 和 {{password}} 模板变量。

什么部署工具?这看起来正是我需要的,但我不知道如何设置。

【问题讨论】:

  • 通过 GIT,你可以忽略 .gitignore 文件中不想被推送的文件
  • 是的,我知道。我会将该配置文件添加到我的 .gitignore 中,这样它就不会被推送到远程存储库中。我想要实现的是这种脱钩。我如何告诉 kubectl(或 Skaffold 或其他):“哟,在将更改提交到集群之前更改清单中的这些变量。”

标签: kubernetes devops skaffold


【解决方案1】:

看看sealed-secrets,它允许您将加密版本的秘密放入 Git。

关于允许您模板化 YAML 的部署工具,请查看 HelmKustomize 或许多其他类似工具。如果这对您不起作用,那么您也应该编写一些脚本。

【讨论】:

    【解决方案2】:

    有一些流行的技术可以完成这项任务:

    1. Sealed-secretsCheck here 实际上,您可以使用工具 kubeseal 将您的完整机密 YAML 加密为将在 Kubernetes 集群级别再次解密的密封机密。你可以在 git 或任何 SCM 中提交密封的秘密。

      它还具有许多其他功能以提高安全性,例如秘密轮换、提前密钥更新(以防万一)

    2. Vault : Check here 这个工具在社区和企业版中都可用。它包括许多其他功能。

    3. 卡姆斯Check here

    和其他工具。

    如果您的要求不是那么大,Sealed Secrets 将适合您。

    • 密文的使用:
    # Create a json/yaml-encoded Secret somehow:
    # (note use of `--dry-run` - this is just a local file!)
    $ echo -n bar | kubectl create secret generic mysecret --dry-run --from-file=foo=/dev/stdin -o json >mysecret.json
    
    # This is the important bit:
    $ kubeseal <mysecret.json >mysealedsecret.json
    
    # mysealedsecret.json is safe to upload to github, post to twitter,
    # etc.  Eventually:
    $ kubectl create -f mysealedsecret.json
    
    # Profit!
    $ kubectl get secret mysecret
    

    这样你的秘密就被部署了。并且您将加密的 JSON 存储在 git 中。

    【讨论】:

      【解决方案3】:

      我认为一种非常简洁的方法是将您的凭据(用户名/密码/密钥等)存储在诸如 lastpass 之类的保险库中,它带有 CLI,并且与 k8s 配合得非常好。它还可以轻松管理团队中的共享凭据 :) https://engineering.upside.com/synchronizing-kubernetes-secrets-with-lastpass-584d564ba176

      【讨论】:

        【解决方案4】:

        您可以将加密后的 PWD 保存在 secrets.yaml 中,然后将其推送到 GIT 中。 https://github.com/mozilla/sops 加密相关的主密钥可以是 AWS KMS 、 Azure KMS 、 GCP KMS 等。这可以帮助您轻松地在适当的云提供商内部进行部署。

        【讨论】:

          猜你喜欢
          • 2017-08-26
          • 2019-08-30
          • 1970-01-01
          • 2015-08-22
          • 2011-03-14
          • 1970-01-01
          • 1970-01-01
          • 2023-01-16
          相关资源
          最近更新 更多