YAML 문법이란 무엇인가?
YAML은 XML, C, 파이썬, 펄, RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식이다. 2001년에 클라크 에반스가 고안했고, Ingy dot Net 및 Oren Ben-Kiki와 함께 디자인했다.
YAML이라는 이름은 "YAML은 마크업 언어가 아니다 (YAML Ain't Markup Language)” 라는 재귀적인 이름에서 유래되었다. 원래 YAML의 뜻은 “또 다른 마크업 언어 (Yet Another Markup Language)”였으나, YAML의 핵심은 문서 마크업이 아닌 데이터 중심에 있다는 것을 보여주기 위해 이름을 바꾸었다. 오늘날 XML과 JSON이 데이터 직렬화에 주로 쓰이기 시작하면서, 많은 사람들이 YAML을 '가벼운 마크업 언어'로 사용하려 하고 있다.
기본 문법
1. 들여쓰기
person:
name: cloud
job: sysadmin
skills:
- docker
- k8s
들여쓰기는 기본적으로 2칸 또는 4칸을 지원한다.
2칸 들여쓰기를 추천한다.
2. Data 정의
apiVersion: v1
kind: Pod
metadata:
name: echo
labels:
type: app
데이터는 key: value 형식으로 정의한다.
k8s 경우 kind에 Pod, Services, namespace 등 다양한 value가 들어갈 수 있다.
3. 배열 정의
person:
name: cloud
job: sysadmin
skills:
- docker
- k8s
배열은 -로 표기한다.
4. 주석
# comment
person:
name: cloud
job: sysadmin
skills:
- docker
- k8s
주석은 #로 표시한다.
5. 참/거짓, 숫자 표현
study_hard: yes
give_up: no
hello: True
world: TRUE
manual: false
참, 거짓은 true/false, yes/no를 지원한다.
# number
version: 1.2
# string
version: "1.2"
따옴표 없이 사용하면 number, 따옴표를 사용하면 string이다.
6. 줄 바꿈
comment_line_break: |
Hello my name is wook.
Im developer.
comment_single_line: >
Hello world
my first yml syntax.
|는 줄바꿈을 포함하고 , >는 줄바꿈을 무시한다.
7. 띄어쓰기
# error (not key-value, string)
key:value
# ok
key: value
key value 사이에는 반드시 빈칸이 필요하다.
8. 문자열 따옴표
# error
windows_drive: c:
# ok
windows_drive: "c:"
windows_drive: 'c:'
대부분의 문자열을 따옴표 없이 사용할 수 있지만 :가 들어가는 경우 반드시 따옴표가 필요하다.
k8s yaml 작성 방법
apiVersion: v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.2
위 Yaml 파일을 보면 Deployment에 대한 yaml 파일임을 알 수 있다. 이를 하나씩 분석 해 보자.
1. apiVersion
이 오브젝트를 생성하기 위해 사용할 쿠버네티스 API 버전을 명시한다. 특정 k8s object를 사용하기 위해 어떤 API를 사용해야 하는지 공식문서에 나와있다.
Kind | apiVersion |
CertificateSigningRequest | certificates.k8s.io/v1beta1 |
ClusterRoleBinding | rbac.authorization.k8s.io/v1 |
ClusterRole | rbac.authorization.k8s.io/v1 |
ComponentStatus | v1 |
ConfigMap | v1 |
ControllerRevision | apps/v1 |
CronJob | batch/v1beta1 |
DaemonSet | extensions/v1beta1 |
Deployment | extensions/v1beta1 |
Endpoints | v1 |
Event | v1 |
HorizontalPodAutoscaler | autoscaling/v1 |
Ingress | extensions/v1beta1 |
Job | batch/v1 |
LimitRange | v1 |
Namespace | v1 |
NetworkPolicy | extensions/v1beta1 |
Node | v1 |
PersistentVolumeClaim | v1 |
PersistentVolume | v1 |
PodDisruptionBudget | policy/v1beta1 |
Pod | v1 |
PodSecurityPolicy | extensions/v1beta1 |
PodTemplate | v1 |
ReplicaSet | extensions/v1beta1 |
ReplicationController | v1 |
ResourceQuota | v1 |
RoleBinding | rbac.authorization.k8s.io/v1 |
Role | rbac.authorization.k8s.io/v1 |
Secret | v1 |
ServiceAccount | v1 |
Service | v1 |
StatefulSet | apps/v1 |
2. kind
어떤 종류의 오브젝트를 생성하고자 하는지. 생성할 k8s object 타입을 지정한다 (ex: Service, Pod, Deployment...)
3. metadata
오브젝트에 이름을 부여하는 것이다. 오브젝트를 유일하게 구분지어 줄 데이터이다.
- name: 동일한 namespace 상에서 유일한 값
- labels: 특정 k8s object만 나열하거나 검색할 때 유용하게 쓰이는 key-value 쌍
- spec: 생성할 오브젝트의 구체적인 내용을 정의하는 spec. spec에 대한 포맷은 object 종류마다 다르다.
자주 사용되는 spec 항목들을 살펴보자- contianers: pod에는 1개 이상의 container 포함 가능, containers에서 원하는 만큼 container 정의해서 추가 가능
- image: pull 받을 Docker 이미지 주소
- replicas: 원하는 pod의 개수
- selector: controller가 어떤 pod를 감시해야하는지
- template: 새 pod를 런칭하는데 사용하는 템플릿selectors의 값이 template의 labels과 일치해야 관리되는 pod를
제대로 선택
4. 자주 사용되는 Object
- Deployment
- 코드배포를 세밀하게 제어할 수 있는 오브젝트. pod 복제, 배포 일시중지, 재개 및 롤백 가능
- Service
- k8s에 다양한 어플리케이션을 올리고 어플리케이션간 통신이 필요한 경우 Service로 오픈하여 외부에 오픈 및 다른 어플리케이션과 통신에 활용
- Ingress
- 클러스터 내 서비스에 대한 외부 접근을 관리하는 오브젝트, 일반적으로 HTTP를 관리
- Job
- 배치 오브젝트, 주기적으로 스케쥴링 된 태스크를 수행할 때 사용
출처
YAML 문법 | 쿠버네티스 안내서 (subicura.com)
[k8s] kubernetes resource template - yaml 파일 작성법 · MOONGCHI (berrrrr.github.io)
'[Kubernetes]' 카테고리의 다른 글
sample devops end to end project v1- devops project | ci/cd declarative pipeline using devops tools (0) | 2023.07.22 |
---|---|
[마이크로 서비스] 사용하지 않는 경우!! (0) | 2023.07.11 |
[k8s] Deployments란 무엇인가? & Update 방식 (0) | 2022.11.23 |
[k8s] kubernetes의 Service가 무엇인가? (0) | 2022.11.22 |
[k8s] Helm을 통해 Prometheus, Grafana 적용하기 (0) | 2022.11.22 |
[k8s] 파드란 무엇인가, 파드 만들기(명령어로 생성 및 yaml로 생성) (0) | 2022.11.21 |
[K8s] 쿠버네티스란 무엇인가? (0) | 2022.11.16 |
[k8s] 프로메테우스란 무엇인가? (개념 및 아키텍쳐) (0) | 2022.11.15 |
댓글