Kubernetes 기본 개념
(수정 중)
Kubernetes
구글은 내부 서비스를 클라우드 환경에서 운영하고 있었고 일찍이 컨테이너 인프라 환경을 사용해왔다. 구글의 내부 컨테이너 서비스를 Borg라고 하는데, 이 구조를 오픈소스화한것이 쿠버네티스이다.
Go 언어로 구현되어 있으며 Vendor-neutral 특성을 갖기 때문에 대부분의 퍼블릭 클라우드(Google, Amazon, Azure)에서 사용이 가능하고 오픈 스택과 같은 프라이빗 클라우드 구축 환경이나 베어메탈(가상화 환경을 사용하지 않는 일반 서버 하드웨어)에도 배포가 가능하다고 한다.
이와 같은 컨테이너 운용 환경은 여러 오픈소스에 의해서 표준 없이 혼돈이었다가 2017년 말을 기점으로 해서 쿠버네티스가 De facto 표준이 되어가고 있다.
Desired State
쿠버네티스의 핵심이 되는 개념인데 현재 상태와 원하는 상태(Desired State)를 지속적으로 체크하면서 문제가 있다면 조치를 하고 원하는 상태를 유지하는 것이다.
Master Node
- API Server
- etcd
- Controller Manager
- Scheduler
클러스터 전체를 관리하는 컨트롤러
API Server를 통해 쿠버네티스를 관리하며 모든 컴포넌트들은 API Server를 통해 서로 통신한다.
API Server
쿠버네티스 내부의 모든 컴포넌트들이 서로를 호출하기 위해 사용되는 컴포넌트이다.
쿠버네티스는 서로가 직접 연결되어 있지 않고 API Server를 통해 통신한다.
각각의 컴포넌트들은 API Server를 Watch하고 있다가 자신에 대한 변경사항이 생기면 업데이트하는 구조이다.
etcd
쿠버네티스 클러스터의 데이터베이스 역할을 하는 서버
클러스터의 모든 설정과 상태 데이터를 key/value 형태로 저장한다. 따라서 etcd를 백업해 놓는다면 언제든지 클러스터를 복구할 수 있다.
오직 API Server와 통신하고, 다른 모듈은 API Server를 거쳐서 etcd에 접근한다.
Controller Manager
쿠버네티스의 ReplicaSet, Deployment 등의 Controller를 관리하고 적절한 노드에 할당한다.
각 Controller에게 Pod의 복제 및 배포 명령을 수행한다.
Scheduler
Pod, 서비스 등 리소스들을 적절한 노드에 할당하는 역할을 수행한다.
Pod를 어떤 Node에서 실행할지 결정한다.
Node에 배치된 Pod는 각 노드의 Kubelet에 의해 컨테이너로 생성된다.
Worker Node
Kubelet, cAdvisor, Kube-Proxy, Pod로 구성된다.
Kubelet
Node에 배포되는 Agent로 API Server와 통신하며 노드가 수행할 명령을 받아 수행한다.
Node의 상태를 마스터로 전달하는 역할을 수행한다.
Kube Proxy
Node로 오는 트래픽을 적절한 컨테이너로 프록시하며, 마스터 노드와 워커 노드 사이의 네트워크 통신을 관리한다.
cAdvisor
노드의 모니터링 Agent로 노드에서 가동되는 컨테이너들의 상태정보를 수집하여 마스터의 API Server로 전달한다.