YAML 입문

YAML (YAML Ain't Markup Language)

YAML은 가독성이 뛰어난 데이터 직렬화 언어로 설정 파일을 기술할 때 많이 사용된다.

nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
    name: nginx
spec:
    containers:
    - name: nginx
      image: nginx:latest

apiVersion은 키이고, v1은 값이다.

pyhon 실습

yaml-reader.py
import yaml                            ## 라이브러리 임포트
f = open("nginx-pod.yaml", "r+")       ## 파일 열기
data = yaml.load(f)                    ## YAML 파일 읽어서 변수 data에 적재

print(data["apiVersion"])
print(data["Kind"])
print(data["metadata"]
$ python ./yaml-reader.py
v1
Pod
{'name': 'nginx'}

키와 값이 출력 되고 metadata의 경우 밑에 name 이 있다는 계층 구조를 표현한 것이다.

name 앞에 하이픈은 containers가 배열임을 의미하여 하이픈으로 시작하는 줄은 배열의 한 요소가 시작됨을 의미한다.

이어지는 하이픈이 없는 줄들은 하이픈이 있는 줄과 같은 요소에 포함된다.

containers:
    - dog
    - cat
    - bird

위 YAML을 읽으면 dog, cat, bird는 각각 containers라는 배열의 한 요소가 된다.

{'containers': ['dog', 'cat', 'bird']}
>>> print data['containers'][2]
bird

배열의 특정 요소에 접근하기 위해서 위와 같이 몇 번째 요소인지를 지정한다.

이에 반해 하이픈이 없는 경우에는 이전 요소에 포함된다.

containers:
    - dog
      cat
    - bird

앞의 예에서는 dog와 cat이 배열의 0번째 요소에 포함된다.

{'containers': ['dog cat', 'bird']}

따라서 매니페스트에서 키 name과 image는 같은 배열의 요소다.

containers:
- name: nginx
  image: nginx:latest
>>> print data['spec']['containers'][0]
{'image': 'nginx:latest', 'name:'nginx'}

위의 경우 containers 배열의 인덱스 0에 접근하면 위와 같이 2개의 키값 쌍이 출력된다.

하나의 파드에 2개 이상의 컨테이너를 배치하는 사이드카 패턴의 매니페스트에는 containers에 여러 개의 컨테이너를 정의한다.

spec:
containers:
- name: nginx                ## 메인 컨테이너
  image: nginx:latest
- name: color                ## 사이드카 컨테이너
  image: maho/c-cloner:0.1
>>> print data["spec"]["containers"]
[{'image': 'nginx:latest', 'name': 'nginx'}, {'image': 'mahe/c-cloner:1.0', 'name': 'cloner'}]
>>> import json
>>> print(json.dumps( data["spec"]["containers"], sort_keys=False, indent=4))
[
        {
                "image": "nginx:latest",
                "name": "nginx"
        },
        {
                "image": "mahe/c-cloner:1.0",
                "name": "cloner"
        }
]

들여쓰기를 하면 위와 같다. 배열을 의미하는 [ ] 안에 {}가 2개 있음을 알 수 있다.

매니페스트 YAML 작성 포인트

1. 콜론( : )의 왼쪽은 키, 오른쪽은 값

  • "apiVersion: v1"에서 apiVersion이 키, v1이 값

  • "containers"의 경우 containers가 키고 그 밑에 이어지는 내용들이 값이 된다.

2. 들여쓰기로 복합적 데이터 구조를 표현한다.

  • 키 metadata 밑에 name의 키와 값을 기술한다.

  • 키 spec 밑에 containers, volumes 등의 키와 값을 기재한다.

3. 하이픈으로 시작하는 줄은 배열의 요소가 된다. 이어서 하이픈이 없는 줄은 윗 줄과 같은 배열의 요소로 취급된다.

YAML 의 구조

containers:
- name: nginx                ## 첫 번째 요소 (메인 컨테이너)
  image: nginx:latest
- name: color                ## 두 번째 요소 (사이드카 컨테이너)
  image: maho/c-cloner:0.1

Last updated