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==

유틸리티yqhttps://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==

관련 정보