Tech Blog
[MLOps] 5. 쿠버네티스의 기본 개념과 YAML 본문
수많은 컨테이너들을 정해진 룰에 따라 관리해주는 기술이 컨테이너 오케스트레이션이며, 그 중에서 가장 핫한 기술이 쿠버네티스입니다. 쿠버네티스는 설치가 어렵고, 운영, 모니터링하면서 이슈가 생기면 해결하기 복잡하며, 기술적인 도전이 많이 필요한 기술입니다. 따라서 아마존 eks, 구글 쿠버네티스 엔진, 에져 쿠버네티스 서비스와 같이 쿠버네티스를 감싼 관리형 서비스를 제공하여 사용자는 설치에 대한 어려움 없이 사용료만 지불하면 사용하는데만 신경쓸 수 있습니다.
간단한 실습을 하기에는 유료 서비스를 사용하기에도 부담이 될 수 있기 때문에 이미 많이 나와있는 오픈소스 프로젝트들을 활용할 수 있습니다. (minikube, k8s, k3s) 그 중에서도 minikube를 사용하여 앞으로의 실습을 진행해보도록 하겠습니다.
실습을 진행하기에 앞서 쿠버네티스의 기본적인 컨셉을 알아보도록 하겠습니다.
1. 쿠버네티스의 컨셉
1) 선언형 인터페이스와 Desired State
쿠버네티스에는 Desired State, 즉 원하는 상태라는 개념이 존재합니다. 명령형 인터페이스가 아닌 선언형 인터페이스를 사용합니다. 예를 들어, A라는 리소스를 만든다고 하면, 명령형 인터페이스는 "~하고 ~해서 A를 만들어줘" 와 같이 과정을 명시해줍니다. 반면, 쿠버네티스가 사용하는 선언형 인터페이스는 "과정이 어떻든 간에 A를 하나 만들어주면 좋겠어"처럼 원하는 최종 결과만 명시합니다. 쿠버네티스 내부도 선언형 인터페이스에 맞는 방식으로 리소스들을 관리하도록 구현되어있기 때문에 선언형 인터페이스를 사용하는 것이 좋습니다.
2) Master Node 와 Worker Node 의 분리
쿠버네티스 클러스터는 보통 하나 이상의 서버를 묶어서 구축합니다. 위와 같이 클러스터를 구성하면 물리적으로는 여러대의 서버가 분리가 되어있어도, 실제로 사용하는 사용자의 입장에서는 가상화가 되어서 (하드웨어의 소프트화) 마치 하나의 컴퓨터를 사용하는 것 처럼 여러 대의 서버를 마음껏 사용할 수 있게됩니다. 이 특징은 쿠버네티스를 비롯하여 여러 클라우드의 기본적인 컨셉입니다.
클러스터는 Master 역할을 하는 Control Plane 노드와 Worker 역할을 하는 다수의 노드로 이루어져 있습니다.
Control Plane : 여러개의 worker 노드들을 관리하고 모니터링하면서 클라이언트로부터 요청을 받게되고, 그 요청에 맞는 워커 노드를 스케줄링 해서 해당 노드로 요청을 전달하는 역할을 합니다.
- API server: 클라이언트가 보내는 요청을 받는 서버
- cloud controller manager
- controller manager
- etcd: 사용자가 보낸 요청의 desired state를 key-value 형식으로 저장하는 데이터베이스
워커 노드들은 Control Plane으로부터 명령을 받아서 실제로 수행해야합니다.
- kubelet: Control Plane으로부터 명령을 받고, 본인의 워커노드의 현재 상태를 Control Plane으로 전달하는 컴포턴트
- 각각의 워커 노드 내부에서는 kubelet의 명령을 다시 받아서 도커나 컨테이너디 같은 컨테이너 런타임 엔진이 실제로 컨테이너를 생성하고 관리하는 역할을 담당하게 됩니다.
2. YAML
yaml은 데이터 직렬화에 쓰이는 포맷 양식 중 하나입니다. 데이터 직렬화란 서비스간에 Data를 전송할 때 쓰이는 포맷으로 변환하는 작업입니다. 다른 데이터 직렬화 포맷은 XML, JSON이 있으며, yaml 형식의 파일 확장자는 .yaml, .yml 을 사용합니다. 쿠버네티스 마스터에게 요청을 보낼 때는 json, yaml처럼 반드시 정해진 포맷으로 요청 사항을 작성하여 보내야합니다. 따라서 YAML이라는 포맷을 공부하고 넘어가도록 합니다.
yaml의 특징
1) 뛰어난 가독성
yaml 포맷
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: busybox
image: busybox:1.25
json 포맷
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "example"
},
"spec": {
"containers": [
{
"name": "busybox",
"image": "busybox:1.25"
}
]
}
}
yaml은 사람이 읽기 쉽도록 디자인되어있어, 위의 json 파일과 비교해봤을 때 yaml 파일 포맷의 가독성이 더 뛰어남을 알 수 있습니다.
2) yaml의 쓰임
- kubernetes manifests 명세
- docker compose 명세
- ansible playbook 명세
- github action workflow 명세
등 yaml 파일 포맷으로 널리 쓰이고 있습니다.
3) Strict-Validation
yaml 파일 내에서 줄 바꿈이나 들여쓰기 (Tab, space) 방식이 통일되어있지 않으면 invalid한 yaml 파일로 인식하게 되기 때문에 조금 더 안전한 사용이 가능해집니다.
yaml의 문법
1) key - value
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: busybox
image: busybox:1.25
yaml 파일의 형식은 Recursive한 key-value pair의 집합입니다.
2) 주석
# 주석 처리 예시
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: busybox
image: busybox:1.25
# 을 줄의 맨 앞에 작성하면 주석 처리를 할 수 있습니다.
3) 자료형
string
example: this is string
example: "this is string"
일반적인 문자열은 따옴표의 유무는 상관 없습니다.
하지만 반드시 따옴표로 감싸주어야 하는 다음의 경우가 있습니다.
- 숫자형
example: this is 1st string
example: "this is 1st string"
- y, yes, true, false 등 YAML의 예약어
example: "true"
- :, {, }, ,, #, *, =, \n 등의 특수 문자
example: "a : b"
example: "a#bc*"
integer
# integer type
example: 123
# hexadecimal type: 0x 로 시작
example: 0x1fff
float
# float type
example: 99.9
# exponential type
example: 1.23e+03 # 1.23 x 10^3 = 1230
boolean
# True
example: true
example: yes
example: on
# False
example: false
example: no
example: off
4) List
# 방법1: - 를 사용
examples:
- ex_one: 1
- ex_two: 2
# 방법2: [ ] 로 입력
examples: ["1", "2", "3"]
# list 의 원소는 어떤 자료형이든 가능
spec:
containers:
- name: busybox
image: busybox:1.25
- name: ubuntu
image: ubuntu
commands:
- sleep
- 3600
- name: python
image: python:3.9
5) Multi-line strings
example: |
Hello
Fast
Campus.
| 는 중간에 위치한 빈 줄을 \n으로 처리하여 문자열의 맨 마지막에 \n을 붙입니다. 즉, "Hello\nFast\nCampus.\n" 으로 처리합니다.
example: >
Hello
Fast
Campus.
# "Hello Fast Campus.\n" 으로 처리
> 중간에 위치한 빈 줄을 제외하고, 문자열의 맨 마지막에 \n을 붙입니다.
|- , >- 는 각각 |, > 와 동일하되 문자열의 맨 마지막에 \n 이 추가되지 않습니다.
6) Multi-document yaml
apiVersion: v1
kind: Pod
metadata:
name: one
---
apiVersion: v1
kind: Service
metadata:
name: two
---
apiVersion: v1
kind: Deployment
metadata:
name: three
--- 라는 구분선을 통해 하나의 yaml 파일에서 여러 개의 yaml 파일을 작성 가능합니다. 위의 예시에서는 세개의 yaml 파일로 인식되게 됩니다.
쿠버네티스에서는 어떤 pod를 혹은 어떤 리소스를 생성하고 싶은 경우에는 yaml 파일로 desired state를 작성한 후에, kube api server 에게 해당 yaml 파일의 내용을 담아 선언형 인터페이스로 요청을 보낼 수 있습니다.
'MLOps > 개념 정리' 카테고리의 다른 글
[MLOps] 6. VM에서 minikube 사용하기 (0) | 2023.02.25 |
---|---|
[MLOps] 4. Docker Image와 Dockerfile (0) | 2023.02.23 |
[MLOps] 3. Docker의 기본적인 명령어 정리 (0) | 2023.02.22 |
[MLOps] 2. Docker 실습 환경 셋팅 (VirtualBox, Ubuntu) (0) | 2023.02.21 |
[MLOps] 1. MLOps와 컨테이너의 개념 (feat, 도커/쿠버네티스) (0) | 2023.02.20 |