在Git中加密和存储Kubernetes的秘密

206 阅读3分钟

在Git中加密和存储Kubernetes的秘密

最近,我为一个客户配置了一个Rails应用的Kubernetes秘密,将其存储在git中,以便使用GitOps方法部署该应用。这篇博文介绍了我为GitOps存储Kubernetes秘密的方法。

在git上存储Kubernetes清单

我们在Gitlab中存储了部署、configmap、ingress和服务YAML 文件。因此,GitOps的某些部分已经完成。对于secrets.yml ,我必须首先将Kubernetes集群的秘密导出为yaml,因为它没有存储在其他地方。

kubectl get secrets my-app-secret -o yaml > secrets.yaml

这就是secrets.yaml内容的样子:

apiVersion: v1
data:
  user: cGFzcw==
kind: Secret
metadata:
  name: my-app-secret
type: Opaque

Secrets格式

在Kubernetes中,secrets是以base64格式存储编码的,可以很容易解码。当你遵循GitOps和秘密要存储在git上时,它们不能以base64格式存储,它们需要被加密并存储在git上。我遇到了kubeseal来解决这个问题。

什么是Kubeseal?

它是一个用于加密Kubernetes秘密的工具。Kubeseal将被用来制作SealedSecret作为秘密的模板。一个SealedSecret将是一个CRD(自定义资源定义),只有在你的Kubernetes集群上运行的kubeseal控制器可以解密。然后控制器在集群上创建一个Kubernetes秘密。

使用kubeseal

你可以按照kubseal的README.md说明来安装它。

kubeseal由两部分组成:

  1. 客户端 - 安装在本地。

  2. 控制器 - 安装在远程集群上。

为了使控制器能够解密SealedSecret ,它需要一个证书。在本地创建SealedSecret时,我们将使用证书在本地进行加密。以下是获取证书的命令。

kubeseal --fetch-cert > staging.pem

现在我们可以用这个证书创建一个SealedSecret

echo -n foo | kubeseal --raw --from-file secrets.yml --cert staging.pem -o yaml --name mysecret

它的返回结果是:

AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq...

但我们需要一个SealedSecret 资源的yaml,而不是仅仅一个秘密。我们需要传递一个Kubernetes secret.yaml文件,以便kubeseal为我们创建一个SealedSecret

kubeseal --cert staging.pem --format=yaml < secrets.yml

其中返回:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  creationTimestamp: null
  name: my-app-secret
  namespace: default
spec:
  encryptedData:
    my-db-pass: AgChw/NSDxfhun7kWZZnXHR6zj...
  template:
    metadata:
      creationTimestamp: null
      name: my-app-secret
      namespace: default
    type: Opaque

现在我可以把它输出到一个yaml文件中,作为:

kubeseal --cert staging.pem --format=yaml < secrets.yml > sealedsecret.yml

当我们不能完全访问Kubernetes集群以直接使用kubeseal控制器时,上述步骤很有帮助。

其他创建方式SealedSecret

还有一种方法可以用kubeseal命令生成sealedsecret,我们需要把secret.yaml作为输入传给kubeseal命令。注意,这次我们不是手动传递证书,控制器会自动获取它:

kubectl create secret generic app-secret --dry-run --from-literal=foo=bar -o yaml | \
 kubeseal \
 --controller-name=kubeseal-sealed-secrets \
 --controller-namespace=kubeseal \
 --format yaml > sealedsecret.yaml

这将创建一个sealedsecret.yaml。sealedsecret.yaml可以和其他kubernetes清单文件一起提交给git,用于GitOps。使用这些清单文件,我们可以使用任何CD工具部署我们的应用程序。在我们的案例中,我们使用Argo CD进行部署,这是一个用于Kubernetes的开源GitOps持续交付工具。

当sealedsecrets.yaml被部署到Kubernetes集群时,控制器将自动解封SealedSecret并创建一个秘密。它还将关注SealedSecret的任何变化,并将更新相应的秘密。