쿠버네티스는 구글에서 개발한 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성, 확장 가능한 오픈소스 플랫폼입니다.
쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해줍니다.
쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있습니다.
(서비스 및 기술 지원 및 도구는 어디서나 쉽게 이용가능합니다.)
쿠버네티스( Kubernetes )는 그리스어로 키잡이를 뜻합니다.
K 와 s 사이에 8글자를 나타내는 약식 표기로 K8s
라고도 합니다.
컨테이너는 가상 머신과 다르게 호스트 운영체제를 공유합니다. 그래서 가상머신에 비해 훨씬 더 가볍지만 가상 머신과 마찬가지로 실행 환경을 독립적으로 가져갈 수 있습니다.
가벼운 실행 환경을 가지기 때문에 쉽게 복제, 배포가 가능합니다. 이러한 컨테이너를 다수의 서버에서 여러 개를 실행시키는 데 체계적으로 관리하는 기술을 컨테이너 오케스트레이션이라고 합니다.
쿠버네티스는 컨테이너의
프로비저닝 및 배포 책임
이중화와 가용성 보장
수평확장/축소 관리
스케줄링
네트워크 설정
컨테이너 상태 모니터링
실행될 컨테이너를 기반으로 애플리케이션 설정
쿠버네티스에는 "바라는 상태"라는 개념이 있습니다.
쿠버네티스는 사용자의 요청에 따라 "현재 상태"가 "바라는 상태"와 동일해지도록 수행합니다.
사용자가 자신이 원하는 애플리케이션 배포 상태를 쿠버네티스에 알려주면 쿠버네티스에서 자동으로 현재 상태를 바라는 상태로 변경합니다.
따라서 애플리케이션이 죽더라도 바라는 원래의 상태로 배포상태를 되살릴 수 있습니다.
"바라는 상태"란 사용자가 생각하는 최종 애플리케이션 배포상태를 말합니다.
이미지 출처: https://www.leverege.com/iot-ebook/kubernetes-object-management-model
쿠버네티스에서 컨트롤러는 클러스터의 상태를 관찰 한 다음, 필요한 경우에 생성 또는 변경을 요청하는 control-loop를 진행합니다. control-loop는 시스템 상태를 조절하는 종료되지 않는 루프입니다.
각 컨트롤러는 현재 클러스터 상태를 "바라는 상태"에 가깝게 하려고 합니다.
파드(Pod) 는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위입니다.
고래 떼(pod of whales)
에서 이름을 따온 것 같습니다. 앞에 의미처럼 파드는 하나 이상의 컨테이너 그룹입니다.
쿠버네티스는 도커 외에도 다양한 컨테이너 런타임을 지원합니다.
아무리 작고 단순한 하나의 프로세스를 실행하더라도, Pod를 통해 수행됩니다. k8s는 파드를 통해 기본 가상환경을 제공합니다.
pod 속 컨테이너 간에는 서로 리소스를 공유할 수 있습니다.
이미지 출처 : https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/
쿠버네티스에서는 선언형 커맨드를 지향합니다.
리소스(오브젝트)를 생성하기 위해 사용자는 선언형 명령으로 YAML
혹은 JSON
을 사용하며 일반적으로 YAML
이 편리해 많이 사용합니다.
그렇다면, YAML
이란 무엇인가?
"YAML은 마크업 언어가 아니다 (YAML Ain't Markup Language)” 라는 재귀적인 이름에서 유래되었습니다.
YAML
은 XML, C, Python, Perl, RFC2822 에서 정의된 개념을 기반으로 만들어진 사람이 읽고 쓰기 쉽게 데이터를 정의하는 양식입니다.
apiVersion: v1
kind: Pod
metadata:
name: myweb-pod
labels:
app: myweb
type: fronted
spec:
containers:
- name: nginx-container
image: nginx
쿠버네티스에서 네임스페이스는 단일 클러스터 내에서 리소스 그룹 격리 메커니즘을 제공합니다.
쿠버네티스에서 모든 리소스는 이름(Name)을 갖고있습니다.
리소스의 이름은 네임스페이스 내에 유일해야하며, 네임스페이스 간에서 유일할 필요는 없습니다.
쿠버네티스에서 모든 리소스를 크게 두 가지로 나누자면 네임스페이스 레벨 리소스와 클러스터 레벨 리소스로 나눌수 있습니다.
네임스페이스 레벨 리소스
특정 네임스페이스 안에 존재합니다. Pod, Deployment, Service와 같이 대부분의 쿠버네티스 리소스가 네임스페이스 안에 포함됩니다.
클러스터 레벨 리소스
Node, PersistentVolume, StorageClass와 같이 네임스페이스 영역에 상관없이 클러스터 레벨에서 존재하는 리소스도 있습니다.
네임스페이스는 사용자가 원하는대로 자유롭게 추가, 삭제가 가능합니다.
쿠버네티스는 크게 마스터(Master) 노드(Node) 두 개의 컴포넌트로 분리됩니다.
마스터를 컨트롤플레인
이라고 이해하시면 됩니다.
클러스터(Cluster)란 마스터 및 하나 이상의 컴퓨팅 머신 또는 노드로 구성된 아키텍처라고 생각합니다.
컨트롤플레인(Control Plane)이라고 불리기도 하는 마스터(Master)는 쿠버네티스의 클러스터 전체를 컨트롤 하는 시스템입니다. 단일한 서버로 구성할 수 있으며, 고가용성을 위해 여러서버를 묶어 클러스터 마스터로도 구축할 수 있습니다.
아래는 마스터를 구성하는 요소들입니다.
kube-apiserver (API 서버)
etcd (저장소)
key-value
형태 저장소kube-scheduler (컨테이너 스케줄러)
kube-controller-manager (컨트롤러 집합)
cloud-controller-manager (클라우드 컨트롤러)
노드는 마스터로부터 명령을 받아 실제 워크로드를 생성하는 컴포넌트입니다.
container runtime (컨테이너 실행 환경)
애드온은 쿠버네티스 리소스를 이용하여 클러스터 기능을 구현합니다.
아래는 일부 애드온입니다.
DNS
Web UI (대시보드)
container resource monitoring
cluster-level logging
이미지 출처 : https://kubernetes.io/ko/docs/concepts/overview/components/