최근 수정 시각 : 2024-11-23 19:19:04

Kubernetes

쿠버네티스에서 넘어옴
<colbgcolor=#fff,#1f2023><colcolor=#000,#fff> {{{#!wiki style="margin: -10px -10px" <tablealign=center><tablewidth=320><tablebordercolor=white,#1f2023> 파일:Kubernetes 로고.svg 파일:Kubernetes 로고.svg Kubernetes
}}}
개발사 구글
발표일 2014년 9월 9일 ([age(2014-09-09)]년 전)
프로그래밍 언어 Go
라이센스 Apache License 2.0
파일:홈페이지 아이콘.svg | 파일:GitHub 아이콘.svg 파일:GitHub 아이콘 화이트.svg
1. 개요2. 역사3. 목적4. 필요 지식5. 아키텍처
5.1. Master Node5.2. Worker Node
6. 주요 개념
6.1. Pod6.2. Service6.3. ReplicaSet6.4. Deployment
7. 관련 도구8. Docker와의 비교9. 관리형 서비스10. 사용 기업11. 기타12. 관련 문서

[clearfix]

1. 개요

Kubernetes(쿠버네티스)는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리하기 위한 오픈소스 플랫폼이다. 간단히 말해, 애플리케이션을 관리하기 쉽게 만들어 준다. 구글에서 개발하였으며, 현재는 Cloud Native Computing Foundation(CNCF)에서 관리하고 있다.

2. 역사

Kubernetes는 구글의 내부 시스템인 Borg에서 영감을 받아 개발되었다. 구글은 수년간 컨테이너 기술을 사용해 왔으며, 이 경험을 바탕으로 2014년 Kubernetes 프로젝트를 시작했다. 2015년 7월 21일, Kubernetes 1.0이 공식적으로 출시되었으며, 같은 날 구글은 이 프로젝트를 CNCF에 기부했다.

3. 목적

Kubernetes를 사용하면 애플리케이션을 더 쉽게 배포하고 관리할 수 있다. 이를 통해 개발자는 애플리케이션 코드 작성에 집중할 수 있다. 또한 Kubernetes는 애플리케이션을 자동으로 스케일링하고 장애 복구를 처리하는 등의 작업을 처리하여 시스템 안정성을 높일 수 있다. Kubernetes는 여러 클라우드 제공 업체와 호환되므로 클라우드에서 애플리케이션을 실행하는 데 유용하다.

4. 필요 지식

Kubernetes를 배우기 위해서는 다음과 같은 기술 지식이 필요하다.
  • containerd, Docker, Openshift 등과 같은 컨테이너 기술 스택
  • 서버리스, 오케스트레이션, 로드 밸런싱, 오토 스케일링 등과 같은 클라우드 컴퓨팅 기술에 대한 사용 경험
  • 운영체제 및 네트워크 관련 지식[1]

또한 Kubernetes의 기본 개념과 아키텍처, 배포 및 관리를 위한 명령어 등에 대한 이해도 필요하다.

5. 아키텍처

Kubernetes는 마스터 노드와 워커 노드로 구성된다.

5.1. Master Node

마스터 노드(master node)는 클러스터의 컨트롤 플레인(control plane)을 형성하며, 다음과 같은 컴포넌트들로 구성된다.
  • kube-apiserver: 클러스터의 프론트엔드 역할을 한다.
  • etcd: 클러스터의 모든 데이터를 저장하는 분산 키-값 저장소이다.
  • kube-scheduler: 새로 생성된 파드를 노드에 할당한다.
  • kube-controller-manager: 다양한 컨트롤러를 실행하여 클러스터의 상태를 관리한다.

5.2. Worker Node

워커 노드(worker node)는 실제 애플리케이션이 실행되는 곳이며, 다음과 같은 컴포넌트들로 구성된다.
  • kubelet: 각 노드에서 실행되며, 컨테이너가 파드에서 실행되도록 관리한다.
  • kube-proxy: 네트워크 규칙을 관리하여 파드 간 네트워크 통신을 가능하게 한다.

6. 주요 개념

Kubernetes를 이해하기 위해 알아야 할 주요 개념들은 다음과 같다.

6.1. Pod

파드(Pod)는 Kubernetes의 가장 기본적인 배포 단위로, 하나 이상의 컨테이너로 구성된다. 같은 파드 내의 컨테이너들은 동일한 노드에서 실행되며, 네트워크와 저장소 리소스를 공유한다.

6.2. Service

서비스(Service)는 파드 집합에 대한 단일 진입점을 제공한다. 쉽게 말해서 파드에서 실행 중인 컨테이너를 외부로 노출시켜 서비스의 주소를 통해 접근할 수 있게 만들어 준다. 파드는 동적으로 생성되고 제거될 수 있기 때문에 서비스를 통해 안정적인 네트워크 주소를 제공받을 필요가 있다.

6.3. ReplicaSet

레플리카셋(ReplicaSet)은 지정된 수의 파드 복제본이 항상 실행되도록 보장한다. 노드 장애나 파드 장애 시 자동으로 새로운 파드를 생성하여 개수를 일정하게 유지하는 역할을 한다.

6.4. Deployment

디플로이먼트(Deployment)는 파드 또는 레플리카셋의 선언적 업데이트를 제공한다. 애플리케이션은 한번 배포되고 끝이 아니라 새로운 기능 개발이나 버그 패치 등으로 꾸준히 업데이트가 된다. 이럴 때마다 서버가 중단되는 것은 바람직하지 않다. 디플로이먼트는 이러한 문제를 해결하기 위한 Kubernetes의 핵심 기능 중 하나이며, 롤링 업데이트나 롤백과 같은 고급 기능을 지원한다.

7. 관련 도구

Kubernetes 생태계에는 다양한 도구들이 존재한다.
  • Helm: Kubernetes 패키지 관리자
  • Prometheus: 모니터링 및 알림 도구
  • Istio: 서비스 메시 플랫폼
  • Kubernetes Dashboard: 웹 기반 Kubernetes 사용자 인터페이스

8. Docker와의 비교

Docker와 Kubernetes는 모두 컨테이너 기술을 사용하지만, 각각 다른 역할을 수행한다.

Docker는 개발자가 소프트웨어 애플리케이션과 그에 필요한 라이브러리 및 종속성을 하나의 패키지로 묶어서 배포할 수 있도록 도와주는 플랫폼이다. Docker를 사용하면 개발자는 애플리케이션을 빠르게 개발하고, 테스트하고, 배포할 수 있다.

Kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리하기 위한 오픈소스 플랫폼이다. Kubernetes를 사용하면 개발자는 애플리케이션을 더 쉽게 배포하고 관리할 수 있으며, 애플리케이션을 자동으로 스케일링하고 장애 복구를 처리하는 등의 작업을 처리할 수 있다.

간단히 말해, Docker는 개발자가 애플리케이션 개발과 배포를 쉽게 할 수 있도록 도와주는 플랫폼이고, Kubernetes는 애플리케이션을 자동으로 관리하고 배포하는 플랫폼이다.

9. 관리형 서비스

KaaS (Kubernetes as a Service)를 구현한 사례도 존재한다. 아마존 웹 서비스의 Elastic Kubernetes Service (EKS), Microsoft Azure의 Azure Kubernetes Service (AKS), Google Cloud Platform의 Google Kubernetes Engine (GKE)가 있다.

10. 사용 기업

Kubernetes를 사용하는 대표적인 기업으로는 Google, Microsoft, Amazon, IBM, Oracle, Cisco, Red Hat, SAP 등이 있다. 이들 기업은 Kubernetes를 클라우드 서비스에서 사용하거나, 기업용 서버에서 사용하고 있다. Kubernetes는 현재 많은 기업에서 사용되고 있으며, 점점 더 많은 기업이 채택하고 있다.

11. 기타

약어로 k8s로 줄여 부르기도 한다. k와 s 사이의 글자가 8개라서 저렇게 줄인다. 이는 국제화(internationalization)를 i18n으로 줄이는 것과 같은 방식이다.

로고의 조타륜(helm) 모양은 그리스어로 조타륜을 뜻하는 'κυβερνήτης'(kybernetes)에서 유래했으며, 이는 영어의 'governor'(통치자)와 'cybernetic'(인공두뇌학)의 어원이기도 하다.

12. 관련 문서


[1] 컨테이너 개념을 이해하려면 기존의 VM과 어떻게 다른지를 파악해야 하고 커널 등과 같은 OS 요소를 아는 것은 매우 중요하다. 또한, 윈도우 컨테이너와 달리 리눅스 컨테이너는 iptables를 사용하여 포트맵을 구성하므로 리눅스에 대한 지식도 있어야 한다.