쿠버네티스(k8s)의 구조 - 쿠버네티스 시리즈(1)
용어 뜻
컨테이너 | 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술 |
컨테이너 런타임 | 컨테이너를 다루는 도구 |
도커 | 컨테이너를 다루는 도구 중 하나 |
쿠버네티스 | 컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구 |
오케스트레이션 | 여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위 |
Pod | 파드(Pod)는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위 |
쿠버네티스 ≠ 도커 관리 툴
정확하게는 도커를 관리하는 도구가 아니라, 컨테이너를 관리하는 도구
쿠버네티스란 ?
컨테이너화 된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 시스템
- 단순한 컨테이너 플랫폼이 아닌 마이크로서비스, 클라우드 플랫폼을 지향
- 컨테이너로 이루어진 것들을 손쉽게 담고 관리할 수 있는 그릇 역할
- 서버리스, CI/CD, 머신러닝 등 다양한 기능이 쿠버네티스 플랫폼 위에서 동작 가능
쿠버네티스의 등장 배경
애플리케이션 실행 환경의 변화
- 전통적인 환경에서의 배포(On-Premise)
- 가상환경에서의 배포(Virtual Machine)
- 컨테이너로의 배포(Container)
전통적인 환경에서의 배포(On-Premise)
- 물리적 서버에서 애플리케이션을 실행
- 변경사항이 발생한 경우, 변경사항을 쉽게 적용하지 못하는 단점이 있음
가상 환경에서의 배포(Virtual Machine)
- 물리적 환경에 대한 솔루션으로 가상화 도입
- 단일 물리적 서버의 CPU에서 여러 대의 가상머신(VM)을 실행할 수 있도록 변함
- 애플리케이션의 격리, 상호 간의 보안 환경을 유지할 수 있음
컨테이너로의 배포(Container)
- 가상머신과 유사하지만, 자체 파일 시스템, CPU 공유, 메모리, 프로세스 공간 등이 있음
- 기본 인프라에서 분리되기 때문에 클라우드 및 OS 배포 전반에 걸쳐 이식 가능
컨테이너의 계층구조
쿠버네티스의 주요 구성 요소
클러스터
- 컨트롤 플레인 및 하나 이상의 컴퓨팅 머신 또는 노드로 구성된 클러스터는 최소 하나 이상의 컨트롤 패널 컴포넌트와, 이와 연결된 몇 개의 워커 노드로 구성
컨트롤 플레인
- 쿠버네티스 노드를 제어하는 프로세스들이 모여있는 곳
- 모든 태스크 할당이 시작되는 곳
1. etcd
- 쿠버네티스 클러스터의 모든 데이터를 담고 있는 key-value 저장소
- 인프라를 원하는 상태로 만들기 위해 정상 상태에 대한 snapshot 및 관리에 필요한 메타 데이터 저장
2. kube-api-server
- 쿠버네티스 클러스터의 허브
- 클라이언트와 etcd에 저장된 데이터 사이의 상호작용 중개
- 사용자 (운영자), 클러스터 내 구성요소, 그리고 외부 컴포넌트가 서로 통신할 수 있도록 HTTP API 제공
3. kube-scheduler
- 새로운 POD를 감지하여 어떤 워커노드에 실행시킬 지 선택
- 노드의 현재 상태와 Pod의 요구사항 체크
- 노드에 라벨 부여
4. kube-controller-manager
- API 서버를 통해 클러스터의 다양한 컴포넌트들의 상태를 감지하고, 원하는 상태로 만드는 역할
- 다양한 컨트롤러가 하나로 패키징되어 단일 프로세스 내에서 실행 되도록 함.
워커노드
- kubelet : 다른 노드와 서로 통신하거나 컨테이너를 실행하는 등의 태스크를 실행할 수 있도록 함
- 한 개 이상의 컨테이너가 자리잡고 있으며, 워커 노드는 실제로 애플리케이션이 실행되고 있는 곳
1. kubelet
- 각 노드에서 실행되는 기본 노드 에이전트, 일종의 데몬
- 컨테이너를 생성, 삭제하고 상태를 모니터링하며 마스터 노드와 통신 담당 역할
- 쿠버네티스에서 생성되지 않은 컨테이너는 관리하지 않음
2. kube-proxy
- 모든 워커 노드마다 실행되는 네트워크 프록시
- 다른 Pod 간의 네트워크 통신과 클러스터 바깥에서 Pod로 네트워크 통신을 할 수 있게 해줌
- 성능 상의 이유로 별도의 프록시 프로그램 대신 iptable 또는 IPVS를 사용, 즉 설정만 관리
3. 컨테이너 런타임 엔진(container Runtime Engine)
- 노드에 배포된 파드(Pod) 내 컨테이너들을 구동시키는 엔진