[Kubernetes] What is Kubernetes?
by 뚜부니
▶ Kubernetes?
- 컨테이너 오케스트레이션 플랫폼 중 하나
- 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼
- 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하는 것이 목적
- Kubernetes가 너무 길어서 k8s(케이에이츠) 또는 kube(쿠브)로 줄여서 부름
▶ Kubernetes 기본 기능
- 상태 관리 : 상태를 선언하고 상태를 유지. 노드가 죽거나 컨테이너 응답이 없을 경우 자동 복구
- Scheduling : 클러스터의 여러 노드 중 조건에 맞는 노드를 찾아 컨테이너 배치
- Cluster : 가상 네트워크를 통해 하나의 서버에 있는 것처럼 통신
- Service Discovery : 서로 다른 서비스를 쉽게 찾고 통신 가능
- Resource Monitoring : cAdvisor라는 리소스 메트릭(지표) 수집도구를 통한 리소스 모니터링
- Auto-scaling : 리소스에 따라 자동으로 서비스 조정
- RollOut/RollBack : 배포/롤백 및 버전 관리
▶ Kubernetes 기본 개념
- Current state : 현재 상태
- Desired state : 관리자가 원하는 상태
- 관리자가 서버를 배포할 때 직접적인 동작을 명령하지 않고 상태를 선언하는 방식 사용
- 명령 $ docker run
- 상태 $ kubectl create (물론 kubectl run도 있지만 잘 사용하지 않음)
▶ Kubernetes Controller
- Daemon Set : 로그나 모니터링 등 모든 노드에 설치가 필요한 경우에 사용
- Deployment : 새로운 버전의 애플리케이션을 다양한 전략으로 배포 가능
- Stateful Sets : 실행 순서를 보장하여 순서나 데이터가 중요한 경우 사용
- CronJob / Job : 배치성 작업에 사용
- Replication Controller (RC) : 지정된 숫자로 Pod를 기동 및 관리
▶ Kubernetes 배포
- 롤링 업데이트
- 일반저으로 많이 사용하는 배포 패턴
- 새 버전을 배포하면서, 새 인스턴스를 하나씩 늘려가고, 기존 버전은 하나씩 줄여가는 방식
- 기존 버전과 새 버전이 동시에 존재 가능
- 시스템을 무장애로 업데이트 가능
- 새 버전용 컨트롤러와 기존 버전용 컨트롤러 필요
- Deployment
- Kubernetes에서 일반적으로 사용하는 배포 패턴
- 롤링 업데이트를 좀 더 자동화한 객체 (컨트롤러 개념에 포함됨)
- 컨트롤러를 따로 정의하지 않고, Deployment 객체만 만듦
- Deployment 객체가 자동으로 롤링 업데이트를 해 줌
▶ Kubernetes Object
- Pod
- Kubernetes에서 배포할 수 있는 가장 작은 단위
- ReplicaSet
- Pod를 한 개 이상 복제하여 관리하는 오브젝트
- Pod 생성 및 개수 유지를 위해서는 반드시 ReplicaSet을 사용해야 함
- Service
- 네트워크와 관련된 오브젝트
- Pod를 외부 네트워크와 연결해주고 여러 개의 Pod를 바라보는 내부 로드 밸런서 생성 시 사용
- 내부 DNS에 서비스 이름을 도메인으로 등록하기 때문에 서비스 디스커버리 역할도 함
- Volume
- 저장소와 관련된 오브젝트
▶ Kubernetes 클러스터 아키텍처
- 마스터 (Master)
- 노드를 제어하고 전체 클러스터를 관리해주는 컨트롤러
- 전체적인 제어/관리를 하기 위한 서버
- 다양한 모듈이 확장성을 고려하여 기능별로 쪼개져 있음
- 관리자만 접근할 수 있게 보안 설정을 해야하고 마스터 서버가 죽으면 클러스터를 관리할 수 없기 때문에 보통 3중화로 구성
- 노드 (Node)
- 마스터에 의해 명령을 받고 실제 서비스를 하는 컴포넌트
- 노드 서버는 마스터 서버와 통신하면서 필요한 Pod를 생성 및 네트워크와 볼륨 설정
- 컨테이너가 배포될 물리 서버 또는 가상 머신이며, 워커 노드 (Worker Node)라고도 부름
- Kubelet : 명령 도구
▶ Master 구성요소
- API 서버 kube-apiserver
- API 서버는 모든 요청을 처리하는 마스터 핵심 모듈
- kubetd의 요청뿐 아니라 내부 모듈의 요청도 처리하며, 권한을 체크하여 요청 거부 가능
- 원하는 상태 (desired state)를 key-value 저장소에 저장하고, 저장된 상태를 조회하는 역할
- 노드에서 실행 중인 컨테이너의 로그를 보여주고 명령을 보내는 등 디버거 역할 수행
- 분산 데이터 저장소 etcd
- RAFT 알고리즘을 이용한 key-value 저장소
- 여러 개로 분산하여 복제할 수 있기 때문에 안정성이 높고 속도가 빠른 편
- 단순한 값을 저장하고 읽는 기능 뿐만 아니라 watch 기능이 있어 어떤 상태가 변겨되면 바로 체크하여 로직 실행
- 클러스터의 모든 설정, 상태 데이터는 여기 저장되므로 etcd만 잘 백업해두면 언제든지 클러스터 복구 가능
- etcd는 API 서버만 통신
- 스케줄러 kube-scheduler
- 스케줄러는 할당되지 않은 pod를 필요한 자원, 라벨에 따라 적절한 노드 서버에 할당해주는 모듈
- 큐브 컨트롤러 kbue-controller-manager
- 큐브 컨트롤러는 kubernetes에 있는 거의 모든 오브젝트의 상태 관리
- 오브젝트별로 철저하게 분업화되어 Deployment는 ReplicaSet을 생성하고 ReplicaSet은 pod를 생성하고 pod는 스케줄러가 관리하는 형식
- 클라우드 컨트롤러 cloud-controller-manager
- 클라우드 컨트롤러는 AWS, GCE, Azure 등 클라우드에 특화된 모듈
- 노드 추가/삭제 및 로드 밸런서 연결 또는 볼륨을 붙일 수 있음
▶ Node 구성요소
- 큐블릿 kubelet
- 노드에 할당된 pod의 생명주기 관리
- pod 생성 및 pod 안의 컨테이너에 이상이 없는지 확인하면서 주기적으로 마스터에 상태 전달
- API 서버의 요청을 받아 컨테이너 로그를 전달하거나 특정 명령을 대신 수행하기도 함
- 프록시 kube-proxy
- pod로 연결되는 네트워크 관리
🔗 Reference
'Infra > Docker&K8S' 카테고리의 다른 글
[Docker] Windows에 Docker 설치하기 (0) | 2021.07.06 |
---|---|
[Docker] Install Docker (Ubuntu) (0) | 2020.04.14 |
[Docker] What is Docker? (0) | 2020.04.13 |
블로그의 정보
개발하는 두부
뚜부니