쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 배포, 관리, 확장할 때 수반되는 다수의 수동 프로세스를 자동화하는 오픈소스 컨테이너 오케스트레이션 플랫폼이다.
쿠버네티스를 배포하면 클러스터를 얻는다. 그리고 이 클러스터는 노드들의 집합이다. 노드들은 크게 두 가지 유형으로 나눠지는데, 각각이 컨트롤 플레인과 데이터 플레인이 있다.
컨트롤 플레인(Control Plane)/마스터 노드(Master Node)
워커 노드와 클러스터 내 파드를 관리하고 제어한다.
구성 요소
데이터 플레인(Data Plane)
워커 노드(Worker Node)들로 구성되어 있으며 컨테이너화된 애플리케이션의 구성 요소인 파드를 호스팅한다.
구성 요소
1. kubectl을 통해 API 서버에 파드 생성 요청
2. (업데이트가 있을 때 마다 매번) API 서버에 전단될 내용이 있으면 API 서버는 etcd에 전달된 내용을 모두 기록해 클러스터의 상태 값을 최신으로 유지, 각 요소가 상태를 업데이트 할 때마다 모두 API서버를 통해 etcd에 기록
3. API서버에 파드 생성이 요청된 것을 컨트롤러 매니저가 인지하면 컨트롤러 매니저가 파드를 생성하고, 이 상태(생성했다!)를 API 서버에 전달. (아직 어떤 워커 노드에 파드를 적용할지는 결정되지 않은 상태로 파드만 생성)
4. API 서버에 파드에 생성됐다는 정보를 스케줄러가 인지. 스케쥴러는 생성된 파드를 어떤 워커 노드에 적용할지 조건을 고려해 결정하고 해당 워커 노드에 파드를 띄우도록 요청(API 서버에 요청)
5. API 서버에 전달된 정보대로 지정한 워커 노드에 파드가 속해있는지 스케줄러가 kubelet으로 확인(내 말대로 잘 띄웠니?)
6. kubelet에서 컨테이너 런타임으로 파드 생성을 요청
7. 파드가 생성이 되며, 사용 가능한 상태로 변경
Pod
파드는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다. 이는 쿠버네티스 애플리케이션의 최소 단위, 즉, 웹 서비스를 구동하는 데 필요한 최소 단위로 하나 이상의 컨테이너를 포함한다.
Deployment
디플로이먼트는 쿠버네티스에서 상태가 없는 앱을 배포할 때 사용하는 가장 기본적인 컨트롤러이다. 실행시켜야 할 파드 개수를 유지하는 것 뿐 아니라, 앱을 배포할 때 롤링 업데이트하거나, 배포 도중 잠시 멈췄다가 다시 배포할 수 있다. 앱 배포 후 이전 버전으로 롤백할 수도 있다.
StatefulSet
스테이트풀셋은 애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트이다.
파드 집합의 디플로이먼트와 스케일링을 관리하며, 파드들의 순서 및 고유성을 보장한다 .
디플로이먼트와 유사하게, 스테이트풀셋은 동일한 컨테이너 스펙을 기반으로 둔 파드들을 관리한다. 디플로이먼트와는 다르게, 스테이트풀셋은 각 파드의 독자성을 유지한다. 이 파드들은 동일한 스팩으로 생성되었지만, 서로 교체는 불가능하다. 다시 말해, 각각은 재스케줄링 간에도 지속적으로 유지되는 식별자를 가진다.
Service
서비스는 동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공한다.
클러스터 내부에서 실행되는 Pod들은 언제든지 삭제되고 생성될 수 있으며 한군데에 고정해서 실행되지 않는다. Pod가 생성될 때마다 새로운 내부 IP를 할당하게 되므로, 클러스터 내/외부와 통신을 계속 유지하기 어렵기에 서비스를 통해 이렇게 동적으로 변하는 파드들에 고정적으로 접근할 수 있다.
Service 종류
Ingress
Ingress는 HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출한다.
클러스터 외부에서 접근해야 할 URL을 사용할 수 있도록 하고, 트래픽 로드밸런싱, SSL 인증서 처리, 도메인 기반 가상 호스팅도 제공한다.
Ingress 컨트롤러 종류
Deployment, StatefulSet 의 주요 차이점
프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야 한다. 예를 들어, 컨테이너가 다운된다면 다른 컨테이너를 다시 시작하여 가동 중지 시간을 최소화하여야 합니다.
이러한 동작을 시스템에 의해 처리할 수 있도록 하는 것이 쿠버네티스의 역할이다.
서비스 디스커버리와 로드 밸런싱 - DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출
스토리지 오케스트레이션 - 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재
자동화된 롤아웃과 롤백 - 원하는 상태를 서술하고 현재 상태를 원하는 상태로 설정한 속도에 따라 변경 가능
자동화된 빈 패킹 - 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 제공
자동화된 복구(self-healing) - 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체
시크릿과 구성 관리 - 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리
참고 : 쿠버네티스의 개념과 기본 사용법
쿠버네티스 이해
왜 StatefulSet을 사용할까 (feat. deployment와의 차이점)