Kubernetes/03. k8s 오브젝트 기본 및 관리

[쿠버네티스] 명령형 오브젝트 구성 방법 / yaml 의 기초 설명

Jaden Park 2021. 6. 17. 00:40

들어가며:
YAML 이란?
YAML 요소
YAML 문법
YAML을 이용한 쿠버네티스 오브젝트

  • kind에 따른 apiVersion 확인 법

끝마치며: 참고

  • 오브젝트 리소스 문서 확인 명령
  • vim 에디터에서 YAML 파일 작성 시 인덴트, 하이라이팅, 들여쓰기 등 기능을 추가하여 효율적으로 작성하는 법
  • nano 에디터에서 YAML 파일 작성 시 효율적으로 작성하는 법

들어가며:

k8s 오브젝트는 k8s 시스템에서 정보를 담고 있는 개체입니다. 이런 오브젝트는 YAML 문법으로 정의됩니다.


YAML 이란?

 

YAML은 XML, C, Python, Perl, RFC2822 에서 정의된 개념을 기반으로 만들어진 사람이 읽고 쓰기 쉽게 데이터를 정의하는 양식입니다. 2001년 클라크 에반스에 의해 고안됐습니다.

YAML 이라는 이름은 YAML ain't Markup Language 라는 뜻을 가지고 있습니다. 과거에는 Another Markup Language 의 의미였으나, YAML의 핵심은 문서 마크업이 아닌 데이터 중심에 있다는 것을 보여주기 위해 이름을 바꾸었습니다.


YAML 요소

YAML은 모든 데이터를 스칼라, 리스트, 해시로 데이터를 표현합니다.

  1. 스칼라/스트링
banana
"banana"
'banana'
I am a boy

스칼라는 단순 간단한 문자 또는 문자열입니다. 보통 아무 표시를 하지 않아도 됩니다. 쌍/홀 따음표로 둘러쌓아 사용해도 동일합니다.

 

 

  1. 리스트/어레이
- Seoul
- Tokyo
- Osaka

하이픈으로 시작해야 하며 한 줄에 하나의 요소를 표현합니다.

 

 

  1. 해시/딕셔너리
name: Jaden Park
age: 26

 

 

  1. 해시의 리스트
- name: Jaden Park
  age: 26
- name: Mary Sarah
  age: 26

 

 

  1. 리스트의 해시
man:
  - Jaden Park
  - John Jones
woman:
  - Mary Sarah
  - Sunny Susan

YAML 문법

YAML의 문자열은 UTF-8, UTF-16의 유니코드 문자 집합을 사용합니다.
공백 문자를 이용하여 들여 쓰기로 계층구조를 구분합니다. 이때 탭은 절때 사용하지 않도록 합니다.
시작은 하이픈3개 (---), 끝은 마침표 3개(...) 로 사용합니다. 하이픈 3개는 시작할 때 삽입하는 것이 일반적입니다.
카멜표기법을 따르는 경우가 많습니다.


YAML을 이용한 쿠버네티스 오브젝트

쿠버네티스는 클러스터의 상태를 나타내기 위해 오브젝트 개체를 정의하여 사용합니다. 쿠버네티스에서 오브젝트를 생성할 때, 오브젝트에 대한 기본적인 정보와 함께 의도한 상태를 기술한 오브젝트 스펙(spec)을 제시합니다. 오브젝트를 생성하기 위해 우리는 YAML 혹은 JSON을 사용하며 일반적으로 YAML이 편리해 많이 사용합니다.

다음은 파드 오브젝트를 기술한 간단한 YAML 파일 예제 입니다.

apiVersion: v1
kind: Pod
metadata:
  name: myweb-pod
  labels:
    app: myweb
    type: frontend
spec:
  containers:
  - name: nginx-container
    image: nginx

모든 오브젝트 정의 시 필수적으로 요구되는 필드

  • apiVersion: 오브젝트를 생성하기 위한 API 버전.
    • 오브젝트 API 버전은 kind 의 종류에 따라 다릅니다.

 

  • kind: 오브젝트의 종류
    • 예: pod, services, replicaset ...

 

  • metadata: name, UID, namespace 등을 포함하는 기본적인 정보
  • spec: 오브젝트의 상태 정의
    • spec 내의 정의할 요소는 정의하고자 하는 오브젝트의 종류에 따라 다릅니다.

 

kind 에 따른 apiVersion 확인하는 법

쿠버네티스 api 규칙

쿠버네티스의 모든 구성요소는 API 서버를 통해 API로 메시지를 주고 받습니다. 쿠버네티스는 리소스에 대한 표현을 쉽게 하기 위해 /api/v1 또는 /apis/extensions/v1beta1 과 같이 각각 다른 API 경로에서 복수의 API 버전을 지원합니다.
같은 종류의 리소스라고 하더라도 API 버전이 다른 경우는 안전성이나 기술 지원의 수준이 다르다는 것을 암시합니다.

// 클러스터에서 지원되는 API 버전 확인
kubectl api-versions

//클러스터에서 지원되는 API 리소스 확인
kubectl api-resources

주로 사용하는 리소스 분류

리소스 그룹 api
configmaps core v1
endpoints core v1
limitranges core v1
namespaces core v1
nodes core v1
persistentvolumeclaims core v1
persistentvolumes core v1
pods core v1
replicationcontrollers core v1
resourcequotas core v1
secrets core v1
serviceaccounts core v1
services core v1
daemonsets apps apps/v1
deployments apps apps/v1
replicasets apps apps/v1
statefulsets apps apps/v1
horizontalpodautoscalers autoscaling autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
cronjobs batch batch/v1beta1
batch/v1
jobs batch batch/v1beta1
batch/v1
certificatesigningrequests certificates.k8s.io certificates.k8s.io/v1
certificates.k8s.io/v1beta1
ingresses extensions extensions/v1beta1
clusterrolebindings rbac.authorization.k8s.io rbac.authorization.k8s.io/v1beta1
rbac.authorization.k8s.io/v1
clusterroles rbac.authorization.k8s.io rbac.authorization.k8s.io/v1beta1
rbac.authorization.k8s.io/v1
rolebindings rbac.authorization.k8s.io rbac.authorization.k8s.io/v1beta1
rbac.authorization.k8s.io/v1
roles rbac.authorization.k8s.io rbac.authorization.k8s.io/v1beta1
rbac.authorization.k8s.io/v1
storageclasses storage.k8s.io storage.k8s.io/v1
storage.k8s.io/v1beta1

끝마치며: 참고

오브젝트 리소스 문서 확인 명령

익숙하지 않을 때는 아래와 같이 찾아보며 작성하는 것을 권장합니다.

kubectl explain <resource>

kubectl explain pod
kubectl explain pod.spec
kubectl explain pod.spec.containers
kubectl explain pod.spec.containers.name
kubectl explain pod.spec --recursive

 

 

vim 에디터에서 YAML 파일 작성 시 인덴트, 하이라이팅, 들여쓰기 등 기능을 추가하여 효율적으로 작성하는 법

~/.vimrc 파일에 아래와 같이 작성하면 됩니다.

syntax on
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab autoindent

 

 

nano 에디터에서 YAML 파일 작성 시 효율적으로 작성하는 법

위 경로에 아래와 같은 문서를 입력해주면 됩니다.

sudo cat /usr/share/nano/yaml.nanorc

# Supports `YAML` files
syntax "YAML" "\.ya?ml$"
header "^(---|===)" "%YAML"

## Keys
color magenta "^\s*[\$A-Za-z0-9_-]+\:"
color brightmagenta "^\s*@[\$A-Za-z0-9_-]+\:"

## Values
color white ":\s.+$"
## Booleans
icolor brightcyan " (y|yes|n|no|true|false|on|off)$"
## Numbers
color brightred " [[:digit:]]+(\.[[:digit:]]+)?"
## Arrays
color red "\[" "\]" ":\s+[|>]" "^\s*- "
## Reserved
color green "(^| )!!(binary|bool|float|int|map|null|omap|seq|set|str) "

## Comments
color brightwhite "#.*$"

## Errors
color ,red ":\w.+$"
color ,red ":'.+$"
color ,red ":".+$"
color ,red "\s+$"

## Non closed quote
color ,red "['\"][^['\"]]*$"

## Closed quotes
color yellow "['\"].*['\"]"

## Equal sign
color brightgreen ":( |$)"