yq : YAML 리소스를 더 잘 처리하는 데 도움이 되는 명령줄 도구
yq
를 입력합니다.yq
는 YAML 파일을 템플릿화하기 위한 훌륭한 명령줄 도구이며 Helm 및 Kustomize 과 같은 인기 있는 도구에 비해 더 가벼운 옵션입니다.yq는 무엇입니까?
yq
는 YAML을 변환하도록 설계된 명령줄 도구입니다. YAML 대신 JSON 변환에 중점을 둔 jq
와 유사합니다.그게 뭘 할 수 있지?
yq
YAML 파일을 입력으로 사용할 수 있으며 다음을 수행할 수 있습니다.설치
다음을 사용하여 Mac OS에 설치할 수 있습니다
yq
.$ brew install yq
다음이 포함된 Linux:
$ sudo add-apt-repository ppa:rmescandon/yq
sudo apt-get install yq
In case you don't have the
add-apt-repository
command
installed, you can install it withapt-get install software-
.
properties-common
Windows를 사용하는 경우 Github 에서 실행 파일을 다운로드할 수 있습니다.
사용 사례 시나리오
1. YAML 값 읽기
다음 Pod로 작업하고 있다고 가정해 보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
env:
- name: DB_URL
value: postgres://db_url:5432
다음 명령을 사용하여 환경 변수
ENV
의 값을 읽을 수 있습니다.$ yq r pod.yaml "spec.containers[0].env[0].value"
postgres://db_url:5432
$
명령은 다음과 같이 작동합니다.
yq r
는 YAML 파일에서 값을 읽는 명령입니다. pod.yaml
는 읽고자 하는 YAML의 파일 경로입니다. spec.containers[0].env[0].value
는 쿼리 경로입니다. 2. YAML 값 변경
여기서 앞의 예를 들어보자. 프로덕션 환경에 앱을 배포하고 프로덕션 데이터베이스에 대한 URL을 변경하려고 한다고 가정해 보겠습니다.
다음은 단일 명령을 사용하여 동일한 작업을 수행하는 방법입니다.
$ yq w pod.yaml "spec.containers[0].env[0].value" "postgres://prod:5432"
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
env:
- name: DB_URL
value: postgres://prod:5432
$
여기에서 알 수 있듯이
yq
결과를 표준 출력에 인쇄했습니다. YAML을 제자리에서 편집하려면 -i
플래그를 추가해야 합니다.yq
(bash 포함)보다 sed
를 사용하는 이점은 sed
, yq
가 YAML 형식을 이해하고 구조화된 마크업을 탐색하고 맹글링할 수 있다는 것입니다.Note:
sed
treats files as strings and it doesn't mind if the
file isn't a valid YAML.
3. YAML 파일 병합
클러스터에 제출된 모든 Pod에 추가 컨테이너를 주입한다고 가정해 보겠습니다.
그러나 Admission Webhook 을 사용하는 대신 배포 스크립트에 추가 명령을 추가하기로 결정합니다.
추가 컨테이너에 대한 YAML 구성을 YAML 파일로 저장할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: envoy-pod
spec:
containers:
- name: proxy-container
image: envoyproxy/envoy:v1.12.2
ports:
- containerPort: 80
다음과 같은 Pod가 있다고 가정합니다.
$ apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
env:
- name: DB_URL
value: postgres://db_url:5432
$
다음 명령을 실행하고 두 YAML을 병합할 수 있습니다.
$ yq m --append pod.yaml envoy-pod.yaml
Please notice the --append flag that is necessary to append
values to an array. You can find more details in the official
documentation.
출력에는 Envoy라는 프록시가 추가 컨테이너로 있어야 합니다.
$ apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
env:
- name: DB_URL
value: postgres://db_url:5432
- name: proxy-container
image: envoyproxy/envoy:v1.12.2
ports:
- containerPort: 80
Please note that
yq
sorts the YAML fields in the output alphabetically, so the order of fields in your output could be different from the > above listing.
즉, 두 개의 YAML 파일이 하나로 병합됩니다.
yq 사용의 한계?
yq
는 YAML 변환과 잘 작동하지만 자체적으로 몇 가지 문제가 있습니다..spec.containers[]
아래에 YAML 파일 청크를 추가할 수 없습니다. yq
는 metadata.name
에서 파드 이름에 대한 envoy-pod를 유지합니다. yq
명시적으로 알려야 합니다. 그것들은 전체 문서에 적용되는 플래그이기 때문에 세분성을 올바르게 얻기가 어렵습니다. 제한 사항에도 불구하고
yq
는 특히 소규모 프로젝트에서 작업하는 경우 사용할 수 있는 가능성이 많습니다.대안
더 복잡한 변환을 적용하려면 Kustomize가
yq
보다 나은 옵션입니다. Kustomize는 kustomization.yaml
라는 YAML 파일을 사용하여 YAML을 템플릿화하는 방법을 결정하여 모든 변경 사항을 추적 가능하게 만듭니다.여기에서 Kustomize 및 기타 흥미로운 대안에 대해 자세히 알아볼 수 있습니다. Templating YAML with real code
Reference
이 문제에 관하여(yq : YAML 리소스를 더 잘 처리하는 데 도움이 되는 명령줄 도구), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vikcodes/yq-a-command-line-tool-that-will-help-you-handle-your-yaml-resources-better-8j9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)