はじめに
今回は、Kustomizeのプラグインであるksopsについて、紹介したいと思います。
Kustomizeのプラグインについては、下記の記事を参考にしてください。

【Kubernetes】Kustomizeのプラグインとは
はじめに 今回は、Kustomizeのプラグインについてざっと解説して、デモ用のプラグインを実際
ksopsとは
ksopsは、Kustomizeのプラグインで、SOPSで暗号化されたファイルをKustomizeで扱うことができるようにするものです。
SOPSで暗号化されたテキストベースのファイルやSecretなどのマニフェストを含みつつ、Kustomizeでビルドすることができるので、SOPSとKustomizeを別々に使う必要がなくなります。
GitHub - viaduct-ai/kustomize-sops: KSOPS - A Flexible Kustomize Plugin for SOPS Encrypted Resources
KSOPS - A Flexible Kustomize Plugin for SOPS Encrypted Resources - viaduct-ai/kustomize-sops
SOPSは、暗号化・復号化を行うためのツールです。詳しくは下記を参照してください。

【Kubernetes】SOPSとageでSecretのマニフェストを暗号化
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
インストール
ksopsは、Exec KRM Function形式のKustomizeプラグインなので、実行ファイルをダウンロードする必要があります。
1curl -s https://raw.githubusercontent.com/viaduct-ai/kustomize-sops/master/scripts/install-ksops-archive.sh | bash
できること
できることは、大きく分けて以下の2つです。
- SOPSで暗号化されたマニフェストをKustomizeビルドで復号
- SOPSで暗号化されたファイルからSecretを生成
試してみる
実際に試してみます。
SOPSとksopsの準備
ksopsを使う前に、SOPSと暗号化の鍵を準備します。今回は、暗号化の鍵として、ageを使います。
ageの鍵を生成して、復号化に使われるディレクトリに保存します。(下記の場合は、XDG_CONFIG_HOME=~/.config
を設定して、~/.config/sops/age/keys.txt
にしています)
1age-keygen >> ~/.config/sops/age/keys.txt
また、SOPSの設定ファイルも作成しておきます。
1creation_rules:
2 - unencrypted_regex: "^(apiVersion|metadata|kind|type)$"
3 age: age1tpey7z3lx8dy7hcc6pl7868d4ye8fg2kjcw6ply3tcndywu33glste57nk
4stores:
5 yaml:
6 indent: 2
ksopsの実行ファイルはカレントディレクトリに配置しておきます。
1curl -s https://raw.githubusercontent.com/viaduct-ai/kustomize-sops/master/scripts/install-ksops-archive.sh | bash
SOPSで暗号化されたマニフェストをKustomizeビルドで復号
まずは、SOPSで暗号化されたマニフェストをKustomizeビルドで復号してみます。
作成するファイルなどは下記のようになります。
1.
2├── .sops.yaml
3├── ksops
4├── kustomization.yaml
5├── secret-generator.yaml
6├── secret.enc.yaml
7└── secret.yaml
下記のような暗号化されていないSecretのマニフェストを作成します。
1apiVersion: v1
2kind: Secret
3metadata:
4 name: secret-with-sops-age
5type: Opaque
6data:
7 PASSWORD: dGVzdHBhc3N3b3Jk
これをSOPSで暗号化します。
1sops -e secret.yaml > secret.enc.yaml
暗号化されたファイル(secret.enc.yaml
)は下記のようになります。PASSWORD
の値のみが暗号化されています。
1apiVersion: v1
2kind: Secret
3metadata:
4 name: secret-with-sops-age
5type: Opaque
6data:
7 PASSWORD: ENC[AES256_GCM,data:4Gv2bVsRCz4m7acq5aV0ZA==,iv:GHqS13KI/MRO6wZxbNLo3fsIS87Sq8Jxzfu+ZpVj6J8=,tag:K3VwPMsRupz8EfXIW+P5iw==,type:str]
8sops:
9 age:
10 - recipient: age1tpey7z3lx8dy7hcc6pl7868d4ye8fg2kjcw6ply3tcndywu33glste57nk
11 enc: |
12 -----BEGIN AGE ENCRYPTED FILE-----
13 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGMGNmbEYvQ25jTkZCZnpP
14 UU9KT1BXMm9kTWRJbHdzNlJTK0c4RkdYYXhNCnpvQkExU1RMaWc5S29KTkl3TGdX
15 b0tjRERWQWxZZWgzYnZOWmJLTEh4eGsKLS0tIE9hSGVNMUZjaWU4Nkg1dFE3eE1U
16 V2kwQnNpY254M1djL0hWNDVFM3VMVncKjw4oV3HxmG8Z0S0E526iEMPwdn4jxood
17 WRnvtRG36FkRERKxjDdsBaOi8CA1Y9jhdeQvuaCi/ATJuW7oipOjgA==
18 -----END AGE ENCRYPTED FILE-----
19 lastmodified: "2025-04-17T11:30:27Z"
20 mac: ENC[AES256_GCM,data:l/wbLd5W25tkYAEPHzhkj150BoPfwWSH6pLl4YLPpNqyuUfusUESzndHXnQ/crw0HwYGuiGo4svZDKVc+ME+LxSKYM715VkBx3pw8SfnntxezKiO4jxFRRL2zmSNNCJdZ7ILyeHYIp+xSpisutcxBJTb0HNuyHtq6xO73TmTIhw=,iv:UOm0gu1TAf/EE51HLZgUxjWY9H/Z2qH9tPBexLuKqhs=,tag:QUYQC67rZVY7WVK8uuV+1g==,type:str]
21 unencrypted_regex: ^(apiVersion|metadata|kind|type)$
22 version: 3.10.1
次にKustomizeのプラグインを使うためのsecret-generator.yaml
を作成します。カレントディレクトリにあるksopsの実行ファイルと暗号化したマニフェストを指定しています。
1apiVersion: viaduct.ai/v1
2kind: ksops
3metadata:
4 name: secret-generator
5 annotations:
6 config.kubernetes.io/function: |
7 exec:
8 path: ./ksops
9files:
10 - ./secret.enc.yaml
最後に、kustomization.yaml
を作成し、secret-generator.yaml
を指定します。
1generators:
2 - ./secret-generator.yaml
これで、Kustomizeビルドを実行すると、SOPSで暗号化されたマニフェストが復号されて、Secretが生成されます。
1kustomize build --enable-alpha-plugins --enable-exec .
1❯ kustomize build --enable-alpha-plugins --enable-exec .
2apiVersion: v1
3data:
4 PASSWORD: dGVzdHBhc3N3b3Jk
5kind: Secret
6metadata:
7 name: secret-with-sops-age
8type: Opaque
SOPSで暗号化されたファイルからSecretを生成
次に、SOPSで暗号化されたファイルからSecretを生成してみます。
作成するファイルなどは下記のようになります。
1.
2├── .sops.yaml
3├── ksops
4├── kustomization.yaml
5├── secret-generator.yaml
6├── secret.conf
7└── secret.enc.conf
まずは、暗号化するファイル(secret.conf
)を作成します。
1test=secret
これをSOPSで暗号化します。
1sops -e secret.conf > secret.enc.conf
下記のような暗号化されたファイル(secret.enc.conf
)が生成されます。
1{
2 "data": "ENC[AES256_GCM,data:2kelGQT5b0dX83Y=,iv:PcBSE25oAOYViAtcE0h6hqu6v8ReudEpO9Y53BZi7Vk=,tag:PIb8/2qqVXUe6JS9qmnqlQ==,type:str]",
3 "sops": {
4 "age": [
5 {
6 "recipient": "age1tpey7z3lx8dy7hcc6pl7868d4ye8fg2kjcw6ply3tcndywu33glste57nk",
7 "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4SHN4aW5wRFJ4VGtrbUFt\nemNBZjQzQUIwODZnVkF3OEdJcTdCM0VENEVVCkZiczViNjhHc3lCSDBCam40S25v\nYUFKWmEwVk9ienh2SHhNdERoVnROT0EKLS0tIE53blBGMzhtUVIyUURINnB0QStP\nYjMxOEVNcWhKTkxxdE8wNENEQWdNQmMKYkkFvPusfDWSAjaC28DNetsdi+yPjDoe\ncPIZ1aqEcwlDk05Dg5Gl61gkchRwoa4kUgA+NrgF1Dfu8a7vmqI6xQ==\n-----END AGE ENCRYPTED FILE-----\n"
8 }
9 ],
10 "lastmodified": "2025-04-17T12:10:37Z",
11 "mac": "ENC[AES256_GCM,data:ef9u43aiuS3DHKO2siEDQNMGM4lT8rOKPcWU0edzw/n5eYQJdanmUZKIIQtmR4aB7KuMnGAI5UebtJ6Ea9j1wf9j5jnwsnRDg3hnMDiTH0lL++f1xOy1mP9lyxd0Qx6CUuq6Mco96EtMElOQasqM3j+371AqxVdZqdELETaBR7g=,iv:F1QxSwjD28iwoiNkp/3RQQHeL1XB/zjBi75H/dMjKis=,tag:MBwFQJWlwzS5glCdUkj1sA==,type:str]",
12 "unencrypted_regex": "^(apiVersion|metadata|kind|type)$",
13 "version": "3.10.1"
14 }
15}
プラグインを使うためのsecret-generator.yaml
を作成します。secretFrom
で暗号化したファイルを指定して、Secretを生成できるようになっています。
1apiVersion: viaduct.ai/v1
2kind: ksops
3metadata:
4 name: secret-generator
5 annotations:
6 config.kubernetes.io/function: |
7 exec:
8 path: ./ksops
9secretFrom:
10 - metadata:
11 name: secret-conf
12 type: Opaque
13 files:
14 - ./secret.enc.conf
最後に、kustomization.yaml
を作成します。
1resources:
2 - ./secret-generator.yaml
これで、Kustomizeビルドを実行すると、暗号化されたファイルからSecretが生成されます。
1kustomize build --enable-alpha-plugins --enable-exec .
1❯ kustomize build --enable-alpha-plugins --enable-exec .
2apiVersion: v1
3kind: Secret
4metadata:
5 name: secret-conf
6stringData:
7 secret.enc.conf: test=secret
8type: Opaque
まとめ
ksopsを使うことで、SOPSで暗号化されたファイルをKustomizeで扱うことができるようになります。
ちなみに、暗号化されたファイルからはSecretしか生成できないですが、SOPSで暗号化されたマニフェストはSecret以外でも扱うことができます。
参考
- viaduct-ai/kustomize-sops: KSOPS - A Flexible Kustomize Plugin for SOPS Encrypted Resources
- FiloSottile/age: A simple, modern and secure encryption tool (and Go library) with small explicit keys, no config options, and UNIX-style composability.