Closed3

External Secrets OperatorのGeneratorを使ってみる

dekimasoondekimasoon

やりたいこと

External Secrets Operatorは、その名の通り外部管理しているSecretをKubernetes上のSecretとして展開?することによく利用される。目的は、ソースコード上でのSecret管理を避けたいというものだ。

今回はこの主機能?ではなく、サブ機能?であるGeneratorを使ってみたい。
Generatorは、名前のとおりKubernetes内で、パスワードやTokenを生成するための機能だ。こちらの目的としてはおおきく以下の2つあるっぽい。

  1. 期限をもったTokenを都度生成したい(例えばECR, GCRのようなDockerレジストリアクセス用のToken)
  2. パスワードを自動生成してもらうことでソースコード上での管理を避ける

私の今回の目的は2の方で、クラスタ内でRedisやDBを立てるときのパスワード等をExternal Secrets Operatorに自動生成にしてもらうことで、開発者がパスワードを管理しなくても良い状態を実現したい。

パスワード生成に特化したものもあるらしいが、他の用途でも利用するであろうExternal Secrets Operatorにのっかるのが良いかなと思う。

https://github.com/carvel-dev/secretgen-controller

dekimasoondekimasoon

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
dekimasoondekimasoon

Generatorを使ってみる

サンプルは以下にある。

https://external-secrets.io/main/api/generator/password/#example-manifest

以下のように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にクローズされました