単純な 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
質問に使用されているように見える特定のユーティリティでは、jq
YAMLを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==