yq を使用して k8s シークレット値を Base64 にエンコードします。

yq を使用して k8s シークレット値を Base64 にエンコードします。

単純な Secret.yaml ファイルがあります。

env:
  USERNAME: user
  PASSWORD: pass

k8sシークレットを生成するために使用される値をエンコードするためにyq / jqを使用しようとしているので、最終結果は次のとおりです。

apiVersion: v1
kind: Secret
metadata:
  name: my-service
type: Opaque
data:
   USERNAME: <base64 encoded>
   PASSWORD: <base64 encoded>

私は以下を使用しようとしています:

yq r secret.yaml ".env" -j | jq -r ' to_entries[] | "\(.value)" | @base64'"

これにより、Base64でエンコードされた値が提供されますが、最終出力にエンコードされた値を挿入することはできません。

ループの使用を避けようとしていますが、きれいな解決策が見つからない場合は、ループを使用します。

助けてください。

答え1

jqデータに適用する式は次のとおりです。

.env |= map_values(@base64) | { data: .env }

envこれにより、最上位構造のすべての値がBase64でエンコードされるように更新されます。次に、envキーの名前をdata

yq質問に使用されているように見える特定のユーティリティでは、jqYAMLをJSONに変換し、結果のJSONに適用してから再びYAMLに変換することによって実行されます。

$ yq -j r file.yml | jq '.env |= map_values(@base64) | { data: .env }' | yq -P r -
data:
  PASSWORD: cGFzcw==
  USERNAME: dXNlcg==

yqユーティリティhttps://kislyuk.github.io/yq/(つまり、質問に使用されていない)これは、より簡潔な方法を使用して行われます。

$ yq -y '.env |= map_values(@base64) | { data: .env }' file.yml
data:
  USERNAME: dXNlcg==
  PASSWORD: cGFzcw==

上記のプロセスを実行したら、追加の静的データを追加できます。

答え2

.data['key']Secretsでbase64でエンコードされた値を設定する代わりに、デコードされた値をに渡すことができます.stringData['key']

秘密を作成する場合:

stringData:
  USERNAME: user
  PASSWORD: pass

使用する結果のオブジェクトは、kubectl get secret -o yaml実際には次のもので構成されます。

data:
  USERNAME: dXNlcg==
  PASSWORD: cGFzcw==

関連情報