【KSOPS】KustomizeとSOPSを連携させる

2025.04.17
2025.04.17
Kubernetes

はじめに

今回は、Kustomizeのプラグインであるksopsについて、紹介したいと思います。

Kustomizeのプラグインについては、下記の記事を参考にしてください。

【Kubernetes】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

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のマニフェストを暗号化

【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の設定ファイルも作成しておきます。

.sops.yaml
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のマニフェストを作成します。

secret.yaml
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の値のみが暗号化されています。

secret.enc.yaml
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の実行ファイルと暗号化したマニフェストを指定しています。

secret-generator.yaml
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を指定します。

kustomization.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)を作成します。

secret.conf
1test=secret

これをSOPSで暗号化します。

1sops -e secret.conf > secret.enc.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を生成できるようになっています。

secret-generator.yaml
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を作成します。

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以外でも扱うことができます。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee