쿠버네티스란 여러 개의 호스트(Pod)를 하나로 묶어 관리하기 위한 오케스트레이션 툴이다.
Pod는 쿠버네티스의 최소 배포 단위로 1개 이상의 컨테이너, 네트워크, 스토리지 등이 포함된다.
공식 사이트의 정의로는 어플리케이션 컨테이너의 배포 자동화, 스케일링, 운영을 위해 설계된 오픈소스 플랫폼
분산 환경에서 여러 대의 컴퓨팅 자원을 한 대의 컴퓨터처럼 운영할 수 있다.
하드웨어 밴더 및 플랫폼에 종속되지 않아 Public Cloud(AWS, Azure,GCP)에도 사용이 가능하며 Private Cloud, 베어메탈에도 배포가 가능하기 때문에 하이브리드 클라우드 솔루션으로 각광받고 있다.
쿠버네티스 클러스터는 크게 클러스터의 모든 상태를 저장/관리하는 Master와 실제 Pod를 운영하는 Node로 구성
쿠버네티스에서 가장 중요한 컴포넌트
쿠버네티스 내부의 모든 동작은 HTTP/HTTPS REST API를 통해 호출된다.
각각의 쿠버네티스 컴포넌트가 서로 직접 연결된 형태가 아니라 모든 컴퍼넌트는 API Server를 경유하여 통신
컴포넌트들은 API Server를 watch하고 있다가 자신과 관련된 부분의 변경사항이 있으면 변경사항을 업데이트
위 참조된 다이어그램을 보면 모든 요청이 API Server를 경유하여 각 컴퍼넌트로 전달되고 있음을 확인가능.
k8s에서 ReplicaSet, Deployment등의 Controller는 Pod의 복제/배포를 변경하는 명령을 수행하고 Pod의 상태관리.
Controller Manager는 이 Controller들을 데몬형태로 포함하고 있다.
※ 추가적으로 쿠버네티스의 Pod는 Deployment, ReplicaSet에서 사용자가 설정한 Pod의 수를 유지하는데
그 것을 "Desired State"라 한다.
Desired State의 의미는 ReplicaSet에 설정 된 현재 상태를 유지하는 것이다.
Controller Manager에서 현재 상태를 감시하다가 설정한 Desired State와 다르면 설정한 Desired State를 유지하기 위한 작업을 실행하여 사용자가 지정한 Pod의 수를 유지한다.
Desired Stated
"개발자가 원하는 상태" 를 의미
current state를 모니터링하면서 관리자(사용자)가 설정한 desired state를 유지하려 한다. 그렇기에 개발자가 서버를 배포할 때 직접적인 명령어를 보내지 않고, 상태를 기술하는 방식을 사용. 대표적으론 yaml 파일로 기술된 앱 디스크립션 파일이 있음.
어떤 Pod를 어떤 Node에서 실행할 지 결정.
각 Node의 자원 사용 상황, 노드당 클러스터 분배 비율을 기반으로 컨테이너를 배치.
Node에 배치된 Pod는 각 Node의 Kubelet 컴퍼넌트에 의해 컨테이너로 생성.
분산 Key/Value 저장소
클러스터 설정 및 현재 상태( 클러스터의 각 노드, 노드에서 동작중인 Pod 등의 모든 상태)를 저장.
Service Discovery에서 사용하는 SkyDNS의 데이터 저장.
Node마다 한개씩 떠있는 Node Agent
Service, Pod를 실행/중지하고 Desired State 유지.
주기적으로 API Server에 Node의 상태를 Check & Report access.
동작중인 컨테이너의 리소스 사용량과 퍼포먼스를 모니터링
모니터링한 결과는 Kubelet에 의해 Master의 API Server로 전달된다.
네트워크 프록시 + 로드밸런서의 역할
외부의 요청을 분산된 Pod로 전달
컨테이너간의 통신을 위해서 iptables rules를 변경.
쿠버네티스의 가장 작은 배포 단위(Unit)
1개의 Pod 내부에는 1개 이상의 컨테이너가 존재한다.
1개의 Pod는 여러개의 물리서버에 나눠지는 것이 아니고 1개의 물리서버(Node)위에 올라간다.
Pod 내부의 컨테이너들은 네트워크와 볼륨을 공유하기 때문에 Localhost로 통신 가능.