쿠버네티스(kubernetes)란 컨테이너화된 어플리케이션의 배포 및 확장, 관리를 자동화하는 오픈 소스 시스템이다.
구글이 내부에서 배포시스템으로 사용하던 'borg'의 코드를 CNCF(Cloud Native Coumputing Foundation)에 기부하면서 쿠버네티스는 오픈소스가 되었다.
쿠버네티스는 마이크로 서비스, 클라우드 플랫폼을 지향하며, 컨테이너로 이루어진 것들을 쉽게 관리할 수 있도록 해준다. Serverless, CI/CD, 머신러닝 등이 쿠버네티스 플랫폼 위에서 동작한다.
왜 필요할까?
컨테이너화된 어플리케이션 환경을 탄력적으로 사용할 수 있게 되며 Production 환경에서는 어플리케이션을 실행하는 컨테이너를 관리하고 가동이 중지되는 시간이 없는지 등 지속적으로 확인을 해야한다. 만약 컨테이너가 가동이 중지되더라도 다른 컨테이너를 가동하여 중지되는 시간을 최소화해야 한다.
바로 위와 같은 문제를 쿠버네티스가 시스템에 의해 관리되도록 해주기 때문에 쿠버네티스가 필요하게 된다.
어떠한 기능들을 제공하는가?
- Service Discovery와 Load Balancing : DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출
- Storage Orchestration : 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재
- 자동화된 롤아웃과 롤백 : 원하는 상태를 서술하고 현재 상태를 원하는 상태로 설정한 속도에 따라 변경 가능
- 자동화된 빈 패킹 : 각 컨테이너가 필요로 하는 CPU와 RAM을 제공
- 자동화된 복구(Self-Healing) : 실패한 컨테이너를 다시 시작하고 컨테이너를 교체
- 시크릿과 구성 관리 : 암호 OAuth Token, 및 SSH 키와 같은 중요한 정보를 저장하고 관리
Desired State
쿠버네티스는 얼마만큼의 서버가 구동돼야 할지, 몇 번 Port로 서비스할 지 등 관리자가 원하는 환경대로 작업이 되고 있는지 지속적으로 체크하며 조치하는 역할을 한다. 이 때 관리자가 원하는 상태를 Desired State라고 하며 이것이 쿠버네티스의 핵심이다.
Desired State를 설정하는 방법
YAML 또는 JSON 파일을 사용하여 Desired State에 대해 명시적으로 설정할 수 있다.
apiVersion : apps/v1
Kind : Deployment
metadata :
name : nginx-deployment
spec :
selector :
matchLabels :
app : nginx
replicas : 2 # tells deployment to run 2 pods matching the template
template :
metadata :
labels :
app : nginx
spec :
containers :
- name : nginx
image : nginx:1.14.2
ports :
- containerPort : 80
와 같은 형식으로 작성을 완료하면 쿠버네티스가 정의된 사양에 따라 컨테이너의 라이프사이클을 관리한다. 쿠버네티스를 사용하게 되면 시스템으로 컨테이너 기반 어플리케이션 및 서비스의 설정, 라이프사이클, 스케일 등을 관리할 수 있다.
설정할 수 있는 요소
쿠버네티스는 Pod를 배포할 때 CPU, RAM 등 컨테이너에 필요한 Resource의 양을 선택적으로 지정 및 제한할 수 있다.
apiVersion : v1
kind : Pod
metadata :
name : frontend
spec :
containers :
- name : app
image : images.my-company.example/app:v4
resources :
requests :
memory : "64Mi"
cpu : "250m"
limits :
memory : "128Mi"
cpu : "500m"
- name : log-aggregator
image : images.my-company.example/log-aggregator:v6
resources :
requests :
memory : "64Mi"
cpu : "250m"
limits :
memory : "128Mi"
cpu : "500m"
와 같은 YAML 파일에 Resource Limit을 지정하면 이보다 많은 Resource를 사용할 수 없도록 제한을 적용한다. 또한 해당 시스템의 Resouce 최소 요청량도 설정할 수 있다.
어떻게 이루어져 있을까?
쿠버네티스는 여러 개의 노드(Node)로 구성된 클러스터로 이루어져 있다. 노드는 하나의 VM(Virtual Machine)을 의미한다. 쿠버네티스에서는 컨테이너화된 어플리케이션을 실행하는 Worker Node와 이 Work Node들을 관리하는 Master Node로 구성되어 있다. Worker Node와 Master Node는 여러개로 이루어질 수 있지만 쿠버네티스를 사용할 때는 최소한 1개의 Woker Node가 존재해야 한다.
Master Node에 필요한 Component는 무엇인가?
Master Node는 클러스터에 대한 전반적인 결정과 이벤트를 감지하고 반응하는 역할을 수행하는데 기본적으로
| Component 명 | 역할 |
| kube-apiserver | 모든 요청을 처리 |
| kube-controller-manager | 다양한 Controller(복제/배포/상태 등)를 관리 |
| kube-scheduler | 상황에 맞는 Worker Node를 선택 |
| etcd | 클러스터 내의 데이터를 담는 저장소 |
와 같은 Component들을 통해 역할을 수행하며 필요로 한다.
Worker Node에 필요한 Component는 무엇인가?
Worker Node는 컨테이너화된 어플리케이션을 동작하고 유지시키는 역할을 하는데 기본적으로
| Component 명 | 역할 |
| pod | 컨테이너화된 어플리케이션 그룹 |
| kubelet | 노드에 할당된 pod의 상태 체크 및 관리 |
| kube-proxy | pod로 연결되는 네트워크 관리 |
와 같은 Component들을 통해 역할을 수행하며 필요로 한다.
'CS 및 IT 일반' 카테고리의 다른 글
| 로드 밸런싱(Load Balancing)이란? (0) | 2023.08.23 |
|---|---|
| XSS(Cross-Site Scripting) (0) | 2023.08.07 |
| Cookie와 Session (0) | 2023.08.07 |