Kubernetes는 컨테이너 오케스트레이션 시스템으로, 컨테이너화된 애플리케이션을 배포, 관리 및 확장하는 데 도움을 주는 오픈 소스 플랫폼이다.
Kubernetes의 구성 요소는 클러스터를 관리하고 컨테이너화된 애플리케이션을 실행하는 데 사용된다.
관리를 쉽게하기 위해 애플리케이션을 구성하는 컨테이너를 논리적 단위인 Pod로 그룹화한다.
온프레미스, 하이브리드 클라우드, 퍼블릭 클라우드와 같이 다양한 인프라 환경에서 사용할 수 있다.
쿠버네티스를 배포하게 되면 모든 노드는 하나의 클러스터로 이루어지며, 내결함성과 고가용성을 제공한다.
클러스터의 Kubernetes 주요 구성 요소는 많은 물리적 혹은 가상머신으로 구성되어 있으며, 각 머신은 마스터 또는 워커 노드로서 특수 기능을 수행한다.
제공 기능
서비스 디스커버리와 로드 밸런싱 :
- 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다.
- 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
스토리지 오케스트레이션 :
쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다.
자동화된 롤아웃과 롤백 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다.
예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
자동화된 빈 패킹(bin packing) :
- 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다.
- 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다.
- 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
- 이를 통해 낭비되는 자원을 최소화 할 수 있다.
자동화된 복구(self-healing) :
쿠버네티스는 장애가 생기는 컨테이너가 있는지 확인하기 위해 주기적으로 컨테이너를 진단한다.
정상적으로 작동하지 않는 컨테이너가 있으면 컨테이너를 다시 시작하거나 교체해 정상적으로 작동하게 한다.
시크릿과 구성 관리 :
- 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있다.
- 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트할 수 있다.
Auto Scaling
- 특정 컨테이너에 부하가 급격하게 발생할 경우, 자동으로 스케일 아웃하여 컨테이너를 늘려 부하를 분산시킬수 있다.
- 사용이 줄어 부하가 감소하게 되면 쿠버네티스는 다시 컨테이너를 이전 수준으로 줄여준다.
- 아래 구성 요소와 기능은 Kubernetes를 활용하여 컨테이너화된 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있게 해준다.
- Kubernetes를 사용하면 애플리케이션의 가용성, 확장성 및 관리 용이성을 향상시킬 수 있다.
1. Master node main components
- 마스터 노드는 쿠버네티스 클러스터를 관리하고 클러스터의 기능을 실행한다.
- 마스터 노드는 단일 혹은 여러대의 노드(3배수)로 생성할 수 있으며, 고가용성을 보장할 수 있는 여러 구성요소로 구성되어 있다.
etcd
- etcd는 Kubernetes 클러스터 데이터(pod, namespace, API & 서비스 세부 정보 및 클러스터와 관련된 것들)를 분산 key-value 쌍의 형태로 저장하는 간단한 쿠버네티스용 스토리지 시스템이다.
- 클러스터 구성 정보와 상태를 저장한다.
- API 서버를 통해서만 액세스할 수 있으며, 구성 변경과 관련된 클러스터에 대한 알림을 활성화하는데 사용한다.
- etcd는 마스터 노드 당 1개의 프로세스로 존재하며, 여러 개의 마스터 서버에 분산되어 실행해 안정성을 보장하도록 한다.
kube-apiserver
- 마스터 노드는 클러스터의 프론트엔드이며 클러스터를 제어하는데 사용되는 Kubernetes API 서버를 실행하며, pod, service 혹은 기타 변경 사항과 관련된 모든 요청은 API 서버애 의해 처리된다.
- 요약하자면, Kubernetes 클러스터와 상호 작용할 수 있는 API 서버로, 클러스터로 온 요청이 유효한지 검증하고, API 서버를 통해 다른 컴포넌트가 서로 필요한 모든 작업 요청을 받아들이고 처리한다.
- Kubernetes API 서버의 주요 구현은 kube-apiserver이다.
- kube-apiserver의 여러 인스턴스를 실행하고 해당 인스턴스 같의 트래픽의 균형을 맞출 수 있다.
kube-scheduler
- 클러스터에 있는 노드의 워크로드는 kube-sheduler에 의해 추적되고 처리된다.
- 파드 스케쥴링을 위한 정책에 따라 자원 소비를 기반으로 각 노드의 자원량에 따라 파드를 실행할 노드를 선택하는 역할을 한다.
kube-control-manager
kube-control-manager는 백그라운드에서 여러 컨트롤러 프로세스를 실행하여 원하는 클러스터 상태를 달성하기 위해 조정 루프를 사용하여 클러스터 상태를 관리하고 제어한다.
엔드포인트 컨트롤러 혹은 복제 컨트롤러와 같은 프로세스는 요청된 파드 수가 kubernetes 사용자의 사양에 따라 실행되도록 한다.
원하는 상태가 달성되지 않는 것을 발견하면, 지정된 상태를 달성하기 위해 조정 루프를 수행하며, 서비스 구성에 변화가 발생하면, 원하는 상태를 달성하기 위해 파드를 확장한다.
다양한 종류의 컨트롤러가 있으며, 논리적으로 각각의 별도 컨트롤러 프로세스이지만, 복잡성을 줄이기 위해 단일 바이너리로 컴파일되어 단일 프로세스에서 실행된다.
- 노드 컨트롤러 : 노드가 다운될 경우 이를 인지하고 대응할 책임이 있다.
- 작업 컨트롤러 : 일회성 작업을 나타내는 작업 개체를 보고 해당 작업을 완료하기 위해 파드를 생성한다.
- 엔드포인트 슬라이스 컨트롤러 : EndpointSlice 객체를 채운다.(서비스와 파드간의 링크를 제공)
- 서비스 계정 컨트롤러 : 새 네임스페이스에 대한 기본 서비스 계정 생성
2. Worker node main components
kubelet
- 컨테이너가 실행되고 건강한지 확인되는 컴포넌트이다.
- 워커 노드에서 실행되며, 마스터 노드와 통신하여 파드스펙(PodSpec) 설정을 주기적으로 전달 받아 컨테이너를 관리하고 실행한다.
- 파드의 상태를 주기적으로 체크(health check)하고 오류를 보고한다.
- 쿠버네티스를 통해 생성되지 않은 컨테이너는 관리하지 않는다.
kube-proxy
- 클러스터의 노드에서 실행되는 네트워크 프록시 서비스이며, 서비스의 네트워크 트래픽을 로드 밸런싱하고, 파드 간의 통신을 관리한다.
container runtime
- kubernetes가 컨테이너를 효과적으로 실행할 수 있도록 하는 기본 구성 요소이다.
- Kubernetes 환경 내에서 컨테이너의 실행과 생명 주기를 관리한다.
- EX) docker, containerd, CRI-O ETC
3. add-ons
DNS Add-on
- 파드에 DNS 이름을 할당하여 서비스 간에 이름 기반 통신을 가능하게 한다.
Dashboard
- 웹 기반 대시보드로 클러스터의 상태를 시각화하고 관리할 수 있다.
Ingress controller
- 클러스터 외부에서 내부로의 HTTP & HTTPS 트래픽을 관리하고 라우팅하는 역할을 한다.