![yq를 사용하여 k8s 비밀 값을 Base64로 인코딩합니다.](https://linux55.com/image/181029/yq%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20k8s%20%EB%B9%84%EB%B0%80%20%EA%B0%92%EC%9D%84%20Base64%EB%A1%9C%20%EC%9D%B8%EC%BD%94%EB%94%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
간단한 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==