쿠버 네티스(kubernetes)란
쿠버네티스는 컨테이너화 된 워크로드와 서비스를 관리하기 위한 오픈소스 플랫폼이다.
컨테이너 오케스트레이션 중 하나로 컨테이너 오케스트레이션은 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화해준다.
- 컨테이너 오케스트레이션이란?
배포 방식에 따른 쿠버 네티스의 필요성 증가
Traditional Deployment(전통적인 배포):
배포 초기에는 애플리케이션을 실행하기 위해 회사 또는 배포자가 직접 물리 서버를 운영했다. 한 물리 서버에서 여러 애플리케이션의 리소스(자원) 한계를 컨트롤할 수 있는 방법이 없었기 때문에 리소스를 효과적으로 관리하지 못하였다. (예를 들면, 한 애플리케이션이 cpu 자원 90%을 써버리면 다른 애플리케이션은 어쩔 수 없이 성능이 저하된다.) 해결책으로 서로 다른 여러 물리 서버에 각 애플리케이션을 실행하는 방법이 있었지만 이는 컴퓨터 1대에 애플리케이션 1개를 실행한다는 뜻으로 확장성이 좋지 않으며, 매우 많은 물리 서버 유지 비용을 필요로 했다.
Virtualized Deployment(가상화된 배포):
전통적인 배포의 위와 같은 문제에 대한 해결책으로 가상화가 도입되었다. 가상화는 단일 물리 서버의 CPU에서 여러 가상 시스템(VM)을 실행 할 수 있게 한다. 가상화를 사용하면 VM 간에 애플리케이션을 격리할 수 있다. 이는 리소스를 할당하여 애플리케이션 별로 관리할 수 있는 장점이 있다. 즉, 가상화를 사용하면 물리 서버에서 리소스를 보다 효율적으로 관리할 수 있다.
각 VM은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성요소를 실행하는 하나의 완전한 머신이라고 할 수 있다.
Container deplyment(컨테이너):
컨테이너는 VM(가상화)와 유사하지만 격리 수준을 낮춰 애플리케이션간 서로 OS(운영체제)를 공유할 수 있게 해 준다. 때문에 컨테이너는 각각 OS를 갖고 있지 않고 Host의 os를 공유하는 방식으로 작동하며 보다 가볍게 다뤄진다. VM과 마찬가지로 컨테이너에는 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 모두 존재한다.
- 컨테이너는 다음과 같은 이유 때문에 사용된다.
- 기민한 애플리케이션 생성과 배포: VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적임.
- 지속적인 개발, 통합 및 배포: 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 효율적으로 롤백할 수 있다.
- 개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에 애플리케이션이 인프라스트럭처에서 분리된다.
- 가시성(observability): OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있다.
- 개발, 테스팅 및 운영 환경에 걸친 일관성: lap-top(desk-top)에서도 클라우드에서와 동일하게 구동된다.
- 클라우드 및 OS 배포판 간 이식성: Ubuntu, RHEL, CoreOS, 온-프레미스, 주요 퍼블릭 클라우드와 어디에서든 구동된다.
- 애플리케이션 중심 관리: 가상 하드웨어 상에서 OS를 실행하는 수준에서 논리적인 리소스를 사용하는 OS 상에서 애플리케이션을 실행하는 수준으로 추상화 수준이 높아진다.
- 자유로운 마이크로서비스: 애플리케이션은 단일 목적의 머신에서 모놀리식 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있다.
- 리소스 격리: 애플리케이션 성능을 예측할 수 있다.
- 자원 사용량: 리소스 사용량 (고효율 고집적 지향)
쿠버 네티스의 사용성
컨테이너는 애플리케이션을 포장하고 실행할 수 있는 좋은 방법이다. 프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너의 상태를 모니터링 또는 관리할 수 있어야 한다. 만약 컨테이너가 에러로 인해 다운되거나 잠시 작동을 중지시키고 재가동해야 할 때 쿠버 네티스가 쓰인다. 쿠버 네티스는 분산 시스템을 탄력적으로 실행할 수 있는 프레임 워크를 제공한다.
- 쿠버네티스가 제공하는 서비스 (영문 원문을 번역한 거라 문장이 매끄럽지 않다.)
- 서비스 디스커버리와 로드 밸런싱: 쿠버네티스는쿠버 네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버 네티스는 네트워크 트래픽을 로드밸런싱 하고 배포하여 배포가 안정적으로 이루어질 수 있다.
- 스토리지 오케스트레이션: 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다.
- 자동화된 롤아웃과 롤백: 쿠버네티스를쿠버 네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버 네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
- 자동화된 빈 패킹(bin packing): 컨테이너화된 작업을 실행하는 데 사용할 수 있는 쿠버 네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버 네티스에게 지시한다. 쿠버 네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
- 자동화된 복구(self-healing): 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
- 시크릿과 구성 관리: 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트할 수 있다.
쿠버네티스 컴포넌트(*이해하기*)
쿠버네티스를 배포하면 클러스터를 얻는다. 쿠버 네티스 클러스터는 컨테이너화 된 애플리케이션을 실행하는 노드(node)라고 하는 워커 머신의 집합으로 모든 클러스터는 최소 한 개의 워커 노드를 가진다.
워커 노드는 애플리케이션의 구성요소인 파드(pod)를 호스트한다. 컨트롤 플레인은 워커 노드와 클러스터 내 파드를 관리한다. 프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에 걸쳐 실행되고, 클러스터는 일반적으로 여러 노드를 실행하므로 내결함성과 고가용성이 제공된다.
컨트롤 플레인 컴포넌트 (마스터 노드 , Master node)
- 컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트(예를 들어, 디플로이먼트의 replicas 필드에 대한 요구 조건이 충족되지 않을 경우 새로운 파드를 구동시키는 것)를 감지하고 반응한다.
- 컨트롤 플레인 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작할 수 있다. 그러나 간결성을 위하여, 구성 스크립트는 보통 동일 머신 상에 모든 컨트롤 플레인 컴포넌트를 구동시키고, 사용자 컨테이너는 해당 머신 상에 동작시키지 않는다. 여러 VM에서 실행되는 컨트롤 플레인 설정의 예제를 보려면 kubeadm을 사용하여 고가용성 클러스터 만들기를 확인해본다.
kube-APIserver
-API 서버는 쿠버 네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. API 서버는 쿠버네티스 컨트롤 플레인의 프런트 엔드이다.
-쿠버 네티스 API 서버의 주요 구현은 kube-apiserver 이다. 즉 API 서버는 클러스터의 API를 사용할 수 있게 해주는 프로세스이다. kube-apiserver는 수평으로 확장되도록 디자인되었다. 즉, 더 많은 인스턴스를 배포해서 확장할 수 있다. 여러 kube-apiserver 인스턴스를 실행하고, 인스턴스 간의 트래픽을 균형 있게 조절할 수 있다.
etcd
-모든 클러스터 데이터를 담는 쿠버 네티스 뒷단의 저장소로 사용되는 일관성·고가용성 키-값 저장소.
쿠버네티스 클러스터에서 etcd를 뒷단의 저장소로 사용한다면, 이 데이터를 백업하는 계획은 필수이다.
kube-scheduler
- 새 파드를 만들 때 현재 클러스터 내에서 자원 할당이 가능한 노드들 중에서 알맞은 노드를 선택해 파드를 띄워준다.
- 스케줄러가 조건에 맞는 노드를 찾아주는 역할을 하여 필요한 하드웨어 요구 사항, 조건을 만족하는지, 특정 데이터가 있는 노드에 할당할 것인지 등의 다양한 설정을 수행할 수 있다.
- 스케줄러는 노드에 대해 충분한 리소스가 존재하도록 보장한다.
kube-controller-manager
- 구성 요소 복제본, 워커 노드 추적, 노드 장애 처리 등의 기능을 수행
- 여러 컨트롤러(controller)들이 파드를 관리한다. kube-controller-manager는 이런 각각의 컨트롤러들을 실행하는 역할을 한다.
- 노드 컨트롤러: 노드의 상태를 모니터링하고 다운된 노드의 상태 정보를 ConditionUnknown(40초)으로 업데이트하고 파드를 축출(5분)하기 시작한다. 즉 노드가 다운되었을 때 대응을 처리한다.
- 레플리케이션 컨트롤러: 알맞은 수의 파드들을 유지시켜준다.
- 엔드포인트 컨트롤러: 엔드포인트 오브젝트와 연결, 즉 서비스와 파드를 연결시킨다.
- 서비스 어카운트 & 토큰 컨트롤러: 네임스페이스에서 사용할 기본 계정과 API 접근 토큰을 생성한다.
cloud-controller-manager
클라우드 별 컨트롤 로직을 포함하는 쿠버 네티스컨트롤 플레인 컴포넌트이다. 클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있게 해 준다.
cloud-controller-manager는 클라우드 제공자 전용 컨트롤러만 실행한다. 자신의 사내 또는 PC 내부의 학습 환경에서 쿠버 네티스를 실행 중인 경우 클러스터에는 클라우드 컨트롤러 매니저가 없다.
kube-controller-manager와 마찬가지로 cloud-controller-manager는 논리적으로 독립적인 여러 컨트롤 루프를 단일 프로세스로 실행하는 단일 바이너리로 결합한다. 수평으로 확장(두 개 이상의 복제 실행)해서 성능을 향상하거나 장애를 견딜 수 있다.
다음 컨트롤러들은 클라우드 제공 사업자의 의존성을 가질 수 있다.
- 노드 컨트롤러: 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것
- 라우트 컨트롤러: 기본 클라우드 인프라에 경로를 구성하는 것
- 서비스 컨트롤러: 클라우드 제공 사업자 로드밸런서를 생성, 업데이트 그리고 삭제하는 것
노드 컴포넌트
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버 네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다.
kubelet
클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.
Kubelet은 다양한 메커니즘을 통해 제공된 파드 스펙(PodSpec)의 집합을 받아서 컨테이너가 해당 파드 스펙에 따라 건강하게 동작하는 것을 확실히 한다. Kubelet은 쿠버 네티스를 통해 생성되지 않는 컨테이너는 관리하지 않는다.
= 쉽게 말해서 파드에서 컨테이너가 동작하도록 관리해준다!
kube-proxy
kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프락시로, 쿠버 네티스의서비스 개념의 구현 부이다.
kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.
컨테이너 런타임
컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다. 쿠버 네티스는 여러 컨테이너 런타임을 지원한다.
(EX. 도커(Docker), containerd, CRI-O, Kubernetes CRI (컨테이너 런타임 인터페이스)를 구현한 모든 소프트웨어.)
애드온
애드온은 쿠버네티스 리소스(데몬 셋,디플로이먼트 등)를 이용하여 클러스터 기능을 구현한다. 이들은 클러스터 단위의 기능을 제공하기 때문에 애드온에 대한 네임스페이스 리소스는 kube-system 네임스페이스에 속한다.
DNS
여타 애드온들이 절대적으로 요구되지 않지만, 많은 예시에서 필요로 하기 때문에 모든 쿠버 네티스 클러스터는 클러스터 DNS를 갖추어야만 한다. 클러스터 DNS는 구성환경 내 다른 DNS 서버와 더불어, 쿠버네티스 서비스를 위해 DNS 레코드를 제공해주는 DNS 서버다. 쿠버 네티스에 의해 구동되는 컨테이너는 DNS 검색에서 이 DNS 서버를 자동으로 포함한다.
웹 UI (대시보드)
대시보드는 쿠버네티스 클러스터를 위한 범용의 웹 기반 UI다. 사용자가 클러스터 자체뿐만 아니라, 클러스터에서 동작하는 애플리케이션에 대한 관리와 문제 해결을 할 수 있도록 해준다.
컨테이너 리소스 모니터링
컨테이너 리소스 모니터링은 중앙 데이터베이스 내의 컨테이너들에 대한 포괄적인 시계열 매트릭스를 기록하고 그 데이터를 열람하기 위한 UI를 제공해 준다.
클러스터-레벨 로깅
클러스터-레벨 로깅 메커니즘은 검색/열람 인터페이스와 함께 중앙 로그 저장소에 컨테이너 로그를 저장하는 책임을 진다.
이번 포스팅에서는 쿠버네티스란 무엇이고 왜 사용하는가에 대한 기초적인 이유와
쿠버네티스의 작동원리 / 컴포넌트들에 대한 개념만 살짝 알아보았다.
다음 포스팅에서는 쿠버네티스 컴포넌트들에 대한 실습을 통해 각각의 컴포넌트 기능에대한 설명을 해보겠다.
댓글