在 K8s 的管理过程中,像 Secret 这种资源并不好维护,KubeSeal 提供了一种相对简单的方式来对原始 Secret 资源进行加密,并通过控制器进行解密,以此来规避 Secret 泄露风险。
安装
安装 KubeSeal
1 | $ wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/kubeseal-0.18.0-linux-amd64.tar.gz |
安装controller
1 | $ kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/controller.yaml |
执行上述命令之后会在 kube-system
命名空间下启动一个控制器 Pod:
1 | $ k get pod -n kube-system |grep seal |
Pod 启动之后,使用端口转发映射到本地:
1 | $ kubectl -n kube-system port-forward svc/sealed-secrets-controller 8080:8080 |
使用方式
生成加密文件
首先在本地创建一个名为 secret-example.yaml
的文件,编码前的 secret
字段为:mysupersecret
1 | apiVersion: v1 |
使用如下命令将 secret-example.yaml
,转换为加密后的文件 sealed-secret-example.yaml
1 | $ kubeseal --secret-file secret-example.yaml --sealed-secret-file sealed-secret-example.yaml |
sealed-secret-example.yaml
的内容如下,spec.encryptedData.secret
就是加密后的内容:
1 | apiVersion: bitnami.com/v1alpha1 |
可以将加密后的文件保存到 Gitlab。
创建加密文件:
1 | $ k create -f sealed-secret-example.yaml |
在创建完加密文件之后,Controller 会解密并生成对应的 secret
:
1 | $ k get secrets |grep secret-example |
查看由 Controller 生成的 secret
资源内容,可以看到 data.secret
与上面创建的 secret-example.yaml
文件内容一致:
1 | $ k get secret secret-example -oyaml |
注:
SealedSecret
和对应的secret
资源必须位于相同的命名空间
TIPs
-
kubeseal
支持如下API:Route Description /healthz Health check route useful for the readiness and liveness probes and for creating an external probe; for example with blackbox exporter. /metrics Endpoint for the Prometheus to retrieve the controller’s metrics. /v1/verify Validates a secret. /v1/rotate Rotates the secret. /v1/cert.pem Retrieves the public certificate. -
上例中 Controller 用的证书是自己生成的,还可以指定自己的证书,更方便迁移和管理
-
使用
KubeSeal
可能会有一种困惑,如果用户直接挂载其他命名空间的 secret,那么这样可能会导致 secret 泄露。官方对此有作解释,如可以通过 RBAC 限制用户可以访问的命名空间以及资源类型。更多参见README
参考
本文转载自:「 博客园 」,原文:https://url.hi-linux.com/vakJR ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。