例えば my-secret
という Secret オブジェクトが Kubernetes の default
ネームスペースに存在するとき、その .data.apiKey
をランダムな UUID で置き換えたいとする。そのときは次のようなコマンドを実行すればよい。
kubectl get secret my-secret -o json | jq --arg apiKey "$(cat /proc/sys/kernel/random/uuid | tr -d '\n' | base64 -w 0)" '.data["apiKey"]=$apiKey' | kubectl apply -f -
十分に読める内容だと思うけど、説明をすると次のようになる。
cat /proc/sys/kernel/random/uuid
でランダムな UUID を取得する- Kubernetes の Secret は base64 値で保存する必要があるので、パイプでつなげて base64 にしている (結果を
apiKey
という変数に保存する) - 現状の
my-secret
から.data.apiKey
をapiKey
で置き換えて、それをパイプ経由でkubectl apply
する
補足
本来であれば Kubernetes に変更を加えるときは、変更履歴を追えるようにするべきだ。具体的には YAML ファイルを Git で管理して、Git リポジトリへのプッシュをトリガーにして Kubernetes に変更を加えるようにするとよい。なお Helm や Kustomize を使う場合でも考え方は同じで、変更内容をファイルとして Git で管理して履歴を残すのが正しいプラクティスである。
上記の内容はワンライナーのシェルスクリプトで Kubernetes の Secret を変更しており、行儀が悪い。想定としては Kubernetes の初期設定の一環として実行することを想定している。