Closed3
External Secrets OperatorのGeneratorを使ってみる
やりたいこと
External Secrets Operatorは、その名の通り外部管理しているSecretをKubernetes上のSecretとして展開?することによく利用される。目的は、ソースコード上でのSecret管理を避けたいというものだ。
今回はこの主機能?ではなく、サブ機能?であるGeneratorを使ってみたい。
Generatorは、名前のとおりKubernetes内で、パスワードやTokenを生成するための機能だ。こちらの目的としてはおおきく以下の2つあるっぽい。
- 期限をもったTokenを都度生成したい(例えばECR, GCRのようなDockerレジストリアクセス用のToken)
- パスワードを自動生成してもらうことでソースコード上での管理を避ける
私の今回の目的は2の方で、クラスタ内でRedisやDBを立てるときのパスワード等をExternal Secrets Operatorに自動生成にしてもらうことで、開発者がパスワードを管理しなくても良い状態を実現したい。
パスワード生成に特化したものもあるらしいが、他の用途でも利用するであろうExternal Secrets Operatorにのっかるのが良いかなと思う。
External Secrets Operatorのインストール
Helm Chartが用意されているっぽいので使ってみる。
Pulumiを使って入った。Podを確認してみる。
✗ kubectl get po -n external-secrets
NAME READY STATUS RESTARTS AGE
release-dffc68ee-external-secrets-9c955db59-szg2p 1/1 Running 0 6m20s
release-dffc68ee-external-secrets-cert-controller-649d6bccl9fdz 1/1 Running 0 6m20s
release-dffc68ee-external-secrets-webhook-844c97c7b8-vzm7t 1/1 Running 0 6m20s
それぞれが何をやっているのかは不明。
リソースの消費量はたいしたことないので一旦保留にして先に進む。永遠に保留される予感。
✗ kubectl top po -n external-secrets
NAME CPU(cores) MEMORY(bytes)
release-dffc68ee-external-secrets-9c955db59-szg2p 1m 20Mi
release-dffc68ee-external-secrets-cert-controller-649d6bccl9fdz 1m 36Mi
release-dffc68ee-external-secrets-webhook-844c97c7b8-vzm7t 1m 20Mi
Generatorを使ってみる
サンプルは以下にある。
以下のようにPulumi(TypeScript)で定義。
const password = new k8s.apiextensions.CustomResource(
"password",
{
apiVersion: "generators.external-secrets.io/v1alpha1",
kind: "Password",
metadata: {
namespace: this.namespace.metadata.name,
name: "password",
},
spec: {},
},
this.opts,
)
const secret = new k8s.apiextensions.CustomResource(
"password",
{
apiVersion: "external-secrets.io/v1beta1",
kind: "ExternalSecret",
metadata: {
namespace: this.namespace.metadata.name,
name: "password",
},
spec: {
target: {
name: "password",
},
dataFrom: [
{
sourceRef: {
generatorRef: {
apiVersion: "generators.external-secrets.io/v1alpha1",
kind: "Password",
name: "password",
},
},
},
],
},
},
this.opts,
)
反映後、passwordというSecretが作られている。
✗ kubectl get secret -n external-secrets
NAME TYPE DATA AGE
password Opaque 1 9m28s
中身を見ると、data.password
に自動生成されたパスワードが記載されている。
プロパティー名をpassword
から変更できないか調べてみたのだけど、できないっぽい。
それだけが残念。
✗ kubectl get secret -n external-secrets password -o yaml
apiVersion: v1
data:
password: KW8+STg2QWUoRDMyK1Z1T2M5JWI0fW1w
immutable: false
kind: Secret
metadata:
annotations:
reconcile.external-secrets.io/data-hash: f3648f240dcb5ade9116df88a61c728d
creationTimestamp: "2024-03-13T13:40:54Z"
labels:
reconcile.external-secrets.io/created-by: a83be684173f14f016207461ca00b041
name: password
namespace: external-secrets
ownerReferences:
- apiVersion: external-secrets.io/v1beta1
blockOwnerDeletion: true
controller: true
kind: ExternalSecret
name: password
uid: a3104a1f-4c59-4cd7-8e33-93df1970df2b
resourceVersion: "25753945"
uid: 5d98aed1-339a-4cdc-abd0-d58286d9b51d
type: Opaque
このスクラップは2024/03/13にクローズされました