在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由两部分组成:
-
客户端 - 安装在本地。
-
控制器 - 安装在远程集群上。
为了使控制器能够解密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的任何变化,并将更新相应的秘密。