yq : YAML 리소스를 더 잘 처리하는 데 도움이 되는 명령줄 도구

9515 단어
YAML 파일의 필드를 업데이트하려는 경우 표준 방법은 값을 동적으로 바꿀 수 있는 템플릿 도구를 사용하는 것입니다. 그러나 Kubernetes는 배포된 매니페스트가 정적 YAML 파일이어야 하므로 자체 템플릿 메커니즘을 제공하지 않습니다.
yq 를 입력합니다.
yq는 YAML 파일을 템플릿화하기 위한 훌륭한 명령줄 도구이며 Helm 및 Kustomize 과 같은 인기 있는 도구에 비해 더 가벼운 옵션입니다.

yq는 무엇입니까?


yq는 YAML을 변환하도록 설계된 명령줄 도구입니다. YAML 대신 JSON 변환에 중점을 둔 jq와 유사합니다.

그게 뭘 할 수 있지?


yq YAML 파일을 입력으로 사용할 수 있으며 다음을 수행할 수 있습니다.
  • 파일에서 값을 읽습니다.
  • 새 값을 추가합니다.
  • 기존 값을 업데이트합니다.
  • 새 YAML 파일을 생성합니다.
  • YAML을 JSON으로 변환합니다.
  • 둘 이상의 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 with apt-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 변환과 잘 작동하지만 자체적으로 몇 가지 문제가 있습니다.
  • 두 개의 YAML 파일이 최상위 수준에서 병합됩니다. 예를 들어 .spec.containers[] 아래에 YAML 파일 청크를 추가할 수 없습니다.
  • 파일의 순서가 중요합니다. 순서를 거꾸로 하면 yqmetadata.name 에서 파드 이름에 대한 envoy-pod를 유지합니다.
  • 언제 append and overwrite values 해야 하는지 yq 명시적으로 알려야 합니다. 그것들은 전체 문서에 적용되는 플래그이기 때문에 세분성을 올바르게 얻기가 어렵습니다.

  • 제한 사항에도 불구하고 yq는 특히 소규모 프로젝트에서 작업하는 경우 사용할 수 있는 가능성이 많습니다.

    대안



    더 복잡한 변환을 적용하려면 Kustomize가 yq보다 나은 옵션입니다. Kustomize는 kustomization.yaml라는 YAML 파일을 사용하여 YAML을 템플릿화하는 방법을 결정하여 모든 변경 사항을 추적 가능하게 만듭니다.

    여기에서 Kustomize 및 기타 흥미로운 대안에 대해 자세히 알아볼 수 있습니다. Templating YAML with real code

    좋은 웹페이지 즐겨찾기