쿠버네티스 인 액션 책 내용 요약 + 제 생각을 녹여냈습니다.
컨테이너화 된 애플리케이션들을 쉽게 배포하고 관리할 수 있게 해주는 소프트웨어 시스템
애플리케이션 자동 배포 및 쉬운 운영
리눅스 컨테이너 기술 기반이기 때문에 애플리케이션들이 서로 격리되어 영향을 미치지 않음. 그래서 하나의 클러스터에 완전 다른 성격의 애플리케이션들을 띄울 수가 있다.
수천 대의 컴퓨터를 하나의 컴퓨터로 추상화 할 수 있으며, 이렇게 엮인 클러스터에 애플리케이션을 쉽게 배포하고 실행시킬 수 있다.
인프라를 추상화하여 개발, 배포, 관리를 단순화한다.
개발자는 특정 인프라와 관련된 서비스를 따로 구현할 필요없이, 쿠버네티스에 맡기고 애플리케이션의 핵심 기능 구현에만 집중한다.
쿠버네티스의 기본 구성 요소와 각 역할을 살펴보자. 노드 역할에 따라 필요한 구성요소가 다르다.
이제부터 구성 요소들 하나씩 자세히 살펴보자.
클러스터 상태를 조회하고 변경하는 REST API CRUD를 제공하고 클러스터의 상태는 etcd에 저장한다. API 서버에서 요청에 대한 유효성 검사도 하고 낙관적 잠금도 처리하고 있다.
보통 우리는 kubectl로 API 서버와 통신하여 클러스터를 조회하고 업데이트한다. 상태를 업데이트할 때 API 서버에서 무슨 일이 일어나는지 좀 더 자세하게 알아보자.
파드를 띄울 때 가장 적합한 노드를 선택하는 역할을 한다. 적합한 노드를 고를 땐 크게 3단계를 거친다. 1단계는 우선 수용 가능한 노드 목록부터 뽑는다. taint나 리소스 부족 등으로 파드를 받을 수 없는 노드들을 우선 제외시킨다. 그 다음 2단계는, 수용 가능한 노드 중에서 가장 적합한 노드를 고른다. 3단계는 만약 2단계 결과로 여러 노드가 여전히 남아있다면 Round-Robin으로 노드 하나를 선택한다.
쿠버네티스의 여러 기법으로 관리자가 좀 더 세세하게 스케쥴링 되도록 유도할 수 있다. Affinity와 AntiAffinity 설정을 통해 파드를 고르게, 혹은 집약적으로 스케쥴링 되도록 할 수 있다.
최종 노드가 선택되면 API 서버에 요청을 보내 파드 상태를 업데이트한다. API 서버는 특정 리소스를 감시하는 클라이언트들에게 통보하는 기능이 있어서, 파드를 감시하는 kubelet에게 파드의 새로운 상태를 통보한다(아마 kubelet은 파드만 감시하고 있진 않을 것이다). 대상 노드의 kubelet은 이를 확인하고 Container Runtime과 통신하여 파드 컨테이너를 생성 및 실행시킨다.
API 서버로부터 리소스의 상태를 통보받고, 실제 상태가 통보받은 상태(원하는 상태)가 되도록 하고 그 상태를 유지시키는 역할을 한다. 컨트롤러 매니저 프로세스에는 Deployment Controller, StatefulSet Controller 등의 여러 컨트롤러를 포함하고 있다. 각 컨트롤러들은 각자 자기가 맡은 리소스를 감시하고 있으며, API 서버로부터 통보를 받으면 각 컨트롤러들이 실제 상태를 원하는 상태로 바꾸고 새로운 상태를 리소스의 status를 업데이트한다.
API 서버의 통보 기능을 통해 리소스의 변경 사항에 대해 통보 받지만, 놓칠 수도 있으므로 주기적으로 누락된 상태 변화가 없는지 목록을 가져오기도 한다.
컨트롤러들이 실제 상태를 원하는 상태로 변경할 때, 예를 들어 Deployment의 원하는 replica가 3인데 실제 replica는 2일 때 3으로 만들기 위해 파드 하나를 더 생성하려고 할 것이다. 마치 컨트롤러가 직접 파드를 만드는 것처럼 설명됐지만 사실은 그렇지 않다. 컨트롤러는 새로 만들 파드의 메니페스트를 만들어 API서버에 보내고, 스케쥴러와 kubelet을 통해 해당 파드가 생성되는 것이다. 즉 컨트롤러도 직접 액션을 취하지 않고 API 서버를 거쳐서 액션을 한다.
나머지 구성 요소는 다음 글에 이어서 보자.