Kuberntes
Kubernetes
Kuberntes에 배우기전에 먼저 배포방식에 대해 알아보고 가겠습니다.
배포 방식
Traditional
전통적인 배포 방식은 예전에 쓰이던 방식입니다.
주로 컴퓨터 한대에 하나의 운영체제를 설치하고, 여러가지 프로그램을 구동하는 방식입니다.
쉽게 이야기 하면, 집에있는 데스크톱에 여러가지 프로그램을 설치하여 사용하는 방법과 유사하다고 생각하시면 됩니다.
이런 배포 방식은 단점이 존재합니다. 수동적이고 반복적인 단점으로 인한 오류 가능성이 존재하며, 일관성이 부족하여 서로 다른 환경에서의 배포가 일관성이 없을 수가 있습니다.
이런 단점을 해결하기 위해 나온 배포 방식이 가상화 배포 방식입니다.
Virtualized
가상화 배포 방식은 하나의 컴퓨터에 하나의 OS를 설치하여, 이 위에 다시 가상 머신이라는 소프트웨어를 실행하여 여러 개의 가상 환경을 만드는 방식입니다.
참고 | 가상머신은 가상의 컴퓨터입니다. 각각의 가상머신은 독립된 운영체제와 애플리케이션을 실행할 수 있습니다.
사진을 잘 보면 사이에 Hypervisor이라는 소프트웨어가 껴있습니다.
Hypervisor은 여러개의 가상 머신을 호스트 시스템에서 실행하고 관리하는 역할을 하고 있습니다.
또한, 시스템의 자원을 가상머신에 각각 할당하고, 각 가상머신들이 독립적으로 운영체제와 애플리케이션을 실행할 수 있도록 지원합니다.
즉, Hypervisor은 가상화를 지원하는 소프트웨어입니다.
하지만 일일이 가상머신에 OS를 설치해야한다는 단점이 존재합니다.
이를 어느정도 극복한 배포 방법은, 컨테이너 배포 방식입니다.
Container
컨테이너는 VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제를 공유하는 방식입니다.
이로 인해 컨테이너는 가볍고, 기본 인프라와의 종속성을 끊었기 때문에 클라우드나 OS배포판에 모두 이식이 가능합니다.
Kubernetes
이렇게 Container화 된 애플리케이션을 자동화하고 관리하기 위한 오픈소스 플랫폼이 Kubernetes라고 합니다.
kubernetes 구성요소
클러스터는 컨테이너화된 애플리케이션을 실행하는 노드라고 하는 노드의 집합을 뜻합니다.
이런 노드들을 워커 노드라고 부릅니다.
워커노드는 애플리케이션 컨테이너를 실행하고 관리하는 노드입니다.
이 노드들은 Kubernetes 클러스터의 일부로서 마스터 노드(컨트롤 플레인)의 지시를 받아 컨테이너를 시작,중지하고 네트워킹과 스토리지같은 다른 기능을 제공합니다.
마스터 노드(컨트롤 플레인)
마스터 노드라고 불리는 컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정을 수행하고, 클러스터 이벤트를 감지하고 반응합니다.
컨트롤 플레인 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작이 가능합니다.
하지만, 간결성을 위해 보통 동일 머신 상에 모든 컨트롤 플레인 컴포넌트를 구동시키고, 사용자 컨테이너는 해당 머신 상에 동작시키지 않습니다.
kube-apiserver
컨트롤 플레인 내부에 있는 kube-apiserver는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트 입니다.
수평적으로 확장되도록 디자인이 되어, 더 많은 인스턴스를 배포해서 확장할 수 있습니다.
etcd
모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 일관성, 고가용성 키-값 저장소입니다.
kube-scheduler
클러스터 내에서 애플리케이션 파드를 적절한 노드에 스케쥴링하는 역할을 합니다.
즉, 노드가 배정되지 않은 새로 생성된 파드를 감지하고, 실행할 노드를 선택하는 컨트롤 플레인 컴포넌트입니다.
이로 인해 클러스터의 자원활용과 고가용성을 보장합니다.
kube-controller-manager
컨트롤러 프로세서를 실핸하는 컨트롤 플레인 컴포넌트입니다.
논리적으로 각 컨트롤러는 분리된 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행됩니다.
- 노드 컨트롤러 : 노드가 다운되었을 때, 통지와 대응에 관한 책임을 가지게 됩니다..
- 잡 컨트롤러 : 일회성 작업을 나타내는 잡 오브젝트를 감시한 다음, 해당 작업을 완료할 때까지 동작하는 파드를 생성합니다.
- 서비스 어카운트 컨트롤러 : 새로운 네임스페이스에 대한 기본 서비스어카운트를 생성합니다.
cloud-controller-manger
클라우드별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트입니다.
클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호작용하는 컴포넌트 클러스터와만 상호작용을하는 컴포넌트를 구분짓게 해줍니다.
- 노드 컨트롤러 : 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것 입니다.
- 라우트 컨트롤러 : 기본 클라우드 인프라에 경로를 구성하는 것 입니다.
- 서비스 컨트롤러 : 클라우드 제공 사업자 로드벨런서를 생성 및 업데이트, 삭제하는 것 입니다.
노드 컴포넌트
동작중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하여 모든 노드상에서 동작합니다.
참고로 노드는 쿠버네티스에서 워커머신을 말합니다.
kubelet
클러스터의 각 노드에서 실행되는 에이전트입니다. 파드에서 컨테이너가 확실하게 동작하도록 관리합니다.
다양한 메커니즘을 통해 제공된 파드 스펙의 집합을 받아서, 컨테이너가 해당 파드 스펙에 따라 건강하게 동작하는 것을 확실히 합니다.
또한, 생성되지 않는 컨테이너는 관리하지 않습니다.
kube-proxy
클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부입니다.
노드의 네트워크 규칙을 관리합니다.
규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해줍니다.
또한 운영체제에 가용한 패킷 필터링 계층이 있는 경우 이를 사용하고, 그렇지 않으면 트래픽 자체를 포워드 합니다.
컨테이너 런타입
컨테이너 실행을 담당하는 소프트웨어 입니다.
이 외에도 애드온이 있습니다.